From 2dddf6c135fd1bf97000c70e24f65ed6f4bd58d4 Mon Sep 17 00:00:00 2001 From: vldmkr Date: Fri, 9 Jun 2023 16:22:25 +0300 Subject: [PATCH 01/32] Blind signing optimization - Always inform about the blind signing, even if the option is activated in the settings. --- src/ui/display.c | 73 +++++++++++++++++++++++++++++------------------- 1 file changed, 44 insertions(+), 29 deletions(-) diff --git a/src/ui/display.c b/src/ui/display.c index c2d5866..07b6966 100644 --- a/src/ui/display.c +++ b/src/ui/display.c @@ -111,6 +111,7 @@ void ui_flow_display(const ux_flow_step_t *const *steps) { ux_flow_init(0, steps, NULL); } +// This function should always use UX_FLOW containing the blind signing warning! void ui_flow_verified_display(const ux_flow_step_t *const *steps) { if (N_storage.settings.allow_blind_signing) { ui_flow_display(steps); @@ -178,6 +179,14 @@ int ui_display_address() { return 0; } +// Step with icon and text +UX_STEP_NOCB(ux_display_blind_warn_step, + pnn, + { + &C_icon_warning, + "Blind", + "Signing", + }); // Step with icon and text UX_STEP_NOCB(ux_display_review_step, pnn, @@ -252,47 +261,53 @@ UX_STEP_NOCB(ux_display_gas_fee_step, }); // FLOW to display default transaction information: -// #1 screen : eye icon + "Review Transaction" -// #2 screen : display tx type -// #3 screen : display gas fee -// #4 screen : approve button -// #5 screen : reject button -UX_FLOW(ux_display_tx_default_flow, +// #1 screen : warning icon + "Blind Signing" +// #2 screen : eye icon + "Review Transaction" +// #3 screen : display tx type +// #4 screen : display gas fee +// #5 screen : approve button +// #6 screen : reject button +UX_FLOW(ux_display_blind_tx_default_flow, + &ux_display_blind_warn_step, &ux_display_review_step, &ux_display_tx_type_step, &ux_display_gas_fee_step, &ux_display_approve_step, &ux_display_reject_step); -// FLOW to display message information: +// SEQUENCE to display message information: // #1 screen : eye icon + "Review Message" // #2 screen : display message // #3 screen : approve button // #4 screen : reject button -UX_FLOW(ux_display_message_flow, - &ux_display_review_msg_step, - &ux_display_msg_step, - &ux_display_approve_step, - &ux_display_reject_step); +#define SEQUENCE_MESSAGE \ + &ux_display_review_msg_step, &ux_display_msg_step, &ux_display_approve_step, \ + &ux_display_reject_step +UX_FLOW(ux_display_message_flow, SEQUENCE_MESSAGE); +// preceding screen : warning icon + "Blind Signing" +UX_FLOW(ux_display_blind_message_flow, &ux_display_blind_warn_step, SEQUENCE_MESSAGE); // FLOW to display message information in short form: // #1 screen : eye icon + "Review Message" -// #2 screen : display message +// #2 screen : display short message // #3 screen : approve button // #4 screen : reject button -UX_FLOW(ux_display_short_message_flow, - &ux_display_review_msg_step, - &ux_display_short_msg_step, - &ux_display_approve_step, - &ux_display_reject_step); +#define SEQUENCE_SHORT_MESSAGE \ + &ux_display_review_msg_step, &ux_display_short_msg_step, &ux_display_approve_step, \ + &ux_display_reject_step +UX_FLOW(ux_display_short_message_flow, SEQUENCE_SHORT_MESSAGE); +// preceding screen : warning icon + "Blind Signing" +UX_FLOW(ux_display_blind_short_message_flow, &ux_display_blind_warn_step, SEQUENCE_SHORT_MESSAGE); // FLOW to display entry_function transaction information: -// #1 screen : eye icon + "Review Transaction" -// #2 screen : display function name -// #3 screen : display gas fee -// #4 screen : approve button -// #5 screen : reject button -UX_FLOW(ux_display_tx_entry_function_flow, +// #1 screen : warning icon + "Blind Signing" +// #2 screen : eye icon + "Review Transaction" +// #3 screen : display function name +// #4 screen : display gas fee +// #5 screen : approve button +// #6 screen : reject button +UX_FLOW(ux_display_blind_tx_entry_function_flow, + &ux_display_blind_warn_step, &ux_display_review_step, &ux_display_function_step, &ux_display_gas_fee_step, @@ -387,7 +402,7 @@ int ui_display_transaction() { snprintf(g_struct, sizeof(g_struct), "unknown data type"); } - ui_flow_verified_display(ux_display_tx_default_flow); + ui_flow_verified_display(ux_display_blind_tx_default_flow); return 0; } @@ -396,7 +411,7 @@ int ui_display_message() { if (N_storage.settings.show_full_message) { if (is_str_interrupted((const char *) G_context.tx_info.raw_tx, G_context.tx_info.raw_tx_len)) { - ui_flow_verified_display(ux_display_message_flow); + ui_flow_verified_display(ux_display_blind_message_flow); } else { ui_flow_display(ux_display_message_flow); } @@ -412,12 +427,12 @@ int ui_display_message() { if (short_enough) { if (is_str_interrupted(g_struct, sizeof(g_struct))) { - ui_flow_verified_display(ux_display_short_message_flow); + ui_flow_verified_display(ux_display_blind_short_message_flow); } else { ui_flow_display(ux_display_short_message_flow); } } else { - ui_flow_verified_display(ux_display_short_message_flow); + ui_flow_verified_display(ux_display_blind_short_message_flow); } } @@ -453,7 +468,7 @@ int ui_display_entry_function() { case FUNC_COIN_TRANSFER: return ui_display_tx_coin_transfer(); default: - ui_flow_verified_display(ux_display_tx_entry_function_flow); + ui_flow_verified_display(ux_display_blind_tx_entry_function_flow); break; } return 0; From 735cf6b1f9b5d2ba37cccde79bd23895993f3927 Mon Sep 17 00:00:00 2001 From: vldmkr Date: Sat, 10 Jun 2023 05:02:04 +0300 Subject: [PATCH 02/32] Blind signing optimization - Invite users to enable the blind signing setting during the signature request. - Minor refactoring. --- src/ui/action/extend.c | 27 +++++++++++++++++++++++++++ src/ui/action/extend.h | 12 ++++++++++++ src/ui/display.c | 16 +++++++++++++++- src/ui/display.h | 23 +++++++++++++++++++++++ src/ui/settings.c | 20 ++++++++++---------- src/ui/settings.h | 4 ++++ 6 files changed, 91 insertions(+), 11 deletions(-) create mode 100644 src/ui/action/extend.c create mode 100644 src/ui/action/extend.h diff --git a/src/ui/action/extend.c b/src/ui/action/extend.c new file mode 100644 index 0000000..3a55472 --- /dev/null +++ b/src/ui/action/extend.c @@ -0,0 +1,27 @@ +/***************************************************************************** + * Ledger App Aptos. + * (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 "extend.h" +#include "../settings.h" + +void ui_action_allow_blind_signing(const ux_flow_step_t *const *steps) { + settings_allow_blind_signing_change(1); + + // Passed UX_FLOW steps are expected to contain a blind signing warning on the first step. + // Skip it for better UX here. + ux_flow_init(0, steps, steps[1]); +} \ No newline at end of file diff --git a/src/ui/action/extend.h b/src/ui/action/extend.h new file mode 100644 index 0000000..6e68f45 --- /dev/null +++ b/src/ui/action/extend.h @@ -0,0 +1,12 @@ +#pragma once + +#include "ux.h" + +/** + * Action to allow blind signing in settings. + * + * @param[in] steps + * The sequence of the following steps + * + */ +void ui_action_allow_blind_signing(const ux_flow_step_t *const *steps); diff --git a/src/ui/display.c b/src/ui/display.c index 07b6966..3f5e9e3 100644 --- a/src/ui/display.c +++ b/src/ui/display.c @@ -29,6 +29,7 @@ #include "../sw.h" #include "../address.h" #include "action/validate.h" +#include "action/extend.h" #include "../transaction/types.h" #include "../common/bip32.h" #include "../common/format.h" @@ -36,6 +37,7 @@ #define DOTS "[...]" static action_validate_cb g_validate_callback; +static action_extend_ctx_t g_allow_blind_sign_ctx; static char g_amount[30]; static char g_gas_fee[30]; static char g_bip32_path[60]; @@ -99,23 +101,35 @@ UX_STEP_CB(ux_display_reject_step, &C_icon_crossmark, "Reject", }); +// Step with the button to change settings +UX_STEP_CB(ux_display_allow_blind_sign_step, + pnn, + { g_allow_blind_sign_ctx.call(g_allow_blind_sign_ctx.steps); }, + { + &C_icon_validate_14, + "Allow", + "Blind Signing", + }); // FLOW to display blind signing banner: // #1 screen : warning icon + "Blind signing must be enabled in Settings" // #2 screen : reject button UX_FLOW(ux_display_blind_sign_banner_flow, &ux_display_blind_sign_banner_step, + &ux_display_allow_blind_sign_step, &ux_display_reject_step); void ui_flow_display(const ux_flow_step_t *const *steps) { ux_flow_init(0, steps, NULL); } -// This function should always use UX_FLOW containing the blind signing warning! +// This function should always use UX_FLOW containing the blind signing warning on the first step! void ui_flow_verified_display(const ux_flow_step_t *const *steps) { if (N_storage.settings.allow_blind_signing) { ui_flow_display(steps); } else { + g_allow_blind_sign_ctx.call = &ui_action_allow_blind_signing; + g_allow_blind_sign_ctx.steps = steps; ui_flow_display(ux_display_blind_sign_banner_flow); } } diff --git a/src/ui/display.h b/src/ui/display.h index 6e9f699..96fd170 100644 --- a/src/ui/display.h +++ b/src/ui/display.h @@ -3,8 +3,18 @@ #include // bool #include "ux.h" +/** + * A convenient function for displaying the sequence of steps. + */ void ui_flow_display(const ux_flow_step_t *const *steps); +/** + * A function that allows you to check the blind signing permission before displaying the sequence + * of steps. + * + * NOTE: This function should always use UX_FLOW containing the blind signing warning on the first + * step! + */ void ui_flow_verified_display(const ux_flow_step_t *const *steps); /** @@ -12,6 +22,19 @@ void ui_flow_verified_display(const ux_flow_step_t *const *steps); */ typedef void (*action_validate_cb)(bool); +/** + * Callback to extend the active UX_FLOW. + */ +typedef void (*action_extend_cb)(const ux_flow_step_t *const *steps); + +/** + * Context to extend the active UX_FLOW. + */ +typedef struct action_extend_ctx_s { + action_extend_cb call; + const ux_flow_step_t *const *steps; +} action_extend_ctx_t; + /** * Display address on the device and ask confirmation to export. * diff --git a/src/ui/settings.c b/src/ui/settings.c index d5aaa6b..f1e8fc5 100644 --- a/src/ui/settings.c +++ b/src/ui/settings.c @@ -13,13 +13,9 @@ static const char* binary_choice_getter(unsigned int idx) { return NULL; } -static void show_full_message_change(uint8_t value) { - nvm_write((void*) &N_storage.settings.show_full_message, &value, sizeof(value)); -} - static void show_full_message_selector(unsigned int idx) { if (idx == 0 || idx == 1) { - show_full_message_change((uint8_t) idx); + settings_show_full_message_change((uint8_t) idx); } ux_menulist_init_select(0, settings_submenu_getter, @@ -27,13 +23,9 @@ static void show_full_message_selector(unsigned int idx) { MENU_SHOW_FULL_MSG); } -static void allow_blind_signing_change(uint8_t value) { - nvm_write((void*) &N_storage.settings.allow_blind_signing, &value, sizeof(value)); -} - static void allow_blind_signing_selector(unsigned int idx) { if (idx == 0 || idx == 1) { - allow_blind_signing_change((uint8_t) idx); + settings_allow_blind_signing_change((uint8_t) idx); } ux_menulist_init_select(0, settings_submenu_getter, @@ -72,3 +64,11 @@ void settings_submenu_selector(unsigned int idx) { ui_menu_main(); } } + +void settings_show_full_message_change(uint8_t value) { + nvm_write((void*) &N_storage.settings.show_full_message, &value, sizeof(value)); +} + +void settings_allow_blind_signing_change(uint8_t value) { + nvm_write((void*) &N_storage.settings.allow_blind_signing, &value, sizeof(value)); +} diff --git a/src/ui/settings.h b/src/ui/settings.h index 44c795c..ccd5535 100644 --- a/src/ui/settings.h +++ b/src/ui/settings.h @@ -5,3 +5,7 @@ enum menu_options { MENU_SHOW_FULL_MSG = 0, MENU_ALLOW_BLIND_SIGNING = 1 }; const char* settings_submenu_getter(unsigned int idx); void settings_submenu_selector(unsigned int idx); + +void settings_show_full_message_change(uint8_t value); + +void settings_allow_blind_signing_change(uint8_t value); From a1d0d2158ddc5232d8a6edbfe3f8adc3f0b94821 Mon Sep 17 00:00:00 2001 From: vldmkr Date: Sat, 10 Jun 2023 07:47:01 +0300 Subject: [PATCH 03/32] Upgrading to a newer version of the SDK --- .vscode/c_cpp_properties.json | 8 +- Makefile | 177 ++++++++---------- src/apdu/dispatcher.c | 5 +- src/apdu/dispatcher.h | 2 + src/apdu/parser.h | 22 --- src/{main.c => app_main.c} | 91 ++-------- src/bcs/decoder.h | 3 +- src/common/base58.c | 155 ---------------- src/common/base58.h | 52 ------ src/common/bip32.c | 87 --------- src/common/bip32.h | 47 ----- src/common/buffer.c | 165 ----------------- src/common/buffer.h | 192 -------------------- src/common/format.c | 168 ----------------- src/common/format.h | 86 --------- src/common/macros.h | 6 - src/common/read.c | 64 ------- src/common/read.h | 82 --------- src/{apdu/parser.c => common/user_format.c} | 31 ++-- src/common/user_format.h | 21 +++ src/common/varint.c | 101 ---------- src/common/varint.h | 52 ------ src/common/write.c | 64 ------- src/common/write.h | 82 --------- src/handler/get_app_name.c | 9 +- src/handler/get_public_key.c | 4 +- src/handler/get_public_key.h | 3 +- src/handler/get_version.c | 16 +- src/handler/sign_tx.c | 2 +- src/handler/sign_tx.h | 2 +- src/helper/send_reponse.c | 7 +- src/helper/send_response.h | 3 +- src/io.c | 162 ----------------- src/io.h | 63 ------- src/offsets.h | 26 --- src/transaction/deserialize.c | 4 +- src/transaction/deserialize.h | 3 +- src/types.h | 24 +-- src/ui/action/validate.c | 3 +- src/ui/display.c | 7 +- 40 files changed, 169 insertions(+), 1932 deletions(-) delete mode 100644 src/apdu/parser.h rename src/{main.c => app_main.c} (69%) delete mode 100644 src/common/base58.c delete mode 100644 src/common/base58.h delete mode 100644 src/common/bip32.c delete mode 100644 src/common/bip32.h delete mode 100644 src/common/buffer.c delete mode 100644 src/common/buffer.h delete mode 100644 src/common/format.c delete mode 100644 src/common/format.h delete mode 100644 src/common/macros.h delete mode 100644 src/common/read.c delete mode 100644 src/common/read.h rename src/{apdu/parser.c => common/user_format.c} (55%) create mode 100644 src/common/user_format.h delete mode 100644 src/common/varint.c delete mode 100644 src/common/varint.h delete mode 100644 src/common/write.c delete mode 100644 src/common/write.h delete mode 100644 src/io.c delete mode 100644 src/io.h delete mode 100644 src/offsets.h diff --git a/.vscode/c_cpp_properties.json b/.vscode/c_cpp_properties.json index 2234da8..8f5af08 100644 --- a/.vscode/c_cpp_properties.json +++ b/.vscode/c_cpp_properties.json @@ -1,6 +1,6 @@ { "env": { - "BOLOS_SDK": "/opt/nanosplus-secure-sdk", + "BOLOS_SDK": "/opt/ledger-secure-sdk", "BOLOS_ENV": "/opt/bolos-devenv" }, "configurations": [ @@ -11,7 +11,11 @@ "${workspaceFolder}/src", "${env:BOLOS_SDK}/include/*", "${env:BOLOS_SDK}/lib_ux/include/*", - "${env:BOLOS_SDK}/lib_cxng/include/*" + "${env:BOLOS_SDK}/lib_cxng/include/*", + "${env:BOLOS_SDK}/lib_bagl/include/*", + "${env:BOLOS_SDK}/lib_standard_app/*", + "${env:BOLOS_SDK}/target/nanos2/include", + "./build/nanos2/gen_src" ], "defines": [ "TARGET_NANOS", diff --git a/Makefile b/Makefile index f2f1e51..58b43ce 100644 --- a/Makefile +++ b/Makefile @@ -21,40 +21,9 @@ 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 += --path "44'/637'" -APP_LOAD_PARAMS += $(COMMON_LOAD_PARAMS) - -APPNAME = "Aptos" -APPVERSION_M = 0 -APPVERSION_N = 4 -APPVERSION_P = 17 -APPVERSION = "$(APPVERSION_M).$(APPVERSION_N).$(APPVERSION_P)" - -ifeq ($(TARGET_NAME),TARGET_NANOS) - ICONNAME=icons/nanos_app_aptos.gif -else - ICONNAME=icons/nanox_app_aptos.gif -endif - -all: default - -DEFINES += $(DEFINES_LIB) -DEFINES += APPNAME=\"$(APPNAME)\" -DEFINES += APPVERSION=\"$(APPVERSION)\" -DEFINES += MAJOR_VERSION=$(APPVERSION_M) MINOR_VERSION=$(APPVERSION_N) 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 +######################################## +# Aptos configuration # +######################################## ifeq ($(TARGET_NAME),TARGET_NANOS) DEFINES += MAX_TRANSACTION_PACKETS=6 @@ -66,76 +35,78 @@ ifeq ($(TARGET_NAME),TARGET_NANOX) DEFINES += MAX_TRANSACTION_PACKETS=90 endif -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 +######################################## +# Mandatory configuration # +######################################## +# Application name +APPNAME = "Aptos" -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 - -include $(BOLOS_SDK)/Makefile.glyphs +# Application version +APPVERSION_M = 0 +APPVERSION_N = 4 +APPVERSION_P = 17 +APPVERSION = "$(APPVERSION_M).$(APPVERSION_N).$(APPVERSION_P)" +# 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 - -load: all - 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) - -include $(BOLOS_SDK)/Makefile.rules - -dep/%.d: %.c Makefile -listvariants: - @echo VARIANTS COIN APTOS +# Application icons +ICON_NANOS = icons/nanos_app_aptos.gif +ICON_NANOX = icons/nanox_app_aptos.gif +ICON_NANOSP = icons/nanox_app_aptos.gif +ICON_STAX = icons/nanox_app_aptos.gif + +# Application allowed derivation curves +CURVE_APP_LOAD_PARAMS = ed25519 + +# Application allowed derivation paths +PATH_APP_LOAD_PARAMS = "44'/637'" + +# 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 = APTOS + +# 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 + +######################################## +# 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_STANDARD_BAGL_UX_FLOW = 1 + +include $(BOLOS_SDK)/Makefile.standard_app diff --git a/src/apdu/dispatcher.c b/src/apdu/dispatcher.c index 934cbbc..be49d6e 100644 --- a/src/apdu/dispatcher.c +++ b/src/apdu/dispatcher.c @@ -18,13 +18,14 @@ #include #include +#include "buffer.h" +#include "io.h" + #include "dispatcher.h" #include "../constants.h" #include "../globals.h" #include "../types.h" -#include "../io.h" #include "../sw.h" -#include "../common/buffer.h" #include "../handler/get_version.h" #include "../handler/get_app_name.h" #include "../handler/get_public_key.h" diff --git a/src/apdu/dispatcher.h b/src/apdu/dispatcher.h index 2847bb2..5eb297c 100644 --- a/src/apdu/dispatcher.h +++ b/src/apdu/dispatcher.h @@ -1,5 +1,7 @@ #pragma once +#include "parser.h" + #include "../types.h" /** diff --git a/src/apdu/parser.h b/src/apdu/parser.h deleted file mode 100644 index dfba3fd..0000000 --- a/src/apdu/parser.h +++ /dev/null @@ -1,22 +0,0 @@ -#pragma once - -#include // size_t -#include // uint*_t -#include // bool - -#include "../types.h" - -/** - * Parse APDU command from byte buffer. - * - * @param[out] cmd - * Structured APDU command (CLA, INS, P1, P2, Lc, Command data). - * @param[in] buf - * Byte buffer with raw APDU command. - * @param[in] buf_len - * Length of byte buffer. - * - * @return true if success, false otherwise. - * - */ -bool apdu_parser(command_t *cmd, uint8_t *buf, size_t buf_len); diff --git a/src/main.c b/src/app_main.c similarity index 69% rename from src/main.c rename to src/app_main.c index 87b3e60..7f0c724 100644 --- a/src/main.c +++ b/src/app_main.c @@ -26,15 +26,21 @@ #include "io.h" #include "sw.h" #include "ui/menu.h" -#include "apdu/parser.h" #include "apdu/dispatcher.h" -uint8_t G_io_seproxyhal_spi_buffer[IO_SEPROXYHAL_BUFFER_SIZE_B]; -ux_state_t G_ux; -bolos_ux_params_t G_ux_params; global_ctx_t G_context; const app_storage_t N_app_storage; +void nvm_app_storage_init() { + if (N_storage.initialized != 0x01) { + app_storage_t storage; + storage.settings.show_full_message = 0x00; + storage.settings.allow_blind_signing = 0x00; + storage.initialized = 0x01; + nvm_write((void *) &N_storage, (void *) &storage, sizeof(app_storage_t)); + } +} + /** * Handle APDU command received and send back APDU response using handlers. */ @@ -45,6 +51,8 @@ void app_main() { command_t cmd; io_init(); + nvm_app_storage_init(); + ui_menu_main(); // Reset context explicit_bzero(&G_context, sizeof(G_context)); @@ -96,78 +104,3 @@ void app_main() { } } } - -/** - * 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 nvm_app_storage_init() { - if (N_storage.initialized != 0x01) { - app_storage_t storage; - storage.settings.show_full_message = 0x00; - storage.settings.allow_blind_signing = 0x00; - storage.initialized = 0x01; - nvm_write((void *) &N_storage, (void *) &storage, sizeof(app_storage_t)); - } -} - -/** - * Main loop to setup USB, Bluetooth, UI and launch app_main(). - */ -__attribute__((section(".boot"))) int main() { - __asm volatile("cpsie i"); - - os_boot(); - - for (;;) { - // Reset UI - memset(&G_ux, 0, sizeof(G_ux)); - - BEGIN_TRY { - TRY { - io_seproxyhal_init(); - nvm_app_storage_init(); - -#ifdef TARGET_NANOX - G_io_app.plane_mode = os_setting_get(OS_SETTING_PLANEMODE, NULL, 0); -#endif // TARGET_NANOX - - USB_power(0); - USB_power(1); - - ui_menu_main(); - -#ifdef HAVE_BLE - BLE_power(0, NULL); - BLE_power(1, "Nano X"); -#endif // HAVE_BLE - app_main(); - } - CATCH(EXCEPTION_IO_RESET) { - CLOSE_TRY; - continue; - } - CATCH_ALL { - CLOSE_TRY; - break; - } - FINALLY { - } - } - END_TRY; - } - - app_exit(); - - return 0; -} diff --git a/src/bcs/decoder.h b/src/bcs/decoder.h index feb09d9..a1458d2 100644 --- a/src/bcs/decoder.h +++ b/src/bcs/decoder.h @@ -1,7 +1,8 @@ #pragma once +#include "buffer.h" + #include "types.h" -#include "../common/buffer.h" bool bcs_read_bool(buffer_t *buffer, bool *value); bool bcs_read_option_tag(buffer_t *buffer, bool *value); diff --git a/src/common/base58.c b/src/common/base58.c deleted file mode 100644 index 4c15dbd..0000000 --- a/src/common/base58.c +++ /dev/null @@ -1,155 +0,0 @@ -/***************************************************************************** - * (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 // size_t -#include // uint*_t -#include // memmove, memset -#include // bool - -#include "base58.h" - -uint8_t const BASE58_TABLE[] = { - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, // - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, // - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, // - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, // - 0xFF, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0xFF, 0xFF, // - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, // - 0x10, 0xFF, 0x11, 0x12, 0x13, 0x14, 0x15, 0xFF, 0x16, 0x17, 0x18, 0x19, // - 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, // - 0xFF, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, // - 0xFF, 0x2C, 0x2D, 0x2E, 0x2F, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, // - 0x37, 0x38, 0x39, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF // -}; - -char const BASE58_ALPHABET[] = { - '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', // - 'G', 'H', 'J', 'K', 'L', 'M', 'N', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', // - 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'm', // - 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z' // -}; - -int base58_decode(const char *in, size_t in_len, uint8_t *out, size_t out_len) { - uint8_t tmp[MAX_DEC_INPUT_SIZE] = {0}; - uint8_t buffer[MAX_DEC_INPUT_SIZE] = {0}; - uint8_t j; - uint8_t start_at; - uint8_t zero_count = 0; - - if (in_len > MAX_DEC_INPUT_SIZE || in_len < 2) { - return -1; - } - - memmove(tmp, in, in_len); - - for (uint8_t i = 0; i < in_len; i++) { - if (in[i] >= sizeof(BASE58_TABLE)) { - return -1; - } - - tmp[i] = BASE58_TABLE[(int) in[i]]; - - if (tmp[i] == 0xFF) { - return -1; - } - } - - while ((zero_count < in_len) && (tmp[zero_count] == 0)) { - ++zero_count; - } - - j = in_len; - start_at = zero_count; - while (start_at < in_len) { - uint16_t remainder = 0; - for (uint8_t div_loop = start_at; div_loop < in_len; div_loop++) { - uint16_t digit256 = (uint16_t)(tmp[div_loop] & 0xFF); - uint16_t tmp_div = remainder * 58 + digit256; - tmp[div_loop] = (uint8_t)(tmp_div / 256); - remainder = tmp_div % 256; - } - - if (tmp[start_at] == 0) { - ++start_at; - } - - buffer[--j] = (uint8_t) remainder; - } - - while ((j < in_len) && (buffer[j] == 0)) { - ++j; - } - - int length = in_len - (j - zero_count); - - if ((int) out_len < length) { - return -1; - } - - memmove(out, buffer + j - zero_count, length); - - return length; -} - -int base58_encode(const uint8_t *in, size_t in_len, char *out, size_t out_len) { - uint8_t buffer[MAX_ENC_INPUT_SIZE * 138 / 100 + 1] = {0}; - size_t i, j; - size_t stop_at; - size_t zero_count = 0; - size_t output_size; - - if (in_len > MAX_ENC_INPUT_SIZE) { - return -1; - } - - while ((zero_count < in_len) && (in[zero_count] == 0)) { - ++zero_count; - } - - output_size = (in_len - zero_count) * 138 / 100 + 1; - stop_at = output_size - 1; - for (size_t start_at = zero_count; start_at < in_len; start_at++) { - int carry = in[start_at]; - for (j = output_size - 1; (int) j >= 0; j--) { - carry += 256 * buffer[j]; - buffer[j] = carry % 58; - carry /= 58; - - if (j <= stop_at - 1 && carry == 0) { - break; - } - } - stop_at = j; - } - - j = 0; - while (j < output_size && buffer[j] == 0) { - j += 1; - } - - if (out_len < zero_count + output_size - j) { - return -1; - } - - memset(out, BASE58_ALPHABET[0], zero_count); - - i = zero_count; - while (j < output_size) { - out[i++] = BASE58_ALPHABET[buffer[j++]]; - } - - return i; -} diff --git a/src/common/base58.h b/src/common/base58.h deleted file mode 100644 index f214afd..0000000 --- a/src/common/base58.h +++ /dev/null @@ -1,52 +0,0 @@ -#pragma once - -#include // size_t -#include // uint*_t -#include // bool - -/** - * Maximum length of input when decoding in base 58. - */ -#define MAX_DEC_INPUT_SIZE 164 -/** - * Maximum length of input when encoding in base 58. - */ -#define MAX_ENC_INPUT_SIZE 120 - -/** - * Decode input string in base 58. - * - * @see https://tools.ietf.org/html/draft-msporny-base58-02 - * - * @param[in] in - * Pointer to input string buffer. - * @param[in] in_len - * Length of the input string buffer. - * @param[out] out - * Pointer to output byte buffer. - * @param[in] out_len - * Maximum length to write in output byte buffer. - * - * @return number of bytes decoded, -1 otherwise. - * - */ -int base58_decode(const char *in, size_t in_len, uint8_t *out, size_t out_len); - -/** - * Encode input bytes in base 58. - * - * @see https://tools.ietf.org/html/draft-msporny-base58-02 - * - * @param[in] in - * Pointer to input byte buffer. - * @param[in] in_len - * Length of the input byte buffer. - * @param[out] out - * Pointer to output string buffer. - * @param[in] out_len - * Maximum length to write in output byte buffer. - * - * @return number of bytes encoded, -1 otherwise. - * - */ -int base58_encode(const uint8_t *in, size_t in_len, char *out, size_t out_len); diff --git a/src/common/bip32.c b/src/common/bip32.c deleted file mode 100644 index a6ac6e5..0000000 --- a/src/common/bip32.c +++ /dev/null @@ -1,87 +0,0 @@ -/***************************************************************************** - * (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 // snprintf -#include // memset, strlen -#include // size_t -#include // uint*_t -#include // bool - -#include "bip32.h" -#include "read.h" - -bool bip32_path_read(const uint8_t *in, size_t in_len, uint32_t *out, size_t out_len) { - if (out_len == 0 || out_len > MAX_BIP32_PATH) { - return false; - } - - size_t offset = 0; - - for (size_t i = 0; i < out_len; i++) { - if (offset > in_len) { - return false; - } - out[i] = read_u32_be(in, offset); - offset += 4; - } - - return true; -} - -bool bip32_path_format(const uint32_t *bip32_path, - size_t bip32_path_len, - char *out, - size_t out_len) { - if (bip32_path_len == 0 || bip32_path_len > MAX_BIP32_PATH) { - return false; - } - - size_t offset = 0; - - for (uint16_t i = 0; i < bip32_path_len; i++) { - size_t written; - - snprintf(out + offset, out_len - offset, "%d", bip32_path[i] & 0x7FFFFFFFu); - written = strlen(out + offset); - if (written == 0 || written >= out_len - offset) { - memset(out, 0, out_len); - return false; - } - offset += written; - - if ((bip32_path[i] & 0x80000000u) != 0) { - snprintf(out + offset, out_len - offset, "'"); - written = strlen(out + offset); - if (written == 0 || written >= out_len - offset) { - memset(out, 0, out_len); - return false; - } - offset += written; - } - - if (i != bip32_path_len - 1) { - snprintf(out + offset, out_len - offset, "/"); - written = strlen(out + offset); - if (written == 0 || written >= out_len - offset) { - memset(out, 0, out_len); - return false; - } - offset += written; - } - } - - return true; -} diff --git a/src/common/bip32.h b/src/common/bip32.h deleted file mode 100644 index 3e2491e..0000000 --- a/src/common/bip32.h +++ /dev/null @@ -1,47 +0,0 @@ -#pragma once - -#include // size_t -#include // uint*_t -#include // bool - -/** - * Maximum length of BIP32 path allowed. - */ -#define MAX_BIP32_PATH 10 - -/** - * Read BIP32 path from byte buffer. - * - * @param[in] in - * Pointer to input byte buffer. - * @param[in] in_len - * Length of input byte buffer. - * @param[out] out - * Pointer to output 32-bit integer buffer. - * @param[in] out_len - * Number of BIP32 paths read in the output buffer. - * - * @return true if success, false otherwise. - * - */ -bool bip32_path_read(const uint8_t *in, size_t in_len, uint32_t *out, size_t out_len); - -/** - * Format BIP32 path as string. - * - * @param[in] bip32_path - * Pointer to 32-bit integer input buffer. - * @param[in] bip32_path_len - * Maximum number of BIP32 paths in the input buffer. - * @param[out] out string - * Pointer to output string. - * @param[in] out_len - * Length of the output string. - * - * @return true if success, false otherwise. - * - */ -bool bip32_path_format(const uint32_t *bip32_path, - size_t bip32_path_len, - char *out, - size_t out_len); diff --git a/src/common/buffer.c b/src/common/buffer.c deleted file mode 100644 index 3bd617b..0000000 --- a/src/common/buffer.c +++ /dev/null @@ -1,165 +0,0 @@ -/***************************************************************************** - * (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 // uint*_t -#include // size_t -#include // bool -#include // memmove - -#include "buffer.h" -#include "read.h" -#include "varint.h" -#include "bip32.h" - -bool buffer_can_read(const buffer_t *buffer, size_t n) { - return buffer->size - buffer->offset >= n; -} - -bool buffer_seek_set(buffer_t *buffer, size_t offset) { - if (offset > buffer->size) { - return false; - } - - buffer->offset = offset; - - return true; -} - -bool buffer_seek_cur(buffer_t *buffer, size_t offset) { - if (buffer->offset + offset < buffer->offset || // overflow - buffer->offset + offset > buffer->size) { // exceed buffer size - return false; - } - - buffer->offset += offset; - - return true; -} - -bool buffer_seek_end(buffer_t *buffer, size_t offset) { - if (offset > buffer->size) { - return false; - } - - buffer->offset = buffer->size - offset; - - return true; -} - -bool buffer_read_u8(buffer_t *buffer, uint8_t *value) { - if (!buffer_can_read(buffer, 1)) { - *value = 0; - - return false; - } - - *value = buffer->ptr[buffer->offset]; - buffer_seek_cur(buffer, 1); - - return true; -} - -bool buffer_read_u16(buffer_t *buffer, uint16_t *value, endianness_t endianness) { - if (!buffer_can_read(buffer, 2)) { - *value = 0; - - return false; - } - - *value = ((endianness == BE) ? read_u16_be(buffer->ptr, buffer->offset) - : read_u16_le(buffer->ptr, buffer->offset)); - - buffer_seek_cur(buffer, 2); - - return true; -} - -bool buffer_read_u32(buffer_t *buffer, uint32_t *value, endianness_t endianness) { - if (!buffer_can_read(buffer, 4)) { - *value = 0; - - return false; - } - - *value = ((endianness == BE) ? read_u32_be(buffer->ptr, buffer->offset) - : read_u32_le(buffer->ptr, buffer->offset)); - - buffer_seek_cur(buffer, 4); - - return true; -} - -bool buffer_read_u64(buffer_t *buffer, uint64_t *value, endianness_t endianness) { - if (!buffer_can_read(buffer, 8)) { - *value = 0; - - return false; - } - - *value = ((endianness == BE) ? read_u64_be(buffer->ptr, buffer->offset) - : read_u64_le(buffer->ptr, buffer->offset)); - - buffer_seek_cur(buffer, 8); - - return true; -} - -bool buffer_read_varint(buffer_t *buffer, uint64_t *value) { - int length = varint_read(buffer->ptr + buffer->offset, buffer->size - buffer->offset, value); - - if (length < 0) { - *value = 0; - - return false; - } - - buffer_seek_cur(buffer, (size_t) length); - - return true; -} - -bool buffer_read_bip32_path(buffer_t *buffer, uint32_t *out, size_t out_len) { - if (!bip32_path_read(buffer->ptr + buffer->offset, - buffer->size - buffer->offset, - out, - out_len)) { - return false; - } - - buffer_seek_cur(buffer, sizeof(*out) * out_len); - - return true; -} - -bool buffer_copy(const buffer_t *buffer, uint8_t *out, size_t out_len) { - if (buffer->size - buffer->offset > out_len) { - return false; - } - - memmove(out, buffer->ptr + buffer->offset, buffer->size - buffer->offset); - - return true; -} - -bool buffer_move(buffer_t *buffer, uint8_t *out, size_t out_len) { - if (!buffer_copy(buffer, out, out_len)) { - return false; - } - - buffer_seek_cur(buffer, out_len); - - return true; -} diff --git a/src/common/buffer.h b/src/common/buffer.h deleted file mode 100644 index ae3e829..0000000 --- a/src/common/buffer.h +++ /dev/null @@ -1,192 +0,0 @@ -#pragma once - -#include // uint*_t -#include // size_t -#include // bool - -/** - * Enumeration for endianness. - */ -typedef enum { - BE, /// Big Endian - LE /// Little Endian -} endianness_t; - -/** - * Struct for buffer with size and offset. - */ -typedef struct { - const uint8_t *ptr; /// Pointer to byte buffer - size_t size; /// Size of byte buffer - size_t offset; /// Offset in byte buffer -} buffer_t; - -/** - * Tell whether buffer can read bytes or not. - * - * @param[in] buffer - * Pointer to input buffer struct. - * @param[in] n - * Number of bytes to read in buffer. - * - * @return true if success, false otherwise. - * - */ -bool buffer_can_read(const buffer_t *buffer, size_t n); - -/** - * Seek the buffer to specific offset. - * - * @param[in,out] buffer - * Pointer to input buffer struct. - * @param[in] offset - * Specific offset to seek. - * - * @return true if success, false otherwise. - * - */ -bool buffer_seek_set(buffer_t *buffer, size_t offset); - -/** - * Seek buffer relatively to current offset. - * - * @param[in,out] buffer - * Pointer to input buffer struct. - * @param[in] offset - * Offset to seek relatively to `buffer->offset`. - * - * @return true if success, false otherwise. - * - */ -bool buffer_seek_cur(buffer_t *buffer, size_t offset); - -/** - * Seek the buffer relatively to the end. - * - * @param[in,out] buffer - * Pointer to input buffer struct. - * @param[in] offset - * Offset to seek relatively to `buffer->size`. - * - * @return true if success, false otherwise. - * - */ -bool buffer_seek_end(buffer_t *buffer, size_t offset); - -/** - * Read 1 byte from buffer into uint8_t. - * - * @param[in,out] buffer - * Pointer to input buffer struct. - * @param[out] value - * Pointer to 8-bit unsigned integer read from buffer. - * - * @return true if success, false otherwise. - * - */ -bool buffer_read_u8(buffer_t *buffer, uint8_t *value); - -/** - * Read 2 bytes from buffer into uint16_t. - * - * @param[in,out] buffer - * Pointer to input buffer struct. - * @param[out] value - * Pointer to 16-bit unsigned integer read from buffer. - * @param[in] endianness - * Either BE (Big Endian) or LE (Little Endian). - * - * @return true if success, false otherwise. - * - */ -bool buffer_read_u16(buffer_t *buffer, uint16_t *value, endianness_t endianness); - -/** - * Read 4 bytes from buffer into uint32_t. - * - * @param[in,out] buffer - * Pointer to input buffer struct. - * @param[out] value - * Pointer to 32-bit unsigned integer read from buffer. - * @param[in] endianness - * Either BE (Big Endian) or LE (Little Endian). - * - * @return true if success, false otherwise. - * - */ -bool buffer_read_u32(buffer_t *buffer, uint32_t *value, endianness_t endianness); - -/** - * Read 8 bytes from buffer into uint64_t. - * - * @param[in,out] buffer - * Pointer to input buffer struct. - * @param[out] value - * Pointer to 64-bit unsigned integer read from buffer. - * @param[in] endianness - * Either BE (Big Endian) or LE (Little Endian). - * - * @return true if success, false otherwise. - * - */ -bool buffer_read_u64(buffer_t *buffer, uint64_t *value, endianness_t endianness); - -/** - * Read Bitcoin-like varint from buffer into uint64_t. - * - * @see https://en.bitcoin.it/wiki/Protocol_documentation#Variable_length_integer - * - * @param[in,out] buffer - * Pointer to input buffer struct. - * @param[out] value - * Pointer to 64-bit unsigned integer read from buffer. - * - * @return true if success, false otherwise. - * - */ -bool buffer_read_varint(buffer_t *buffer, uint64_t *value); - -/** - * Read BIP32 path from buffer. - * - * @param[in,out] buffer - * Pointer to input buffer struct. - * @param[out] out - * Pointer to output 32-bit integer buffer. - * @param[in] out_len - * Number of BIP32 paths read in the output buffer. - * - * @return true if success, false otherwise. - * - */ -bool buffer_read_bip32_path(buffer_t *buffer, uint32_t *out, size_t out_len); - -/** - * Copy bytes from buffer without moving offset. - * - * @param[in] buffer - * Pointer to input buffer struct. - * @param[out] out - * Pointer to output byte buffer. - * @param[in] out_len - * Length of output byte buffer. - * - * @return true if success, false otherwise. - * - */ -bool buffer_copy(const buffer_t *buffer, uint8_t *out, size_t out_len); - -/** - * Move bytes from buffer. - * - * @param[in,out] buffer - * Pointer to input buffer struct. - * @param[out] out - * Pointer to output byte buffer. - * @param[in] out_len - * Length of output byte buffer. - * - * @return true if success, false otherwise. - * - */ -bool buffer_move(buffer_t *buffer, uint8_t *out, size_t out_len); diff --git a/src/common/format.c b/src/common/format.c deleted file mode 100644 index 4581907..0000000 --- a/src/common/format.c +++ /dev/null @@ -1,168 +0,0 @@ -/***************************************************************************** - * (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 // size_t -#include // int*_t, uint*_t -#include // strncpy, memmove -#include // bool - -#include "format.h" - -bool format_i64(char *dst, size_t dst_len, const int64_t value) { - char temp[] = "-9223372036854775808"; - - char *ptr = temp; - int64_t num = value; - int sign = 1; - - if (value < 0) { - sign = -1; - } - - while (num != 0) { - *ptr++ = '0' + (num % 10) * sign; - num /= 10; - } - - if (value < 0) { - *ptr++ = '-'; - } else if (value == 0) { - *ptr++ = '0'; - } - - int distance = (ptr - temp) + 1; - - if ((int) dst_len < distance) { - return false; - } - - size_t index = 0; - - while (--ptr >= temp) { - dst[index++] = *ptr; - } - - dst[index] = '\0'; - - return true; -} - -bool format_u64(char *out, size_t outLen, uint64_t in) { - uint8_t i = 0; - - if (outLen == 0) { - return false; - } - outLen--; - - while (in > 9) { - out[i] = in % 10 + '0'; - in /= 10; - i++; - if (i + 1 > outLen) { - return false; - } - } - out[i] = in + '0'; - out[i + 1] = '\0'; - - uint8_t j = 0; - char tmp; - - // revert the string - while (j < i) { - // swap out[j] and out[i] - tmp = out[j]; - out[j] = out[i]; - out[i] = tmp; - - i--; - j++; - } - return true; -} - -bool format_fpu64(char *dst, size_t dst_len, const uint64_t value, uint8_t decimals) { - char buffer[21] = {0}; - - if (!format_u64(buffer, sizeof(buffer), value)) { - return false; - } - - size_t digits = strlen(buffer); - - if (digits <= decimals) { - if (dst_len <= 2 + decimals - digits) { - return false; - } - *dst++ = '0'; - *dst++ = '.'; - for (uint16_t i = 0; i < decimals - digits; i++, dst++) { - *dst = '0'; - } - dst_len -= 2 + decimals - digits; - strncpy(dst, buffer, dst_len); - } else { - if (dst_len <= digits + 1 + decimals) { - return false; - } - - const size_t shift = digits - decimals; - memmove(dst, buffer, shift); - dst[shift] = '.'; - strncpy(dst + shift + 1, buffer + shift, decimals); - } - - return true; -} - -int 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; -} - -int format_prefixed_hex(const uint8_t *in, size_t in_len, char *out, size_t out_len) { - const char prefix[] = "0x"; - const size_t prefix_len = sizeof(prefix) - 1; - - if (out_len < sizeof(prefix)) { - return -1; - } - strncpy(out, prefix, sizeof(prefix)); - return format_hex(in, in_len, out + prefix_len, out_len - prefix_len); -} \ No newline at end of file diff --git a/src/common/format.h b/src/common/format.h deleted file mode 100644 index 1c07386..0000000 --- a/src/common/format.h +++ /dev/null @@ -1,86 +0,0 @@ -#pragma once - -#include // size_t -#include // int*_t, uint*_t -#include // bool - -/** - * Format 64-bit signed integer as string. - * - * @param[out] dst - * Pointer to output string. - * @param[in] dst_len - * Length of output string. - * @param[in] value - * 64-bit signed integer to format. - * - * @return true if success, false otherwise. - * - */ -bool format_i64(char *dst, size_t dst_len, const int64_t value); - -/** - * Format 64-bit unsigned integer as string. - * - * @param[out] dst - * Pointer to output string. - * @param[in] dst_len - * Length of output string. - * @param[in] value - * 64-bit unsigned integer to format. - * - * @return true if success, false otherwise. - * - */ -bool format_u64(char *dst, size_t dst_len, uint64_t value); - -/** - * Format 64-bit unsigned integer as string with decimals. - * - * @param[out] dst - * Pointer to output string. - * @param[in] dst_len - * Length of output string. - * @param[in] value - * 64-bit unsigned integer to format. - * @param[in] decimals - * Number of digits after decimal separator. - * - * @return true if success, false otherwise. - * - */ -bool format_fpu64(char *dst, size_t dst_len, const uint64_t value, uint8_t decimals); - -/** - * Format byte buffer to uppercase hexadecimal string. - * - * @param[in] in - * Pointer to input byte buffer. - * @param[in] in_len - * Length of input byte buffer. - * @param[out] out - * Pointer to output string. - * @param[in] out_len - * Length of output string. - * - * @return number of bytes written if success, -1 otherwise. - * - */ -int format_hex(const uint8_t *in, size_t in_len, char *out, size_t out_len); - -/** - * Format byte buffer to uppercase hexadecimal string prefixed with '0x'. - * - * @param[in] in - * Pointer to input byte buffer. - * @param[in] in_len - * Length of input byte buffer. - * @param[out] out - * Pointer to output string. - * @param[in] out_len - * Length of output string. - * - * @return number of bytes written if success, -1 otherwise. - * - */ -int format_prefixed_hex(const uint8_t *in, size_t in_len, char *out, size_t out_len); diff --git a/src/common/macros.h b/src/common/macros.h deleted file mode 100644 index 13f75a3..0000000 --- a/src/common/macros.h +++ /dev/null @@ -1,6 +0,0 @@ -#pragma once - -/** - * Macro for the size of a specific structure field. - */ -#define MEMBER_SIZE(type, member) (sizeof(((type *) 0)->member)) diff --git a/src/common/read.c b/src/common/read.c deleted file mode 100644 index c8ee851..0000000 --- a/src/common/read.c +++ /dev/null @@ -1,64 +0,0 @@ -/***************************************************************************** - * (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 // uint*_t -#include // size_t - -uint16_t read_u16_be(const uint8_t *ptr, size_t offset) { - return (uint16_t) ptr[offset + 0] << 8 | // - (uint16_t) ptr[offset + 1] << 0; -} - -uint32_t read_u32_be(const uint8_t *ptr, size_t offset) { - return (uint32_t) ptr[offset + 0] << 24 | // - (uint32_t) ptr[offset + 1] << 16 | // - (uint32_t) ptr[offset + 2] << 8 | // - (uint32_t) ptr[offset + 3] << 0; -} - -uint64_t read_u64_be(const uint8_t *ptr, size_t offset) { - return (uint64_t) ptr[offset + 0] << 56 | // - (uint64_t) ptr[offset + 1] << 48 | // - (uint64_t) ptr[offset + 2] << 40 | // - (uint64_t) ptr[offset + 3] << 32 | // - (uint64_t) ptr[offset + 4] << 24 | // - (uint64_t) ptr[offset + 5] << 16 | // - (uint64_t) ptr[offset + 6] << 8 | // - (uint64_t) ptr[offset + 7] << 0; -} - -uint16_t read_u16_le(const uint8_t *ptr, size_t offset) { - return (uint16_t) ptr[offset + 0] << 0 | // - (uint16_t) ptr[offset + 1] << 8; -} - -uint32_t read_u32_le(const uint8_t *ptr, size_t offset) { - return (uint32_t) ptr[offset + 0] << 0 | // - (uint32_t) ptr[offset + 1] << 8 | // - (uint32_t) ptr[offset + 2] << 16 | // - (uint32_t) ptr[offset + 3] << 24; -} - -uint64_t read_u64_le(const uint8_t *ptr, size_t offset) { - return (uint64_t) ptr[offset + 0] << 0 | // - (uint64_t) ptr[offset + 1] << 8 | // - (uint64_t) ptr[offset + 2] << 16 | // - (uint64_t) ptr[offset + 3] << 24 | // - (uint64_t) ptr[offset + 4] << 32 | // - (uint64_t) ptr[offset + 5] << 40 | // - (uint64_t) ptr[offset + 6] << 48 | // - (uint64_t) ptr[offset + 7] << 56; -} diff --git a/src/common/read.h b/src/common/read.h deleted file mode 100644 index 61cfa8c..0000000 --- a/src/common/read.h +++ /dev/null @@ -1,82 +0,0 @@ -#pragma once - -#include // uint*_t -#include // size_t - -/** - * Read 2 bytes as Big Endian from byte buffer. - * - * @param[in] ptr - * Pointer to byte buffer. - * @param[in] offset - * Offset in the byte buffer. - * - * @return 2 bytes value read from buffer. - * - */ -uint16_t read_u16_be(const uint8_t *ptr, size_t offset); - -/** - * Read 4 bytes as Big Endian from byte buffer. - * - * @param[in] ptr - * Pointer to byte buffer. - * @param[in] offset - * Offset in the byte buffer. - * - * @return 4 bytes value read from buffer. - * - */ -uint32_t read_u32_be(const uint8_t *ptr, size_t offset); - -/** - * Read 8 bytes as Big Endian from byte buffer. - * - * @param[in] ptr - * Pointer to byte buffer. - * @param[in] offset - * Offset in the byte buffer. - * - * @return 8 bytes value read from buffer. - * - */ -uint64_t read_u64_be(const uint8_t *ptr, size_t offset); - -/** - * Read 2 bytes as Little Endian from byte buffer. - * - * @param[in] ptr - * Pointer to byte buffer. - * @param[in] offset - * Offset in the byte buffer. - * - * @return 2 bytes value read from buffer. - * - */ -uint16_t read_u16_le(const uint8_t *ptr, size_t offset); - -/** - * Read 4 bytes as Little Endian from byte buffer. - * - * @param[in] ptr - * Pointer to byte buffer. - * @param[in] offset - * Offset in the byte buffer. - * - * @return 4 bytes value read from buffer. - * - */ -uint32_t read_u32_le(const uint8_t *ptr, size_t offset); - -/** - * Read 8 bytes as Little Endian from byte buffer. - * - * @param[in] ptr - * Pointer to byte buffer. - * @param[in] offset - * Offset in the byte buffer. - * - * @return 8 bytes value read from buffer. - * - */ -uint64_t read_u64_le(const uint8_t *ptr, size_t offset); diff --git a/src/apdu/parser.c b/src/common/user_format.c similarity index 55% rename from src/apdu/parser.c rename to src/common/user_format.c index fad86ef..848475f 100644 --- a/src/apdu/parser.c +++ b/src/common/user_format.c @@ -15,26 +15,21 @@ * limitations under the License. *****************************************************************************/ -#include // size_t -#include // uint*_t -#include // bool +#include // size_t +#include // int*_t, uint*_t +#include // strncpy, memmove -#include "parser.h" -#include "../types.h" -#include "../offsets.h" +#include "format.h" -bool apdu_parser(command_t *cmd, uint8_t *buf, size_t buf_len) { - // Check minimum length and Lc field of APDU command - if (buf_len < OFFSET_CDATA || buf_len - OFFSET_CDATA != buf[OFFSET_LC]) { - return false; - } +#include "user_format.h" - cmd->cla = buf[OFFSET_CLA]; - cmd->ins = (command_e) buf[OFFSET_INS]; - cmd->p1 = buf[OFFSET_P1]; - cmd->p2 = buf[OFFSET_P2]; - cmd->lc = buf[OFFSET_LC]; - cmd->data = (buf[OFFSET_LC] > 0) ? buf + OFFSET_CDATA : NULL; +int format_prefixed_hex(const uint8_t *in, size_t in_len, char *out, size_t out_len) { + const char prefix[] = "0x"; + const size_t prefix_len = sizeof(prefix) - 1; - return true; + if (out_len < sizeof(prefix)) { + return -1; + } + strncpy(out, prefix, sizeof(prefix)); + return format_hex(in, in_len, out + prefix_len, out_len - prefix_len); } diff --git a/src/common/user_format.h b/src/common/user_format.h new file mode 100644 index 0000000..1857462 --- /dev/null +++ b/src/common/user_format.h @@ -0,0 +1,21 @@ +#pragma once + +#include // size_t +#include // int*_t, uint*_t + +/** + * Format byte buffer to uppercase hexadecimal string prefixed with '0x'. + * + * @param[in] in + * Pointer to input byte buffer. + * @param[in] in_len + * Length of input byte buffer. + * @param[out] out + * Pointer to output string. + * @param[in] out_len + * Length of output string. + * + * @return number of bytes written if success, -1 otherwise. + * + */ +int format_prefixed_hex(const uint8_t *in, size_t in_len, char *out, size_t out_len); diff --git a/src/common/varint.c b/src/common/varint.c deleted file mode 100644 index d04fbb2..0000000 --- a/src/common/varint.c +++ /dev/null @@ -1,101 +0,0 @@ -/***************************************************************************** - * (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 // uint*_t -#include // size_t -#include // bool - -#include "varint.h" -#include "write.h" -#include "read.h" - -uint8_t varint_size(uint64_t value) { - if (value <= 0xFC) { - return 1; - } - - if (value <= UINT16_MAX) { - return 3; - } - - if (value <= UINT32_MAX) { - return 5; - } - - return 9; // <= UINT64_MAX -} - -int varint_read(const uint8_t *in, size_t in_len, uint64_t *value) { - if (in_len < 1) { - return -1; - } - - uint8_t prefix = in[0]; - - if (prefix == 0xFD) { - if (in_len < 3) { - return -1; - } - *value = (uint64_t) read_u16_le(in, 1); - return 3; - } - - if (prefix == 0xFE) { - if (in_len < 5) { - return -1; - } - *value = (uint64_t) read_u32_le(in, 1); - return 5; - } - - if (prefix == 0xFF) { - if (in_len < 9) { - return -1; - } - *value = (uint64_t) read_u64_le(in, 1); - return 9; - } - - *value = (uint64_t) prefix; // prefix <= 0xFC - - return 1; -} - -int varint_write(uint8_t *out, size_t offset, uint64_t value) { - uint8_t varint_len = varint_size(value); - - switch (varint_len) { - case 1: - out[offset] = (uint8_t) value; - break; - case 3: - out[offset++] = 0xFD; - write_u16_le(out, offset, (uint16_t) value); - break; - case 5: - out[offset++] = 0xFE; - write_u32_le(out, offset, (uint32_t) value); - break; - case 9: - out[offset++] = 0xFF; - write_u64_le(out, offset, (uint64_t) value); - break; - default: - return -1; - } - - return varint_len; -} diff --git a/src/common/varint.h b/src/common/varint.h deleted file mode 100644 index 80aeb43..0000000 --- a/src/common/varint.h +++ /dev/null @@ -1,52 +0,0 @@ -#pragma once - -#include // uint*_t -#include // size_t -#include // bool - -/** - * Size of value represented as Bitcoin-like varint. - * - * @see https://en.bitcoin.it/wiki/Protocol_documentation#Variable_length_integer - * - * @param[in] value - * 64-bit unsigned integer to compute varint size. - * - * @return number of bytes to write value as varint (1, 3, 5 or 9 bytes). - * - */ -uint8_t varint_size(uint64_t value); - -/** - * Read Bitcoin-like varint from byte buffer. - * - * @see https://en.bitcoin.it/wiki/Protocol_documentation#Variable_length_integer - * - * @param[in] in - * Pointer to input byte buffer. - * @param[in] in_len - * Length of the input byte buffer. - * @param[out] value - * Pointer to 64-bit unsigned integer to output varint. - * - * @return number of bytes read (1, 3, 5 or 9 bytes), -1 otherwise. - * - */ -int varint_read(const uint8_t *in, size_t in_len, uint64_t *value); - -/** - * Write Bitcoin-like varint to byte buffer. - * - * @see https://en.bitcoin.it/wiki/Protocol_documentation#Variable_length_integer - * - * @param[out] out - * Pointer to output byte buffer. - * @param[in] offset - * Offset in the output byte buffer. - * @param[in] value - * 64-bit unsigned integer to write as varint. - * - * @return number of bytes written (1, 3, 5 or 9 bytes), -1 otherwise. - * - */ -int varint_write(uint8_t *out, size_t offset, uint64_t value); diff --git a/src/common/write.c b/src/common/write.c deleted file mode 100644 index 90ec141..0000000 --- a/src/common/write.c +++ /dev/null @@ -1,64 +0,0 @@ -/***************************************************************************** - * (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 // uint*_t -#include // size_t - -void write_u16_be(uint8_t *ptr, size_t offset, uint16_t value) { - ptr[offset + 0] = (uint8_t)(value >> 8); - ptr[offset + 1] = (uint8_t)(value >> 0); -} - -void write_u32_be(uint8_t *ptr, size_t offset, uint32_t value) { - ptr[offset + 0] = (uint8_t)(value >> 24); - ptr[offset + 1] = (uint8_t)(value >> 16); - ptr[offset + 2] = (uint8_t)(value >> 8); - ptr[offset + 3] = (uint8_t)(value >> 0); -} - -void write_u64_be(uint8_t *ptr, size_t offset, uint64_t value) { - ptr[offset + 0] = (uint8_t)(value >> 56); - ptr[offset + 1] = (uint8_t)(value >> 48); - ptr[offset + 2] = (uint8_t)(value >> 40); - ptr[offset + 3] = (uint8_t)(value >> 32); - ptr[offset + 4] = (uint8_t)(value >> 24); - ptr[offset + 5] = (uint8_t)(value >> 16); - ptr[offset + 6] = (uint8_t)(value >> 8); - ptr[offset + 7] = (uint8_t)(value >> 0); -} - -void write_u16_le(uint8_t *ptr, size_t offset, uint16_t value) { - ptr[offset + 0] = (uint8_t)(value >> 0); - ptr[offset + 1] = (uint8_t)(value >> 8); -} - -void write_u32_le(uint8_t *ptr, size_t offset, uint32_t value) { - ptr[offset + 0] = (uint8_t)(value >> 0); - ptr[offset + 1] = (uint8_t)(value >> 8); - ptr[offset + 2] = (uint8_t)(value >> 16); - ptr[offset + 3] = (uint8_t)(value >> 24); -} - -void write_u64_le(uint8_t *ptr, size_t offset, uint64_t value) { - ptr[offset + 0] = (uint8_t)(value >> 0); - ptr[offset + 1] = (uint8_t)(value >> 8); - ptr[offset + 2] = (uint8_t)(value >> 16); - ptr[offset + 3] = (uint8_t)(value >> 24); - ptr[offset + 4] = (uint8_t)(value >> 32); - ptr[offset + 5] = (uint8_t)(value >> 40); - ptr[offset + 6] = (uint8_t)(value >> 48); - ptr[offset + 7] = (uint8_t)(value >> 56); -} diff --git a/src/common/write.h b/src/common/write.h deleted file mode 100644 index 0418f5c..0000000 --- a/src/common/write.h +++ /dev/null @@ -1,82 +0,0 @@ -#pragma once - -#include // uint*_t -#include // size_t - -/** - * Write 16-bit unsigned integer value as Big Endian. - * - * @param[out] ptr - * Pointer to output byte buffer. - * @param[in] offset - * Offset in the output byte buffer. - * @param[in] value - * 16-bit unsigned integer to write in output byte buffer as Big Endian. - * - */ -void write_u16_be(const uint8_t *ptr, size_t offset, uint16_t value); - -/** - * Write 32-bit unsigned integer value as Big Endian. - * - * @param[out] ptr - * Pointer to output byte buffer. - * @param[in] offset - * Offset in the output byte buffer. - * @param[in] value - * 32-bit unsigned integer to write in output byte buffer as Big Endian. - * - */ -void write_u32_be(uint8_t *ptr, size_t offset, uint32_t value); - -/** - * Write 64-bit unsigned integer value as Big Endian. - * - * @param[out] ptr - * Pointer to output byte buffer. - * @param[in] offset - * Offset in the output byte buffer. - * @param[in] value - * 64-bit unsigned integer to write in output byte buffer as Big Endian. - * - */ -void write_u64_be(uint8_t *ptr, size_t offset, uint64_t value); - -/** - * Write 16-bit unsigned integer value as Little Endian. - * - * @param[out] ptr - * Pointer to output byte buffer. - * @param[in] offset - * Offset in the output byte buffer. - * @param[in] value - * 16-bit unsigned integer to write in output byte buffer as Little Endian. - * - */ -void write_u16_le(uint8_t *ptr, size_t offset, uint16_t value); - -/** - * Write 32-bit unsigned integer value as Little Endian. - * - * @param[out] ptr - * Pointer to output byte buffer. - * @param[in] offset - * Offset in the output byte buffer. - * @param[in] value - * 32-bit unsigned integer to write in output byte buffer as Little Endian. - * - */ -void write_u32_le(uint8_t *ptr, size_t offset, uint32_t value); - -/** - * Write 64-bit unsigned integer value as Little Endian. - * - * @param[out] ptr - * Pointer to output byte buffer. - * @param[in] offset - * Offset in the output byte buffer. - * @param[in] value - * 64-bit unsigned integer to write in output byte buffer as Little Endian. - * - */ -void write_u64_le(uint8_t *ptr, size_t offset, uint64_t value); diff --git a/src/handler/get_app_name.c b/src/handler/get_app_name.c index 95383aa..a2e3873 100644 --- a/src/handler/get_app_name.c +++ b/src/handler/get_app_name.c @@ -17,18 +17,17 @@ #include // uint*_t +#include "io.h" +#include "buffer.h" + #include "get_app_name.h" #include "../constants.h" #include "../globals.h" -#include "../io.h" #include "../sw.h" #include "../types.h" -#include "common/buffer.h" int handler_get_app_name() { _Static_assert(APPNAME_LEN < MAX_APPNAME_LEN, "APPNAME must be at most 64 characters!"); - buffer_t rdata = {.ptr = (uint8_t *) PIC(APPNAME), .size = APPNAME_LEN, .offset = 0}; - - return io_send_response(&rdata, SW_OK); + return io_send_response_pointer(PIC(APPNAME), APPNAME_LEN, SW_OK); } diff --git a/src/handler/get_public_key.c b/src/handler/get_public_key.c index 51c1d32..5610d9c 100644 --- a/src/handler/get_public_key.c +++ b/src/handler/get_public_key.c @@ -22,14 +22,14 @@ #include "os.h" #include "cx.h" +#include "io.h" +#include "buffer.h" #include "get_public_key.h" #include "../globals.h" #include "../types.h" -#include "../io.h" #include "../sw.h" #include "../crypto.h" -#include "../common/buffer.h" #include "../ui/display.h" #include "../helper/send_response.h" diff --git a/src/handler/get_public_key.h b/src/handler/get_public_key.h index e0ff0d9..3cb538a 100644 --- a/src/handler/get_public_key.h +++ b/src/handler/get_public_key.h @@ -4,8 +4,9 @@ #include // bool #include // uint*_t +#include "buffer.h" + #include "../types.h" -#include "../common/buffer.h" /** * Handler for GET_PUBLIC_KEY command. If successfully parse BIP32 path, diff --git a/src/handler/get_version.c b/src/handler/get_version.c index cb9700a..dc4f76a 100644 --- a/src/handler/get_version.c +++ b/src/handler/get_version.c @@ -19,13 +19,14 @@ #include // UINT8_MAX #include // _Static_assert +#include "io.h" +#include "buffer.h" + #include "get_version.h" #include "../globals.h" #include "../constants.h" -#include "../io.h" #include "../sw.h" #include "../types.h" -#include "common/buffer.h" int handler_get_version() { _Static_assert(APPVERSION_LEN == 3, "Length of (MAJOR || MINOR || PATCH) must be 3!"); @@ -36,11 +37,10 @@ int handler_get_version() { _Static_assert(PATCH_VERSION >= 0 && PATCH_VERSION <= UINT8_MAX, "PATCH version must be between 0 and 255!"); - return io_send_response( - &(const buffer_t){.ptr = (uint8_t[APPVERSION_LEN]){(uint8_t) MAJOR_VERSION, - (uint8_t) MINOR_VERSION, - (uint8_t) PATCH_VERSION}, - .size = APPVERSION_LEN, - .offset = 0}, + 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, SW_OK); } diff --git a/src/handler/sign_tx.c b/src/handler/sign_tx.c index eb4c688..df41375 100644 --- a/src/handler/sign_tx.c +++ b/src/handler/sign_tx.c @@ -22,13 +22,13 @@ #include "os.h" #include "cx.h" +#include "buffer.h" #include "sign_tx.h" #include "../sw.h" #include "../globals.h" #include "../crypto.h" #include "../ui/display.h" -#include "../common/buffer.h" #include "../transaction/types.h" #include "../transaction/deserialize.h" diff --git a/src/handler/sign_tx.h b/src/handler/sign_tx.h index af17299..633ddf6 100644 --- a/src/handler/sign_tx.h +++ b/src/handler/sign_tx.h @@ -3,7 +3,7 @@ #include // uint*_t #include // bool -#include "../common/buffer.h" +#include "buffer.h" /** * Handler for SIGN_TX command. If successfully parse BIP32 path diff --git a/src/helper/send_reponse.c b/src/helper/send_reponse.c index df0d9af..9339282 100644 --- a/src/helper/send_reponse.c +++ b/src/helper/send_reponse.c @@ -19,11 +19,12 @@ #include // uint*_t #include // memmove +#include "buffer.h" + #include "send_response.h" #include "../constants.h" #include "../globals.h" #include "../sw.h" -#include "common/buffer.h" int helper_send_response_pubkey() { uint8_t resp[1 + 1 + PUBKEY_LEN + 1 + CHAINCODE_LEN] = {0}; @@ -37,7 +38,7 @@ int helper_send_response_pubkey() { memmove(resp + offset, G_context.pk_info.chain_code, CHAINCODE_LEN); offset += CHAINCODE_LEN; - return io_send_response(&(const buffer_t){.ptr = resp, .size = offset, .offset = 0}, SW_OK); + return io_send_response_pointer(resp, offset, SW_OK); } int helper_send_response_sig() { @@ -48,5 +49,5 @@ int helper_send_response_sig() { memmove(resp + offset, G_context.tx_info.signature, G_context.tx_info.signature_len); offset += G_context.tx_info.signature_len; - return io_send_response(&(const buffer_t){.ptr = resp, .size = offset, .offset = 0}, SW_OK); + return io_send_response_pointer(resp, offset, SW_OK); } diff --git a/src/helper/send_response.h b/src/helper/send_response.h index 61fec70..52fb40d 100644 --- a/src/helper/send_response.h +++ b/src/helper/send_response.h @@ -1,8 +1,7 @@ #pragma once #include "os.h" - -#include "../common/macros.h" +#include "macros.h" /** * Length of public key. diff --git a/src/io.c b/src/io.c deleted file mode 100644 index 990dcc0..0000000 --- a/src/io.c +++ /dev/null @@ -1,162 +0,0 @@ -/***************************************************************************** - * Ledger App Aptos. - * (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 - -#include "os.h" -#include "ux.h" - -#include "io.h" -#include "globals.h" -#include "sw.h" -#include "common/buffer.h" -#include "common/write.h" - -void io_seproxyhal_display(const bagl_element_t *element) { - io_seproxyhal_display_default((bagl_element_t *) element); -} - -uint8_t io_event(uint8_t channel __attribute__((unused))) { - switch (G_io_seproxyhal_spi_buffer[0]) { - 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); - } - __attribute__((fallthrough)); - case SEPROXYHAL_TAG_DISPLAY_PROCESSED_EVENT: - UX_DISPLAYED_EVENT({}); - break; - case SEPROXYHAL_TAG_TICKER_EVENT: - UX_TICKER_EVENT(G_io_seproxyhal_spi_buffer, {}); - break; - default: - UX_DEFAULT_EVENT(); - break; - } - - if (!io_seproxyhal_spi_is_status_sent()) { - io_seproxyhal_general_status(); - } - - return 1; -} - -uint16_t io_exchange_al(uint8_t channel, uint16_t tx_len) { - switch (channel & ~(IO_FLAGS)) { - case CHANNEL_KEYBOARD: - break; - case CHANNEL_SPI: - if (tx_len) { - io_seproxyhal_spi_send(G_io_apdu_buffer, tx_len); - - if (channel & IO_RESET_AFTER_REPLIED) { - halt(); - } - - return 0; - } else { - return io_seproxyhal_spi_recv(G_io_apdu_buffer, sizeof(G_io_apdu_buffer), 0); - } - default: - THROW(INVALID_PARAMETER); - } - - return 0; -} - -/** - * Variable containing the length of the APDU response to send back. - */ -static uint32_t G_output_len = 0; - -/** - * IO state (READY, RECEIVING, WAITING). - */ -static io_state_e G_io_state = READY; - -void io_init() { - // Reset length of APDU response - G_output_len = 0; - G_io_state = READY; -} - -int io_recv_command() { - int ret = -1; - - switch (G_io_state) { - case READY: - G_io_state = RECEIVED; - ret = io_exchange(CHANNEL_APDU, G_output_len); - break; - case RECEIVED: - G_io_state = WAITING; - ret = io_exchange(CHANNEL_APDU | IO_ASYNCH_REPLY, G_output_len); - G_io_state = RECEIVED; - break; - case WAITING: - G_io_state = READY; - ret = -1; - break; - } - - return ret; -} - -int io_send_response(const buffer_t *rdata, uint16_t sw) { - int ret = -1; - - if (rdata != NULL) { - if (rdata->size - rdata->offset > IO_APDU_BUFFER_SIZE - 2 || // - !buffer_copy(rdata, G_io_apdu_buffer, sizeof(G_io_apdu_buffer))) { - return io_send_sw(SW_WRONG_RESPONSE_LENGTH); - } - G_output_len = rdata->size - rdata->offset; - PRINTF("<= SW=%04X | RData=%.*H\n", sw, rdata->size, rdata->ptr); - } else { - G_output_len = 0; - PRINTF("<= SW=%04X | RData=\n", sw); - } - - write_u16_be(G_io_apdu_buffer, G_output_len, sw); - G_output_len += 2; - - switch (G_io_state) { - case READY: - ret = -1; - break; - case RECEIVED: - G_io_state = READY; - ret = 0; - break; - case WAITING: - ret = io_exchange(CHANNEL_APDU | IO_RETURN_AFTER_TX, G_output_len); - G_output_len = 0; - G_io_state = READY; - break; - } - - return ret; -} - -int io_send_sw(uint16_t sw) { - return io_send_response(NULL, sw); -} diff --git a/src/io.h b/src/io.h deleted file mode 100644 index c441d12..0000000 --- a/src/io.h +++ /dev/null @@ -1,63 +0,0 @@ -#pragma once - -#include - -#include "ux.h" -#include "os_io_seproxyhal.h" - -#include "types.h" -#include "common/buffer.h" - -void io_seproxyhal_display(const bagl_element_t *element); - -/** - * IO callback called when an interrupt based channel has received - * data to be processed. - * - * @return 1 if success, 0 otherwise. - * - */ -uint8_t io_event(uint8_t channel __attribute__((unused))); - -uint16_t io_exchange_al(uint8_t channel, uint16_t tx_len); - -/** - * Initialize the APDU I/O state. - * - * This function must be called before calling any other I/O function. - */ -void io_init(void); - -/** - * Receive APDU command in G_io_apdu_buffer. - * - * @return zero or positive integer if success, -1 otherwise. - * - */ -int io_recv_command(void); - -/** - * Send APDU response (response data + status word) by filling - * G_io_apdu_buffer. - * - * @param[in] rdata - * Buffer with APDU response data. - * @param[in] sw - * Status word of APDU response. - * - * @return zero or positive integer if success, -1 otherwise. - * - */ -int io_send_response(const buffer_t *rdata, uint16_t sw); - -/** - * Send APDU response (only status word) by filling - * G_io_apdu_buffer. - * - * @param[in] sw - * Status word of APDU response. - * - * @return zero or positive integer if success, -1 otherwise. - * - */ -int io_send_sw(uint16_t sw); diff --git a/src/offsets.h b/src/offsets.h deleted file mode 100644 index 3db4bc1..0000000 --- a/src/offsets.h +++ /dev/null @@ -1,26 +0,0 @@ -#pragma once - -/** - * Offset of instruction class. - */ -#define OFFSET_CLA 0 -/** - * Offset of instruction code. - */ -#define OFFSET_INS 1 -/** - * Offset of instruction parameter 1. - */ -#define OFFSET_P1 2 -/** - * Offset of instruction parameter 2. - */ -#define OFFSET_P2 3 -/** - * Offset of command data length. - */ -#define OFFSET_LC 4 -/** - * Offset of command data. - */ -#define OFFSET_CDATA 5 diff --git a/src/transaction/deserialize.c b/src/transaction/deserialize.c index 73156e1..3d54273 100644 --- a/src/transaction/deserialize.c +++ b/src/transaction/deserialize.c @@ -1,9 +1,11 @@ #include + +#include "buffer.h" + #include "deserialize.h" #include "utils.h" #include "types.h" #include "../constants.h" -#include "../common/buffer.h" #include "../bcs/init.h" #include "../bcs/decoder.h" diff --git a/src/transaction/deserialize.h b/src/transaction/deserialize.h index ff97576..e312cf0 100644 --- a/src/transaction/deserialize.h +++ b/src/transaction/deserialize.h @@ -1,7 +1,8 @@ #pragma once +#include "buffer.h" + #include "types.h" -#include "../common/buffer.h" /** * Deserialize raw transaction in structure. diff --git a/src/types.h b/src/types.h index 92c0463..5694e1d 100644 --- a/src/types.h +++ b/src/types.h @@ -3,18 +3,10 @@ #include // size_t #include // uint*_t +#include "bip32.h" + #include "constants.h" #include "transaction/types.h" -#include "common/bip32.h" - -/** - * Enumeration for the status of IO. - */ -typedef enum { - READY, /// ready for new event - RECEIVED, /// data received - WAITING /// waiting -} io_state_e; /** * Enumeration with expected INS of APDU commands. @@ -26,18 +18,6 @@ typedef enum { SIGN_TX = 0x06 /// sign transaction with BIP32 path } command_e; -/** - * Structure with fields of APDU command. - */ -typedef struct { - uint8_t cla; /// Instruction class - command_e ins; /// Instruction code - uint8_t p1; /// Instruction parameter 1 - uint8_t p2; /// Instruction parameter 2 - uint8_t lc; /// Length of command data - uint8_t *data; /// Command data -} command_t; - /** * Enumeration with parsing state. */ diff --git a/src/ui/action/validate.c b/src/ui/action/validate.c index a2c7289..738ee26 100644 --- a/src/ui/action/validate.c +++ b/src/ui/action/validate.c @@ -17,10 +17,11 @@ #include // bool +#include "io.h" + #include "validate.h" #include "../menu.h" #include "../../sw.h" -#include "../../io.h" #include "../../crypto.h" #include "../../globals.h" #include "../../helper/send_response.h" diff --git a/src/ui/display.c b/src/ui/display.c index 3f5e9e3..576dcaf 100644 --- a/src/ui/display.c +++ b/src/ui/display.c @@ -21,18 +21,19 @@ #include "os.h" #include "ux.h" #include "glyphs.h" +#include "io.h" +#include "bip32.h" +#include "format.h" #include "display.h" #include "constants.h" #include "../globals.h" -#include "../io.h" #include "../sw.h" #include "../address.h" #include "action/validate.h" #include "action/extend.h" #include "../transaction/types.h" -#include "../common/bip32.h" -#include "../common/format.h" +#include "../common/user_format.h" #define DOTS "[...]" From a430dad99bf226862a6c9955eb0511f88cf14ba0 Mon Sep 17 00:00:00 2001 From: vldmkr Date: Sat, 10 Jun 2023 08:12:22 +0300 Subject: [PATCH 04/32] Fix the tests, remove the obsolete ones --- tests/speculos/test_error_cmd.py | 2 +- unit-tests/CMakeLists.txt | 35 ++----- unit-tests/test_apdu_parser.c | 41 -------- unit-tests/test_base58.c | 34 ------- unit-tests/test_bip32.c | 101 -------------------- unit-tests/test_buffer.c | 155 ------------------------------- unit-tests/test_format.c | 105 --------------------- unit-tests/test_write.c | 64 ------------- 8 files changed, 10 insertions(+), 527 deletions(-) delete mode 100644 unit-tests/test_apdu_parser.c delete mode 100644 unit-tests/test_base58.c delete mode 100644 unit-tests/test_bip32.c delete mode 100644 unit-tests/test_buffer.c delete mode 100644 unit-tests/test_format.c delete mode 100644 unit-tests/test_write.c diff --git a/tests/speculos/test_error_cmd.py b/tests/speculos/test_error_cmd.py index 2341e25..ecb7b5a 100644 --- a/tests/speculos/test_error_cmd.py +++ b/tests/speculos/test_error_cmd.py @@ -37,6 +37,6 @@ def test_wrong_p1p2(client): def test_wrong_data_length(client): try: # APDUs must be at least 5 bytes: CLA, INS, P1, P2, Lc. - client._apdu_exchange(b"5B00") + client._apdu_exchange(b"5B030000") except ApduException as error: raise DeviceException(error_code=error.sw) diff --git a/unit-tests/CMakeLists.txt b/unit-tests/CMakeLists.txt index 191d004..6148dfe 100644 --- a/unit-tests/CMakeLists.txt +++ b/unit-tests/CMakeLists.txt @@ -36,36 +36,25 @@ endif() add_compile_definitions(TEST) include_directories(../src) +include_directories($ENV{BOLOS_SDK}/lib_standard_app) add_executable(test_bcs test_bcs.c) -add_executable(test_base58 test_base58.c) -add_executable(test_bip32 test_bip32.c) -add_executable(test_buffer test_buffer.c) -add_executable(test_format test_format.c) -add_executable(test_write test_write.c) -add_executable(test_apdu_parser test_apdu_parser.c) add_executable(test_tx_parser test_tx_parser.c) add_executable(test_tx_utils test_tx_utils.c) +add_library(base58 SHARED $ENV{BOLOS_SDK}/lib_standard_app/base58.c) +add_library(bip32 SHARED $ENV{BOLOS_SDK}/lib_standard_app/bip32.c) +add_library(buffer SHARED $ENV{BOLOS_SDK}/lib_standard_app/buffer.c) +add_library(read SHARED $ENV{BOLOS_SDK}/lib_standard_app/read.c) +add_library(write SHARED $ENV{BOLOS_SDK}/lib_standard_app/write.c) +add_library(format SHARED $ENV{BOLOS_SDK}/lib_standard_app/format.c) +add_library(varint SHARED $ENV{BOLOS_SDK}/lib_standard_app/varint.c) +add_library(apdu_parser SHARED $ENV{BOLOS_SDK}/lib_standard_app/parser.c) add_library(bcs SHARED ../src/bcs/init.c ../src/bcs/decoder.c ../src/bcs/utf8.c) -add_library(base58 SHARED ../src/common/base58.c) -add_library(bip32 SHARED ../src/common/bip32.c) -add_library(buffer SHARED ../src/common/buffer.c) -add_library(read SHARED ../src/common/read.c) -add_library(write SHARED ../src/common/write.c) -add_library(format SHARED ../src/common/format.c) -add_library(varint SHARED ../src/common/varint.c) -add_library(apdu_parser SHARED ../src/apdu/parser.c) add_library(transaction_deserialize ../src/transaction/deserialize.c) add_library(transaction_utils ../src/transaction/utils.c) target_link_libraries(test_bcs PUBLIC cmocka gcov bcs buffer bip32 varint write read) -target_link_libraries(test_base58 PUBLIC cmocka gcov base58) -target_link_libraries(test_bip32 PUBLIC cmocka gcov bip32 read) -target_link_libraries(test_buffer PUBLIC cmocka gcov buffer bip32 varint write read) -target_link_libraries(test_format PUBLIC cmocka gcov format) -target_link_libraries(test_write PUBLIC cmocka gcov write) -target_link_libraries(test_apdu_parser PUBLIC cmocka gcov apdu_parser) target_link_libraries(test_tx_parser PUBLIC transaction_deserialize bcs @@ -83,11 +72,5 @@ target_link_libraries(test_tx_utils PUBLIC transaction_utils) add_test(test_bcs test_bcs) -add_test(test_base58 test_base58) -add_test(test_bip32 test_bip32) -add_test(test_buffer test_buffer) -add_test(test_format test_format) -add_test(test_write test_write) -add_test(test_apdu_parser test_apdu_parser) add_test(test_tx_parser test_tx_parser) add_test(test_tx_utils test_tx_utils) diff --git a/unit-tests/test_apdu_parser.c b/unit-tests/test_apdu_parser.c deleted file mode 100644 index 99ee07d..0000000 --- a/unit-tests/test_apdu_parser.c +++ /dev/null @@ -1,41 +0,0 @@ -#include -#include -#include -#include -#include -#include - -#include - -#include "types.h" -#include "apdu/parser.h" - -static void test_apdu_parser(void **state) { - (void) state; - uint8_t apdu_bad_min_len[] = {0xE0, 0x03, 0x00, 0x00}; // less than 5 bytes - uint8_t apdu_bad_lc[] = {0xE0, 0x03, 0x00, 0x00, 0x01}; // Lc = 1 but no data - uint8_t apdu[] = {0xE0, 0x03, 0x01, 0x02, 0x05, 0x00, 0x01, 0x02, 0x03, 0x04}; - - command_t cmd; - - memset(&cmd, 0, sizeof(cmd)); - assert_false(apdu_parser(&cmd, apdu_bad_min_len, sizeof(apdu_bad_min_len))); - - memset(&cmd, 0, sizeof(cmd)); - assert_false(apdu_parser(&cmd, apdu_bad_lc, sizeof(apdu_bad_min_len))); - - memset(&cmd, 0, sizeof(cmd)); - assert_true(apdu_parser(&cmd, apdu, sizeof(apdu))); - assert_int_equal(cmd.cla, 0xE0); - assert_int_equal(cmd.ins, 0x03); - assert_int_equal(cmd.p1, 0x01); - assert_int_equal(cmd.p2, 0x02); - assert_int_equal(cmd.lc, 5); - assert_memory_equal(cmd.data, ((uint8_t[]){0x00, 0x01, 0x02, 0x03, 0x04}), cmd.lc); -} - -int main() { - const struct CMUnitTest tests[] = {cmocka_unit_test(test_apdu_parser)}; - - return cmocka_run_group_tests(tests, NULL, NULL); -} diff --git a/unit-tests/test_base58.c b/unit-tests/test_base58.c deleted file mode 100644 index f7f5e45..0000000 --- a/unit-tests/test_base58.c +++ /dev/null @@ -1,34 +0,0 @@ -#include -#include -#include -#include -#include -#include - -#include - -#include "common/base58.h" - -static void test_base58(void **state) { - (void) state; - - const char in[] = "USm3fpXnKG5EUBx2ndxBDMPVciP5hGey2Jh4NDv6gmeo1LkMeiKrLJUUBk6Z"; - const char expected_out[] = "The quick brown fox jumps over the lazy dog."; - uint8_t out[100] = {0}; - int out_len = base58_decode(in, sizeof(in) - 1, out, sizeof(out)); - assert_int_equal(out_len, strlen(expected_out)); - assert_string_equal((char *) out, expected_out); - - const char in2[] = "The quick brown fox jumps over the lazy dog."; - const char expected_out2[] = "USm3fpXnKG5EUBx2ndxBDMPVciP5hGey2Jh4NDv6gmeo1LkMeiKrLJUUBk6Z"; - char out2[100] = {0}; - int out_len2 = base58_encode((uint8_t *) in2, sizeof(in2) - 1, out2, sizeof(out2)); - assert_int_equal(out_len2, strlen(expected_out2)); - assert_string_equal((char *) out2, expected_out2); -} - -int main() { - const struct CMUnitTest tests[] = {cmocka_unit_test(test_base58)}; - - return cmocka_run_group_tests(tests, NULL, NULL); -} diff --git a/unit-tests/test_bip32.c b/unit-tests/test_bip32.c deleted file mode 100644 index f71383b..0000000 --- a/unit-tests/test_bip32.c +++ /dev/null @@ -1,101 +0,0 @@ -#include -#include -#include -#include -#include - -#include - -#include "common/bip32.h" - -static void test_bip32_format(void **state) { - (void) state; - - char output[30]; - bool b = false; - - b = bip32_path_format((const uint32_t[5]){0x8000002C, 0x80000000, 0x80000000, 0, 0}, - 5, - output, - sizeof(output)); - assert_true(b); - assert_string_equal(output, "44'/0'/0'/0/0"); - - b = bip32_path_format((const uint32_t[5]){0x8000002C, 0x80000001, 0x80000000, 0, 0}, - 5, - output, - sizeof(output)); - assert_true(b); - assert_string_equal(output, "44'/1'/0'/0/0"); -} - -static void test_bad_bip32_format(void **state) { - (void) state; - - char output[30]; - bool b = true; - - // More than MAX_BIP32_PATH (=10) - b = bip32_path_format( - (const uint32_t[11]){0x8000002C, 0x80000000, 0x80000000, 0, 0, 0, 0, 0, 0, 0, 0}, - 11, - output, - sizeof(output)); - assert_false(b); - - // No BIP32 path (=0) - b = bip32_path_format(NULL, 0, output, sizeof(output)); - assert_false(b); -} - -static void test_bip32_read(void **state) { - (void) state; - - // clang-format off - uint8_t input[20] = { - 0x80, 0x00, 0x00, 0x2C, - 0x80, 0x00, 0x00, 0x01, - 0x80, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00 - }; - uint32_t expected[5] = {0x8000002C, 0x80000001, 0x80000000, 0, 0}; - uint32_t output[5] = {0}; - bool b = false; - - b = bip32_path_read(input, sizeof(input), output, 5); - assert_true(b); - assert_memory_equal(output, expected, 5); -} - -static void test_bad_bip32_read(void **state) { - (void) state; - - // clang-format off - uint8_t input[20] = { - 0x80, 0x00, 0x00, 0x2C, - 0x80, 0x00, 0x00, 0x01, - 0x80, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00 - }; - uint32_t output[10] = {0}; - - // buffer too small (5 BIP32 paths instead of 10) - assert_false(bip32_path_read(input, sizeof(input), output, 10)); - - // No BIP32 path - assert_false(bip32_path_read(input, sizeof(input), output, 0)); - - // More than MAX_BIP32_PATH (=10) - assert_false(bip32_path_read(input, sizeof(input), output, 20)); -} - -int main() { - const struct CMUnitTest tests[] = {cmocka_unit_test(test_bip32_format), - cmocka_unit_test(test_bad_bip32_format), - cmocka_unit_test(test_bip32_read), - cmocka_unit_test(test_bad_bip32_read)}; - - return cmocka_run_group_tests(tests, NULL, NULL); -} diff --git a/unit-tests/test_buffer.c b/unit-tests/test_buffer.c deleted file mode 100644 index e2d1efa..0000000 --- a/unit-tests/test_buffer.c +++ /dev/null @@ -1,155 +0,0 @@ -#include -#include -#include -#include -#include - -#include - -#include "common/buffer.h" - -static void test_buffer_can_read(void **state) { - (void) state; - - uint8_t temp[20] = {0}; - buffer_t buf = {.ptr = temp, .size = sizeof(temp), .offset = 0}; - - assert_true(buffer_can_read(&buf, 20)); - - assert_true(buffer_seek_cur(&buf, 20)); - assert_false(buffer_can_read(&buf, 1)); -} - -static void test_buffer_seek(void **state) { - (void) state; - - uint8_t temp[20] = {0}; - buffer_t buf = {.ptr = temp, .size = sizeof(temp), .offset = 0}; - - assert_true(buffer_can_read(&buf, 20)); - - assert_true(buffer_seek_cur(&buf, 20)); // seek at offset 20 - assert_false(buffer_can_read(&buf, 1)); // can't read 1 byte - assert_false(buffer_seek_cur(&buf, 1)); // can't move at offset 21 - - assert_true(buffer_seek_end(&buf, 19)); - assert_int_equal(buf.offset, 1); - assert_false(buffer_seek_end(&buf, 21)); // can't seek at offset -1 - - assert_true(buffer_seek_set(&buf, 10)); - assert_int_equal(buf.offset, 10); - assert_false(buffer_seek_set(&buf, 21)); // can't seek at offset 21 -} - -static void test_buffer_read(void **state) { - (void) state; - - // clang-format off - uint8_t temp[15] = { - 0xFF, - 0x01, 0x02, - 0x03, 0x04, 0x05, 0x06, - 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E - }; - buffer_t buf = {.ptr = temp, .size = sizeof(temp), .offset = 0}; - - uint8_t first = 0; - assert_true(buffer_read_u8(&buf, &first)); - assert_int_equal(first, 255); // 0xFF - assert_true(buffer_seek_end(&buf, 0)); // seek at offset 19 - assert_false(buffer_read_u8(&buf, &first)); // can't read 1 byte - - uint16_t second = 0; - assert_true(buffer_seek_set(&buf, 1)); // set back to offset 1 - assert_true(buffer_read_u16(&buf, &second, BE)); // big endian - assert_int_equal(second, 258); // 0x01 0x02 - assert_true(buffer_seek_set(&buf, 1)); // set back to offset 1 - assert_true(buffer_read_u16(&buf, &second, LE)); // little endian - assert_int_equal(second, 513); // 0x02 0x01 - assert_true(buffer_seek_set(&buf, 14)); // seek at offset 14 - assert_false(buffer_read_u16(&buf, &second, BE)); // can't read 2 bytes - - uint32_t third = 0; - assert_true(buffer_seek_set(&buf, 3)); // set back to offset 3 - assert_true(buffer_read_u32(&buf, &third, BE)); // big endian - assert_int_equal(third, 50595078); // 0x03 0x04 0x05 0x06 - assert_true(buffer_seek_set(&buf, 3)); // set back to offset 3 - assert_true(buffer_read_u32(&buf, &third, LE)); // little endian - assert_int_equal(third, 100992003); // 0x06 0x05 0x04 0x03 - assert_true(buffer_seek_set(&buf, 12)); // seek at offset 12 - assert_false(buffer_read_u32(&buf, &third, BE)); // can't read 4 bytes - - uint64_t fourth = 0; - assert_true(buffer_seek_set(&buf, 7)); // set back to offset 7 - assert_true(buffer_read_u64(&buf, &fourth, BE)); // big endian - assert_int_equal(fourth, 506664896818842894); // 0x07 0x08 0x09 0x0A 0x0B 0x0C 0x0D 0x0E - assert_true(buffer_seek_set(&buf, 7)); // set back to offset 7 - assert_true(buffer_read_u64(&buf, &fourth, LE)); // little endian - assert_int_equal(fourth, 1012478732780767239); // 0x0E 0x0D 0x0C 0x0B 0x0A 0x09 0x08 0x07 - assert_true(buffer_seek_set(&buf, 8)); // seek at offset 8 - assert_false(buffer_read_u64(&buf, &fourth, BE)); // can't read 8 bytes - - // clang-format off - uint8_t temp_varint[] = { - 0xFC, // 1 byte varint - 0xFD, 0x00, 0x01, // 2 bytes varint - 0xFE, 0x00, 0x01, 0x02, 0x03, // 4 bytes varint - 0xFF, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07 // 8 bytes varint - - }; - buffer_t buf_varint = {.ptr = temp_varint, .size = sizeof(temp_varint), .offset = 0}; - uint64_t varint = 0; - assert_true(buffer_read_varint(&buf_varint, &varint)); - assert_int_equal(varint, 0xFC); - assert_true(buffer_read_varint(&buf_varint, &varint)); - assert_int_equal(varint, 0x0100); - assert_true(buffer_read_varint(&buf_varint, &varint)); - assert_int_equal(varint, 0x03020100); - assert_true(buffer_read_varint(&buf_varint, &varint)); - assert_int_equal(varint, 0x0706050403020100); - assert_false(buffer_read_varint(&buf_varint, &varint)); -} - -static void test_buffer_copy(void **state) { - (void) state; - - uint8_t output[5] = {0}; - uint8_t temp[5] = {0x01, 0x02, 0x03, 0x04, 0x05}; - buffer_t buf = {.ptr = temp, .size = sizeof(temp), .offset = 0}; - - assert_true(buffer_copy(&buf, output, sizeof(output))); - assert_memory_equal(output, temp, sizeof(output)); - - uint8_t output2[3] = {0}; - assert_true(buffer_seek_set(&buf, 2)); - assert_true(buffer_copy(&buf, output2, sizeof(output2))); - assert_memory_equal(output2, ((uint8_t[3]){0x03, 0x04, 0x05}), 3); - assert_true(buffer_seek_set(&buf, 0)); // seek at offset 0 - assert_false(buffer_copy(&buf, output2, sizeof(output2))); // can't read 5 bytes -} - -static void test_buffer_move(void **state) { - (void) state; - - uint8_t output[5] = {0}; - uint8_t temp[5] = {0x01, 0x02, 0x03, 0x04, 0x05}; - buffer_t buf = {.ptr = temp, .size = sizeof(temp), .offset = 0}; - - assert_true(buffer_move(&buf, output, sizeof(output))); - assert_memory_equal(output, temp, sizeof(output)); - assert_int_equal(buf.offset, sizeof(output)); - - uint8_t output2[3] = {0}; - assert_true(buffer_seek_set(&buf, 0)); // seek at offset 0 - assert_false(buffer_move(&buf, output2, sizeof(output2))); // can't read 5 bytes -} - -int main() { - const struct CMUnitTest tests[] = {cmocka_unit_test(test_buffer_can_read), - cmocka_unit_test(test_buffer_seek), - cmocka_unit_test(test_buffer_read), - cmocka_unit_test(test_buffer_copy), - cmocka_unit_test(test_buffer_move)}; - - return cmocka_run_group_tests(tests, NULL, NULL); -} diff --git a/unit-tests/test_format.c b/unit-tests/test_format.c deleted file mode 100644 index 7423e18..0000000 --- a/unit-tests/test_format.c +++ /dev/null @@ -1,105 +0,0 @@ -#include -#include -#include -#include -#include -#include - -#include - -#include "common/format.h" - -static void test_format_i64(void **state) { - (void) state; - - char temp[22] = {0}; - - int64_t value = 0; - assert_true(format_i64(temp, sizeof(temp), value)); - assert_string_equal(temp, "0"); - - value = (int64_t) 9223372036854775807ull; // MAX_INT64 - memset(temp, 0, sizeof(temp)); - assert_true(format_i64(temp, sizeof(temp), value)); - assert_string_equal(temp, "9223372036854775807"); - - // buffer too small - assert_false(format_i64(temp, sizeof(temp) - 5, value)); - - value = (int64_t) -9223372036854775808ull; // MIN_INT64 - memset(temp, 0, sizeof(temp)); - assert_true(format_i64(temp, sizeof(temp), value)); - assert_string_equal(temp, "-9223372036854775808"); -} - -static void test_format_u64(void **state) { - (void) state; - - char temp[21] = {0}; - - uint64_t value = 0; - assert_true(format_u64(temp, sizeof(temp), value)); - assert_string_equal(temp, "0"); - - value = (uint64_t) 18446744073709551615ull; // MAX_UNT64 - memset(temp, 0, sizeof(temp)); - assert_true(format_u64(temp, sizeof(temp), value)); - assert_string_equal(temp, "18446744073709551615"); - - // buffer too small - assert_false(format_u64(temp, sizeof(temp) - 5, value)); -} - -static void test_format_fpu64(void **state) { - (void) state; - - char temp[22] = {0}; - - uint64_t amount = 100000000ull; // satoshi - memset(temp, 0, sizeof(temp)); - assert_true(format_fpu64(temp, sizeof(temp), amount, 8)); - assert_string_equal(temp, "1.00000000"); // BTC - - amount = 24964823ull; // satoshi - memset(temp, 0, sizeof(temp)); - assert_true(format_fpu64(temp, sizeof(temp), amount, 8)); - assert_string_equal(temp, "0.24964823"); // BTC - - amount = 100ull; // satoshi - memset(temp, 0, sizeof(temp)); - assert_true(format_fpu64(temp, sizeof(temp), amount, 8)); - assert_string_equal(temp, "0.00000100"); // BTC - // buffer too small - assert_false(format_fpu64(temp, sizeof(temp) - 16, amount, 8)); - - char temp2[50] = {0}; - - amount = 1000000000000000000ull; // wei - assert_true(format_fpu64(temp2, sizeof(temp2), amount, 18)); - assert_string_equal(temp2, "1.000000000000000000"); // ETH - - // buffer too small - assert_false(format_fpu64(temp2, sizeof(temp2) - 20, amount, 18)); -} - -static void test_format_hex(void **state) { - (void) state; - - uint8_t address[] = {0xde, 0xb, 0x29, 0x56, 0x69, 0xa9, 0xfd, 0x93, 0xd5, 0xf2, - 0x8d, 0x9e, 0xc8, 0x5e, 0x40, 0xf4, 0xcb, 0x69, 0x7b, 0xae}; - char output[2 * sizeof(address) + 1] = {0}; - - assert_int_equal(2 * sizeof(address) + 1, - format_hex(address, sizeof(address), output, sizeof(output))); - assert_string_equal(output, "DE0B295669A9FD93D5F28D9EC85E40F4CB697BAE"); - assert_int_equal(-1, format_hex(address, sizeof(address), output, sizeof(address))); -} - -int main() { - const struct CMUnitTest tests[] = {cmocka_unit_test(test_format_i64), - cmocka_unit_test(test_format_u64), - cmocka_unit_test(test_format_fpu64), - cmocka_unit_test(test_format_hex)}; - - return cmocka_run_group_tests(tests, NULL, NULL); -} diff --git a/unit-tests/test_write.c b/unit-tests/test_write.c deleted file mode 100644 index 08f37f7..0000000 --- a/unit-tests/test_write.c +++ /dev/null @@ -1,64 +0,0 @@ -#include -#include -#include -#include -#include -#include - -#include - -#include "common/write.h" - -static void test_write(void **state) { - (void) state; - - uint8_t tmp2[2] = {0}; - - uint8_t expected2[2] = {0x01, 0x07}; - write_u16_be(tmp2, 0, (uint16_t) 263U); - assert_memory_equal(tmp2, expected2, sizeof(expected2)); - - memset(tmp2, 0, sizeof(tmp2)); - expected2[0] = 0x07; - expected2[1] = 0x01; - write_u16_le(tmp2, 0, (uint16_t) 263U); - assert_memory_equal(tmp2, expected2, sizeof(expected2)); - - uint8_t tmp4[4] = {0}; - - uint8_t expected4[4] = {0x01, 0x3B, 0xAC, 0xC7}; - write_u32_be(tmp4, 0, (uint32_t) 20688071UL); - assert_memory_equal(tmp4, expected4, sizeof(expected4)); - - memset(tmp4, 0, sizeof(tmp4)); - expected4[0] = 0xC7; - expected4[1] = 0xAC; - expected4[2] = 0x3B; - expected4[3] = 0x01; - write_u32_le(tmp4, 0, (uint32_t) 20688071UL); - assert_memory_equal(tmp4, expected4, sizeof(expected4)); - - uint8_t tmp8[8] = {0}; - - uint8_t expected8[8] = {0xEB, 0x68, 0x44, 0xC0, 0x2C, 0x61, 0xB0, 0x99}; - write_u64_be(tmp8, 0, (uint64_t) 16962883588659982489ULL); - assert_memory_equal(tmp8, expected8, sizeof(expected8)); - - memset(tmp8, 0, sizeof(tmp8)); - expected8[0] = 0x99; - expected8[1] = 0xB0; - expected8[2] = 0x61; - expected8[3] = 0x2C; - expected8[4] = 0xC0; - expected8[5] = 0x44; - expected8[6] = 0x68; - expected8[7] = 0xEB; - write_u64_le(tmp8, 0, (uint64_t) 16962883588659982489ULL); - assert_memory_equal(tmp8, expected8, sizeof(expected8)); -} - -int main() { - const struct CMUnitTest tests[] = {cmocka_unit_test(test_write)}; - - return cmocka_run_group_tests(tests, NULL, NULL); -} From ba7bc99e8ea3495dacb680c84efd263781a4774b Mon Sep 17 00:00:00 2001 From: vldmkr Date: Sat, 10 Jun 2023 08:43:24 +0300 Subject: [PATCH 05/32] Prepare to implement the UI for Ledger Stax --- src/ui/action/extend.c | 27 ---------------------- src/ui/action/extend.h | 12 ---------- src/ui/action/validate.c | 9 ++------ src/ui/action/validate.h | 4 ++-- src/ui/{display.c => bagl_display.c} | 29 +++++++++++++++++++++++- src/ui/bagl_display.h | 31 ++++++++++++++++++++++++++ src/ui/{menu.c => bagl_menu.c} | 6 ++++- src/ui/{settings.c => bagl_settings.c} | 21 +++++++++++++++++ src/ui/display.h | 27 ---------------------- 9 files changed, 89 insertions(+), 77 deletions(-) delete mode 100644 src/ui/action/extend.c delete mode 100644 src/ui/action/extend.h rename src/ui/{display.c => bagl_display.c} (96%) create mode 100644 src/ui/bagl_display.h rename src/ui/{menu.c => bagl_menu.c} (97%) rename src/ui/{settings.c => bagl_settings.c} (74%) diff --git a/src/ui/action/extend.c b/src/ui/action/extend.c deleted file mode 100644 index 3a55472..0000000 --- a/src/ui/action/extend.c +++ /dev/null @@ -1,27 +0,0 @@ -/***************************************************************************** - * Ledger App Aptos. - * (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 "extend.h" -#include "../settings.h" - -void ui_action_allow_blind_signing(const ux_flow_step_t *const *steps) { - settings_allow_blind_signing_change(1); - - // Passed UX_FLOW steps are expected to contain a blind signing warning on the first step. - // Skip it for better UX here. - ux_flow_init(0, steps, steps[1]); -} \ No newline at end of file diff --git a/src/ui/action/extend.h b/src/ui/action/extend.h deleted file mode 100644 index 6e68f45..0000000 --- a/src/ui/action/extend.h +++ /dev/null @@ -1,12 +0,0 @@ -#pragma once - -#include "ux.h" - -/** - * Action to allow blind signing in settings. - * - * @param[in] steps - * The sequence of the following steps - * - */ -void ui_action_allow_blind_signing(const ux_flow_step_t *const *steps); diff --git a/src/ui/action/validate.c b/src/ui/action/validate.c index 738ee26..f1597ef 100644 --- a/src/ui/action/validate.c +++ b/src/ui/action/validate.c @@ -20,23 +20,20 @@ #include "io.h" #include "validate.h" -#include "../menu.h" #include "../../sw.h" #include "../../crypto.h" #include "../../globals.h" #include "../../helper/send_response.h" -void ui_action_validate_pubkey(bool choice) { +void validate_pubkey(bool choice) { if (choice) { helper_send_response_pubkey(); } else { io_send_sw(SW_DENY); } - - ui_menu_main(); } -void ui_action_validate_transaction(bool choice) { +void validate_transaction(bool choice) { if (choice) { G_context.state = STATE_APPROVED; @@ -50,6 +47,4 @@ void ui_action_validate_transaction(bool choice) { G_context.state = STATE_NONE; io_send_sw(SW_DENY); } - - ui_menu_main(); } diff --git a/src/ui/action/validate.h b/src/ui/action/validate.h index b9aca37..5b9e83c 100644 --- a/src/ui/action/validate.h +++ b/src/ui/action/validate.h @@ -9,7 +9,7 @@ * User choice (either approved or rejectd). * */ -void ui_action_validate_pubkey(bool choice); +void validate_pubkey(bool choice); /** * Action for transaction information validation. @@ -18,4 +18,4 @@ void ui_action_validate_pubkey(bool choice); * User choice (either approved or rejectd). * */ -void ui_action_validate_transaction(bool choice); +void validate_transaction(bool choice); diff --git a/src/ui/display.c b/src/ui/bagl_display.c similarity index 96% rename from src/ui/display.c rename to src/ui/bagl_display.c index 576dcaf..f7a7cfe 100644 --- a/src/ui/display.c +++ b/src/ui/bagl_display.c @@ -15,6 +15,8 @@ * limitations under the License. *****************************************************************************/ +#ifdef HAVE_BAGL + #include // bool #include // memset @@ -25,13 +27,15 @@ #include "bip32.h" #include "format.h" +#include "bagl_display.h" #include "display.h" +#include "settings.h" +#include "menu.h" #include "constants.h" #include "../globals.h" #include "../sw.h" #include "../address.h" #include "action/validate.h" -#include "action/extend.h" #include "../transaction/types.h" #include "../common/user_format.h" @@ -46,6 +50,27 @@ static char g_address[67]; static char g_function[120]; static char g_struct[120]; +// Validate/Invalidate public key and go back to home +static void ui_action_validate_pubkey(bool choice) { + validate_pubkey(choice); + ui_menu_main(); +} + +// Validate/Invalidate transaction and go back to home +static void ui_action_validate_transaction(bool choice) { + validate_transaction(choice); + ui_menu_main(); +} + +// Action to allow blind signing in settings +static void ui_action_allow_blind_signing(const ux_flow_step_t *const *steps) { + settings_allow_blind_signing_change(1); + + // Passed UX_FLOW steps are expected to contain a blind signing warning on the first step. + // Skip it for better UX here. + ux_flow_init(0, steps, steps[1]); +} + static size_t count_leading_zeros(const uint8_t *src, size_t len) { for (size_t i = 0; i < len; i++) { if (src[i] != 0) { @@ -557,3 +582,5 @@ int ui_display_tx_coin_transfer() { return 0; } + +#endif diff --git a/src/ui/bagl_display.h b/src/ui/bagl_display.h new file mode 100644 index 0000000..48bf04d --- /dev/null +++ b/src/ui/bagl_display.h @@ -0,0 +1,31 @@ +#pragma once + +#include // bool +#include "ux.h" + +/** + * A convenient function for displaying the sequence of steps. + */ +void ui_flow_display(const ux_flow_step_t *const *steps); + +/** + * A function that allows you to check the blind signing permission before displaying the sequence + * of steps. + * + * NOTE: This function should always use UX_FLOW containing the blind signing warning on the first + * step! + */ +void ui_flow_verified_display(const ux_flow_step_t *const *steps); + +/** + * Callback to extend the active UX_FLOW. + */ +typedef void (*action_extend_cb)(const ux_flow_step_t *const *steps); + +/** + * Context to extend the active UX_FLOW. + */ +typedef struct action_extend_ctx_s { + action_extend_cb call; + const ux_flow_step_t *const *steps; +} action_extend_ctx_t; diff --git a/src/ui/menu.c b/src/ui/bagl_menu.c similarity index 97% rename from src/ui/menu.c rename to src/ui/bagl_menu.c index 8800096..4cb5b8c 100644 --- a/src/ui/menu.c +++ b/src/ui/bagl_menu.c @@ -15,6 +15,8 @@ * limitations under the License. *****************************************************************************/ +#ifdef HAVE_BAGL + #include "os.h" #include "ux.h" #include "glyphs.h" @@ -22,7 +24,7 @@ #include "../globals.h" #include "menu.h" #include "settings.h" -#include "display.h" +#include "bagl_display.h" UX_STEP_NOCB(ux_menu_ready_step, pnn, {&C_aptos_logo, "Aptos", "is ready"}); UX_STEP_CB(ux_menu_settings_step, pb, ui_menu_settings(), {&C_icon_coggle, "Settings"}); @@ -70,3 +72,5 @@ UX_FLOW(ux_menu_about_flow, void ui_menu_about() { ui_flow_display(ux_menu_about_flow); } + +#endif diff --git a/src/ui/settings.c b/src/ui/bagl_settings.c similarity index 74% rename from src/ui/settings.c rename to src/ui/bagl_settings.c index f1e8fc5..ed68632 100644 --- a/src/ui/settings.c +++ b/src/ui/bagl_settings.c @@ -1,3 +1,22 @@ +/***************************************************************************** + * Ledger App Aptos. + * (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. + *****************************************************************************/ + +#ifdef HAVE_BAGL + #include "os.h" #include "settings.h" @@ -72,3 +91,5 @@ void settings_show_full_message_change(uint8_t value) { void settings_allow_blind_signing_change(uint8_t value) { nvm_write((void*) &N_storage.settings.allow_blind_signing, &value, sizeof(value)); } + +#endif diff --git a/src/ui/display.h b/src/ui/display.h index 96fd170..f4371af 100644 --- a/src/ui/display.h +++ b/src/ui/display.h @@ -3,38 +3,11 @@ #include // bool #include "ux.h" -/** - * A convenient function for displaying the sequence of steps. - */ -void ui_flow_display(const ux_flow_step_t *const *steps); - -/** - * A function that allows you to check the blind signing permission before displaying the sequence - * of steps. - * - * NOTE: This function should always use UX_FLOW containing the blind signing warning on the first - * step! - */ -void ui_flow_verified_display(const ux_flow_step_t *const *steps); - /** * Callback to reuse action with approve/reject in step FLOW. */ typedef void (*action_validate_cb)(bool); -/** - * Callback to extend the active UX_FLOW. - */ -typedef void (*action_extend_cb)(const ux_flow_step_t *const *steps); - -/** - * Context to extend the active UX_FLOW. - */ -typedef struct action_extend_ctx_s { - action_extend_cb call; - const ux_flow_step_t *const *steps; -} action_extend_ctx_t; - /** * Display address on the device and ask confirmation to export. * From 82bf475fa78dde9d4bffaf59415c57b9f3dbad3d Mon Sep 17 00:00:00 2001 From: vldmkr Date: Tue, 13 Jun 2023 01:48:24 +0300 Subject: [PATCH 06/32] Prepare to implement the UI for Ledger Stax - Define the common code - Prepare resources -- Remove standard icons -- Add new icon templates --- Makefile | 8 +-- .../{aptos_logo.gif => aptos_logo_16px.gif} | Bin glyphs/aptos_logo_64px.gif | Bin 0 -> 228 bytes glyphs/icon_back.gif | Bin 74 -> 0 bytes glyphs/icon_back_x.gif | Bin 1123 -> 0 bytes glyphs/icon_certificate.gif | Bin 1133 -> 0 bytes glyphs/icon_coggle.gif | Bin 1128 -> 0 bytes glyphs/icon_crossmark.gif | Bin 1131 -> 0 bytes glyphs/icon_dashboard.gif | Bin 1133 -> 0 bytes glyphs/icon_dashboard_x.gif | Bin 1126 -> 0 bytes glyphs/icon_down.gif | Bin 1100 -> 0 bytes glyphs/icon_eye.gif | Bin 1130 -> 0 bytes glyphs/icon_left.gif | Bin 1101 -> 0 bytes glyphs/icon_processing.gif | Bin 1130 -> 0 bytes glyphs/icon_right.gif | Bin 1100 -> 0 bytes glyphs/icon_up.gif | Bin 1100 -> 0 bytes glyphs/icon_validate_14.gif | Bin 1125 -> 0 bytes glyphs/icon_warning.gif | Bin 1130 -> 0 bytes ...nanox_app_aptos.gif => app_aptos_14px.gif} | Bin ...nanos_app_aptos.gif => app_aptos_16px.gif} | Bin icons/app_aptos_32px.gif | Bin 0 -> 116 bytes src/globals.h | 15 ---- src/ui/bagl_display.c | 32 ++------- src/ui/bagl_menu.c | 2 +- src/ui/common_display.c | 65 ++++++++++++++++++ src/ui/display.h | 7 ++ 26 files changed, 83 insertions(+), 46 deletions(-) rename glyphs/{aptos_logo.gif => aptos_logo_16px.gif} (100%) create mode 100755 glyphs/aptos_logo_64px.gif delete mode 100644 glyphs/icon_back.gif delete mode 100644 glyphs/icon_back_x.gif delete mode 100644 glyphs/icon_certificate.gif delete mode 100644 glyphs/icon_coggle.gif delete mode 100644 glyphs/icon_crossmark.gif delete mode 100644 glyphs/icon_dashboard.gif delete mode 100644 glyphs/icon_dashboard_x.gif delete mode 100644 glyphs/icon_down.gif delete mode 100644 glyphs/icon_eye.gif delete mode 100644 glyphs/icon_left.gif delete mode 100644 glyphs/icon_processing.gif delete mode 100644 glyphs/icon_right.gif delete mode 100644 glyphs/icon_up.gif delete mode 100644 glyphs/icon_validate_14.gif delete mode 100644 glyphs/icon_warning.gif rename icons/{nanox_app_aptos.gif => app_aptos_14px.gif} (100%) rename icons/{nanos_app_aptos.gif => app_aptos_16px.gif} (100%) create mode 100755 icons/app_aptos_32px.gif create mode 100644 src/ui/common_display.c diff --git a/Makefile b/Makefile index 58b43ce..2a0ac05 100644 --- a/Makefile +++ b/Makefile @@ -51,10 +51,10 @@ APPVERSION = "$(APPVERSION_M).$(APPVERSION_N).$(APPVERSION_P)" APP_SOURCE_PATH += src # Application icons -ICON_NANOS = icons/nanos_app_aptos.gif -ICON_NANOX = icons/nanox_app_aptos.gif -ICON_NANOSP = icons/nanox_app_aptos.gif -ICON_STAX = icons/nanox_app_aptos.gif +ICON_NANOS = icons/app_aptos_16px.gif +ICON_NANOX = icons/app_aptos_14px.gif +ICON_NANOSP = icons/app_aptos_14px.gif +ICON_STAX = icons/app_aptos_32px.gif # Application allowed derivation curves CURVE_APP_LOAD_PARAMS = ed25519 diff --git a/glyphs/aptos_logo.gif b/glyphs/aptos_logo_16px.gif similarity index 100% rename from glyphs/aptos_logo.gif rename to glyphs/aptos_logo_16px.gif diff --git a/glyphs/aptos_logo_64px.gif b/glyphs/aptos_logo_64px.gif new file mode 100755 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-gNPF8h+i z#(Mch>H3D2mX`VkM*2oZxP`3=Lf^oD9vKom`v^ z4IGV}EX^$3V0vBhlS^|`^GaZPQxJOHaOwpmh};68%`T}$nPsUdZbkXI3Sf_0W#V>= zGfwlMdQ)(_#RaEceV}9XLD7p8-7q0w8Uiuli5JL$C;!wuV45!iCT_<6|Nj2@{p;tC z@87({PcxqRv3h4bgmo;iK$ z#u35cm<%;FYmM&SmXyJnS^XAT( zJ!|HS>C>i8nLKIYg#NzXp6;&Bj`p_Jmgc6$hWfhNn(C^`it@73lH#Jmg8aPPob0U3 zjP$hBl;otug!s7FnCPg;i14t`kl>)e0DnJUA8#*D4|g|LV6Zqk*xT9KSX)_In46iJ z7#kTH=@}C@U!{$jiyfNJ~jdh>MAe2nz`c@bmHVaC32Tu(PqUFf%a% wONgH=z;c3tK?g*D$_@r5iJtzIs~KwUGz+zPEiKD<-x8T<*15Dbij~0{0O2}{jsO4v diff --git a/glyphs/icon_certificate.gif b/glyphs/icon_certificate.gif deleted file mode 100644 index 89b529f792aeb77c8cc3b4d4782d8280b3c6c204..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1133 zcmZ?wbhEHbh+i z#(Mch>H3D2mX`VkM*2oZxP`3=Lf^oD9vKom`v^ z4IGV}EX^$3V0vBhlS^|`^GaZPQxJOHaOwpmh};68%`T}$nPsUdZbkXI3Sf_0W#V>= zGfwlMdQ)(_#RaEceV}9XLD7p8-7q0w8Uiuli5JL$C;!wuV45!iCT_<6|Nj2@{p;tC z@87({PcxqRv3h4bgmo;iK$ z#u35cm<%;FYmM&SmXyJnS^XAT( zJ!|HS>C>i8nLKIYg#NzXp6;&Bj`p_Jmgc6$hWfhNn(C^`it@73lH#Jmg8aPPob0U3 zjP$hBl;otug!s7FnCPg;i14t`kl>)e0DnJUA8#*D4|g|LV6Zqk*xT9KSX)_In46iJ z7#kTH=@}C@U!{$jiyfNJ~jdh>MAe2nz`c@bmHVaC32Tu(PqUFf%a% zONgH=z;c3tK?g*D$_@r5rJnxG17}|h+i z#(Mch>H3D2mX`VkM*2oZx= z8BX({dQ)(_1?YGj{?G?HMjsTtNYM=w0;VAl6P|d19C-3i%>$zB`;K7M%r?(Lh`uU@`*{_N?K$B!O9xPR~No!hr=-nf44>XplvE?zi)?(CV< zr%s+Ye(dOx!-ozY*uQV@p5424?%2L<>z2)%Hf~tIZta@Yt5&X9zHI4|#fug$m_Kjs zoY}Kx&X_)J>XgZoCQj(@>+R|8>g;H5Yi((6YHX;ltF5W7s;nq4D=jH5DlEv)%gxEo z%FIYlOHD~mN=%54i;annii`*k3k?Yl3Jmb~^Y!ue^7L?bb9Hfca&)k_v$e6dva~Qa zGc_?bGBnWF)78<|($r8_Q&mw`QdE$ala-N{l9Uh^6BQ8_5)|O)h+i z#(Mch>H3D2mX`VkM*2oZxP`3=Lf^oD9vKom`v^ z4IGV}EX^$3V0vBhlS^|`^GaZPQxJMxaOwpmh};68%`T}$nPsUdZbkXI3Sf_0W#V>= zBTn<6dQ)(_#R;cgeV}9XLD7p8-7q0w8Uiuli5JL$C;!wuV45!iCT_<6|Nj2@{p;tC z@87({PcxqRv3h4bgmo;iK$ z#u35cm<%;FYmM&SmXyJnS^XAT( zJ!|HS>C>i8nLKIYg#NzXp6;&Bj`p_Jmgc6$hWfhNn(C^`it@73lH#Jmg8aPPob0U3 zjP$hBl;otug!s7FnCPg;i14t`kl>)e0DnJUA8#*D4|g|LU=%qz*xT9KSX)_In46iJ z7#kTH=@}C@U!{$jiyfNJ~jdh>MAe2nz`c@bmHVaC32Tu(PqUFf%a% zONgH=z;c3tK?g*D$_@r5g`R%S3EQ{LsG1P=G9yPZ?_TW!_O_JIo#INXvMrLH1~M>M F0{{d^jh+i z#(Mch>H3D2mX`VkM*2oZx|Z5PF?(>IEf;+ybD@E~!PCWvMA{Mftf3V2@j6;&zJ# zPV=C8Q*gV*5~p5$pkwqw(Tfz_Fd<+X0x{u<7s!Dp|I|ESnlAz-ZpQ!r{{H#>>*tT} z-@bnN{ORL|_wU}mdHw3;i|5atK6(7;;e-44?%uh5>*kH?*REcZ;0$^0LyB;-bQW{Jh+p?5xa; z^t9BJ|cQ;oTXD3GodplbjYb#3&b2C#D zVqwaWPR5VIe^Qem-6vZZ1v^b~aWPW+p~p z3GtH!SWYl7=zs`N*}=f1)WgepeBpkH7I)L>0efyf`cv6&*0!WWPeHu$lGW7Enz_D= G4Aua{vX6rR diff --git a/glyphs/icon_dashboard_x.gif b/glyphs/icon_dashboard_x.gif deleted file mode 100644 index 33d9b0a74a263937a8cbb3b7c4ccfd4bd4fd2a3b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1126 zcmZ?wbhEHbh+i z#(Mch>H3D2mX`VkM*2oZx= z5l-`({PcxqRv3h4bgmo;iK$ z#u35cm<%;FYmM&SmXyJnS^XAT( zJ!|HS>C>i8nLKIYg#NzXp6;&Bj`p_Jmgc6$hWfhNn(C^`it@73lH#Jmg8aPPob0U3 zjP$hBl;otug!s7FnCPg;i14t`kl>)e0DnJUA8#*D4|g|L7iT9&2YWkP8*3{|3v)A5 z6JsMo1ARSR9c?X54RtkD6=fww1$jAH8EGj=32`w|5n&-g0e(JS9&Rp94t6$H7G@?! zUc-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*btCX0MpOk6^Wap-qB64UF}T4Rno+txOE8OpFwuK*`RgC?(A*$i)q66_97Elu=SrV5P5L zUS6(Ou9shwu5V~*X{m2uq;F)T3sj(6T$u;-oo-&SvJ%j-AOl=di<65o3raHc^Aw8G ztP+#*OG|8(lob9$J&;=fH#M(V59}GeYG-AXPsowK%`DC^;3VTp46jft7PnYGO%#QAmD%4lD=*GV)9Ei!<^I z6r7#GL8hSLo0y!L2NcundS0ve;2nVDi`Y;NgdWMu4QWZ>pz zXy|I@XlQBVYUE;UXz6Nc_}|je8K&7KKe;qFHLnDwIR&BF8LAmYFGwpWEr5aq7{EoD zWvMA{Mftf3V1HX>!rg-I6icj50lNgEH3i8fKwls^#1W@feV|kH(V`kA1WZ04CM4AY z(t84%^TORUA=Po(!~qs&z(JU`qar2$B!L7a`@1}1N-;w-Lrew&K=vgZQZhY z)5ZeMTG_VdAT{+S(zE>X{jm6Nr?&Zaj`McQIQehVWA};$o%uI|73_73^0#s@+FtPL0rFC}Ia4}c|0Jk%O AU;qFB diff --git a/glyphs/icon_eye.gif b/glyphs/icon_eye.gif deleted file mode 100644 index df4bb829e6d06e0bde643b1b96fde45c093edef1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1130 zcmZ?wbhEHbh+i z#(Mch>H3D2mX`VkM*2oZxP`3=Lf^oD9vKom`v^ z4IGV}EX^$3V0vBhlS^|`^GaZPQxJOHaOwpmh};68%`T}$nPsUdZbkXI3Sf_0W#V>= zGfwlMdQ)(_#RaEceV}9XLD7p8-7q0w8Uiuli5JL$C;!wuV45!iCT_<6|Nj2@{p;tC z@87({PcxqRv3h4bgmo;iK$ z#u35cm<%;FYmM&SmXyJnS^XAT( zJ!|HS>C>i8nLKIYg#NzXp6;&Bj`p_Jmgc6$hWfhNn(C^`it@73lH#Jmg8aPPob0U3 zjP$hBl;otug!s7FnCPg;i14t`kl>)e0DnJUA8#*D4|g|LV6Zqk*xT9KSX)_In46iJ z7#kTH=@}C@U!{$jiyfNJ~jdh>MAe2nz`c@bmHVaC32Tu(PqUFf%a% zONgH=z;c3tK?g*D$_@r5`JVojvmYFo*YYB?T-40^%iq9xH)NNlPJ66kronvNgOR}+ E02G{#(EtDd diff --git a/glyphs/icon_left.gif b/glyphs/icon_left.gif deleted file mode 100644 index 524226ba11247d9c5f797801400fd630071a049a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1101 zcmZ?wbhEHbWMN=u_`m=H|NsA2{K*1lD*orL$SqJvNi0bO(*Nx%3KEmEQ%e+*Qqwc@ zY?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*btCX0MpOk6^Wap-qB64UF}T4Rno+txOE8OpFwuK*`RgC?(A*$i)q66_97Elu=SrV5P5L zUS6(Ou9shwu5V~*X{m2uq;F)T3sj(6T$u;-oo-&SvJ%j-AOl=di<65o3raHc^Aw8G ztP+#*OG|8(lob9$J&;=fH#M(V59}GeYG-AXPsowK%`DC^;3VTp46jft7PnYGO%#QAmD%4lD=*GV)9Ei!<^I z6r7#GL8hSLo0y!L2NcundS0ve;2nVDkcY~W;U?r3IeWZ>*# zXy|I@XlQBVYUE;UXz6Nc_}|je8K&7KKe;qFHLnDwIR&BF45}GLFGwpWEr5aq7{EoD zWvMA{Mftf3V1HX>!rg-I6l1JT0lNgEH3i8fKwls^!~~~SeV|kH(V`kA1WZ04CM4AY z(t84%^TORUA=Po(!~qs&z(JU`qar2$B!L7a`@1}1N-;w-Lrew&K=vgZQZhY z)5ZeMTG_VdAT{+S(zE>X{jm6Nr?&Zaj`McQIQehVWA};$o%uI|73_73^0#s@+FmbdLb7tJW=fuch4FGsN BgIfRq diff --git a/glyphs/icon_processing.gif b/glyphs/icon_processing.gif deleted file mode 100644 index 8fe937facc2d11dfa878b61d3f46055ae87996e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1130 zcmZ?wbhEHbh+i z#(Mch>H3D2mX`VkM*2oZx= z8BX({dQ)(_1?YGj{?G?HMjsTtNYM=w0;VAl6P|d19C-3i%>$zB`;K7M%r?(Lh`uU@`*{_N?K$B!O9xPR~No!hr=-nf44>XplvE?zi)?(CV< zr%s+Ye(dOx!-ozY*uQV@p5424?%2L<>z2)%Hf~tIZta@Yt5&X9zHI4|#fug$m_Kjs zoY}Kx&X_)J>XgZoCQj(@>+R|8>g;H5Yi((6YHX;ltF5W7s;nq4D=jH5DlEv)%gxEo z%FIYlOHD~mN=%54i;annii`*k3k?Yl3Jmb~^Y!ue^7L?bb9Hfca&)k_v$e6dva~Qa zGc_?bGBnWF)78<|($r8_Q&mw`QdE$ala-N{l9Uh^6BQ8_5)|O)c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*btCX0MpOk6^Wap-qB64UF}T4Rno+txOE8OpFwuK*`RgC?(A*$i)q66_97Elu=SrV5P5L zUS6(Ou9shwu5V~*X{m2uq;F)T3sj(6T$u;-oo-&SvJ%j-AOl=di<65o3raHc^Aw8G ztP+#*OG|8(lob9$J&;=fH#M(V59}GeYG-AXPsowK%`DC^;3VTp46jft7PnYGO%#QAmD%4lD=*GV)9Ei!<^I z6r7#GL8hSLo0y!L2NcundS0ve;2nVDkcY~W;U?r3IcWZ>*# zXy|I@XlQBVYUE;UXz6Nc_}|je8K&7KKe;qFHLnDwIR&BF2&x%HFGwpWEr5aq7{EoD zWvMA{Mftf3V1HX>!rg-A6jL{>P64|FqBRA{B|u*wIm7^`R(+sT^wFXkCIn1AASNW$ z0@Eju15Nk;OB7P`fT_I*n5-H9|NHyr_phHnzJL4r<@2Wx@87+B^ZM1x7tfzPee(Fx z!w2{8-Mw@B*3BE&uU)-z`O?J;=g*xzbNbZD6UUDoJ#zTa!2|pE?cK9`*UlZ=w{6|B zdDF%X>({MavwGFa70Z_`U9x!5!Ugl^&7CuQ*322xr%jzQdD6rQ{e8VX-Cdm>?QN|s z%}tFB^>wv1)m4=h1nAc$w`R`@o}*+(NU2R;bEa6!9jrm z{(inb-d>&_?ryFw&Q6XF_I9>5)>f7l=4PfQ#zuw)`g*!L+FF_#>T0Sg%1Vj~@^Z2= z(o&KV;$osA!a{-q{CvDTJltHI9PDhYEX+)d3=BG;5&~3eFfg(6@U>OF>g8gv1_1YR Bf|mdQ diff --git a/glyphs/icon_up.gif b/glyphs/icon_up.gif deleted file mode 100644 index 4e13c064f7605feb2e6e04a48a3133e5c95912cb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1100 zcmZ?wbhEHbWM^Pu_`m=H|NsA2{K*1lD*orL$SqJvNi0bO(*Nx%3KEmEQ%e+*Qqwc@ zY?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*btCX0MpOk6^Wap-qB64UF}T4Rno+txOE8OpFwuK*`RgC?(A*$i)q66_97Elu=SrV5P5L zUS6(Ou9shwu5V~*X{m2uq;F)T3sj(6T$u;-oo-&SvJ%j-AOl=di<65o3raHc^Aw8G ztP+#*OG|8(lob9$J&;=fH#M(V59}GeYG-AXPsowK%`DC^;3VTp46jft7PnYGO%#QAmD%4lD=*GV)9Ei!<^I z6r7#GL8hSLo0y!L2NcundS0ve;2nVDi`Y;NgdWMu4SWZ>pz zXy|I@XlQBVYUE;UXz6Nc_}|je8K&7KKe;qFHLnDwIR&oS!~m)pMK4GzC@p}31Q@_Y znPsUdZbkXI3SfU*Wy0Np?i3fSP64|FqBRA{B|u*w9AfN>Q>#AEDf(zp4HE(;9}p9g zYJuq!$bqK&|0N2kdBD_O1WeY9|Ns5{^ZVD&AK$-y{qp(KhxhN^zIpxX<%{Rfo<4c} z=;4F=_wL@gee33p>({PcxqRv3h4bgmo;iK$#u35cm<%;FYmM&SmXyJnS^XAT(J!|HS>C>i8nLKIYg#NzXp6;&Bj`p_J zmgc6$hWfhNn(C^`it@73lH#Jmg8aPPob0U3jP$hBl;otug!s7FnCPg;i14t`kl>)e z0DnJUA8#*D4|g|L7iT9&2YWkP8*3{|3v)A56JsMo1ARSR9c?X54RtkD6=fww1$jAH z8EGj=32`w|5n&-g0e(JS9v*HkP7Zc9Ru*O^Mg|5QPzeDlH5i!KTar5~xYlqnSOWmI C)q;Qk diff --git a/glyphs/icon_validate_14.gif b/glyphs/icon_validate_14.gif deleted file mode 100644 index ccb5cabe38d16ff857d540b64742e4b8346a6949..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1125 zcmZ?wbhEHbh+i z#(Mch>H3D2mX`VkM*2oZx= z0Z#LvdQ)(_#So`neV}9XLD7p8-7q0w8Uiuli5JL$C;!wuV45!iCT_<6|Nj2@{p;tC z@87({PcxqRv3h4bgmo;iK$ z#u35cm<%;FYmM&SmXyJnS^XAT( zJ!|HS>C>i8nLKIYg#NzXp6;&Bj`p_Jmgc6$hWfhNn(C^`it@73lH#Jmg8aPPob0U3 zjP$hBl;otug!s7FnCPg;i14t`kl>)e0DnJUA8#*D4|g|L7iT9&2YWkP8*3{|3v)A5 z6JsMo1ARSR9c?X54RtkD6=fww1$jAH8EGj=32`w|5n&-g0e(JS9&Rp94t6$H7G@?! zUh+i z#(Mch>H3D2mX`VkM*2oZxP`3=Lf^oD9vKom`v^ z4IGV}EX^$3V0vBhlS^|`^GaZPQxJMhaOwpmh};68%`T}$nPsUdZbkXI3Sf_0W#V>= zAx`t4dQ)(_#R#WfeV}9XLD7p8-7q0w8Uiuli5JL$C;!wuV45!iCT_<6|Nj2@{p;tC z@87({PcxqRv3h4bgmo;iK$ z#u35cm<%;FYmM&SmXyJnS^XAT( zJ!|HS>C>i8nLKIYg#NzXp6;&Bj`p_Jmgc6$hWfhNn(C^`it@73lH#Jmg8aPPob0U3 zjP$hBl;otug!s7FnCPg;i14t`kl>)e0DnJUA8#*D4|g|L7iT9&2YWkP8*3{|3v)A5 z6JsMo1ARSR9c?X54RtkD6=fww1$jAH8EGj=32`w|5n&-g0e(JS9&Rp94t6$H7G@?! zUKIUBc02Qn~N0|4sJF$(|y literal 0 HcmV?d00001 diff --git a/src/globals.h b/src/globals.h index 3ca735e..e1c75e4 100644 --- a/src/globals.h +++ b/src/globals.h @@ -8,21 +8,6 @@ #include "types.h" #include "constants.h" -/** - * Global buffer for interactions between SE and MCU. - */ -extern uint8_t G_io_seproxyhal_spi_buffer[IO_SEPROXYHAL_BUFFER_SIZE_B]; - -/** - * Global structure to perform asynchronous UX aside IO operations. - */ -extern ux_state_t G_ux; - -/** - * Global structure with the parameters to exchange with the BOLOS UX application. - */ -extern bolos_ux_params_t G_ux_params; - /** * Global context for user requests. */ diff --git a/src/ui/bagl_display.c b/src/ui/bagl_display.c index f7a7cfe..8772efb 100644 --- a/src/ui/bagl_display.c +++ b/src/ui/bagl_display.c @@ -45,8 +45,6 @@ static action_validate_cb g_validate_callback; static action_extend_ctx_t g_allow_blind_sign_ctx; static char g_amount[30]; static char g_gas_fee[30]; -static char g_bip32_path[60]; -static char g_address[67]; static char g_function[120]; static char g_struct[120]; @@ -191,32 +189,14 @@ UX_FLOW(ux_display_pubkey_flow, &ux_display_reject_step); int ui_display_address() { - if (G_context.req_type != CONFIRM_ADDRESS) { - return io_send_sw(SW_BAD_STATE); - } - - memset(g_bip32_path, 0, sizeof(g_bip32_path)); - if (!bip32_path_format(G_context.bip32_path, - G_context.bip32_path_len, - g_bip32_path, - sizeof(g_bip32_path))) { - return io_send_sw(SW_DISPLAY_BIP32_PATH_FAIL); - } - - memset(g_address, 0, sizeof(g_address)); - uint8_t address[ADDRESS_LEN] = {0}; - if (!address_from_pubkey(G_context.pk_info.raw_public_key, address, sizeof(address))) { - return io_send_sw(SW_DISPLAY_ADDRESS_FAIL); - } - if (0 > format_prefixed_hex(address, sizeof(address), g_address, sizeof(g_address))) { - return io_send_sw(SW_DISPLAY_ADDRESS_FAIL); + const int ret = ui_prepare_address(); + if (ret == UI_PREPARED) { + g_validate_callback = &ui_action_validate_pubkey; + ui_flow_display(ux_display_pubkey_flow); + return 0; } - g_validate_callback = &ui_action_validate_pubkey; - - ui_flow_display(ux_display_pubkey_flow); - - return 0; + return ret; } // Step with icon and text diff --git a/src/ui/bagl_menu.c b/src/ui/bagl_menu.c index 4cb5b8c..6a6a906 100644 --- a/src/ui/bagl_menu.c +++ b/src/ui/bagl_menu.c @@ -26,7 +26,7 @@ #include "settings.h" #include "bagl_display.h" -UX_STEP_NOCB(ux_menu_ready_step, pnn, {&C_aptos_logo, "Aptos", "is ready"}); +UX_STEP_NOCB(ux_menu_ready_step, pnn, {&C_aptos_logo_16px, "Aptos", "is ready"}); UX_STEP_CB(ux_menu_settings_step, pb, ui_menu_settings(), {&C_icon_coggle, "Settings"}); UX_STEP_CB(ux_menu_about_step, pb, ui_menu_about(), {&C_icon_certificate, "About"}); UX_STEP_VALID(ux_menu_exit_step, pb, os_sched_exit(-1), {&C_icon_dashboard_x, "Quit"}); diff --git a/src/ui/common_display.c b/src/ui/common_display.c new file mode 100644 index 0000000..df59829 --- /dev/null +++ b/src/ui/common_display.c @@ -0,0 +1,65 @@ +/***************************************************************************** + * Ledger App Aptos. + * (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 // bool +#include // memset + +#include "os.h" +#include "ux.h" +#include "glyphs.h" +#include "io.h" +#include "bip32.h" +#include "format.h" + +#include "display.h" +#include "settings.h" +#include "menu.h" +#include "constants.h" +#include "../globals.h" +#include "../sw.h" +#include "../address.h" +#include "action/validate.h" +#include "../transaction/types.h" +#include "../common/user_format.h" + +char g_bip32_path[60]; +char g_address[67]; + +int ui_prepare_address() { + if (G_context.req_type != CONFIRM_ADDRESS) { + return io_send_sw(SW_BAD_STATE); + } + + memset(g_bip32_path, 0, sizeof(g_bip32_path)); + if (!bip32_path_format(G_context.bip32_path, + G_context.bip32_path_len, + g_bip32_path, + sizeof(g_bip32_path))) { + return io_send_sw(SW_DISPLAY_BIP32_PATH_FAIL); + } + + memset(g_address, 0, sizeof(g_address)); + uint8_t address[ADDRESS_LEN] = {0}; + if (!address_from_pubkey(G_context.pk_info.raw_public_key, address, sizeof(address))) { + return io_send_sw(SW_DISPLAY_ADDRESS_FAIL); + } + if (0 > format_prefixed_hex(address, sizeof(address), g_address, sizeof(g_address))) { + return io_send_sw(SW_DISPLAY_ADDRESS_FAIL); + } + + return UI_PREPARED; +} diff --git a/src/ui/display.h b/src/ui/display.h index f4371af..7579706 100644 --- a/src/ui/display.h +++ b/src/ui/display.h @@ -3,6 +3,11 @@ #include // bool #include "ux.h" +#define UI_PREPARED -10 + +extern char g_bip32_path[60]; +extern char g_address[67]; + /** * Callback to reuse action with approve/reject in step FLOW. */ @@ -16,6 +21,8 @@ typedef void (*action_validate_cb)(bool); */ int ui_display_address(void); +int ui_prepare_address(void); + /** * Display transaction information on the device and ask confirmation to sign. * From 3022d1fe523d953909fde5e1e01bff23729d3530 Mon Sep 17 00:00:00 2001 From: vldmkr Date: Wed, 5 Jul 2023 18:53:24 +0300 Subject: [PATCH 07/32] Implement the UI for Ledger Stax - Add MAX_TRANSACTION_PACKETS to Makefile for TARGET_STAX - Separate the common UI code - Put general functions into utils - Refactor BAGL UI (display, menu, settings) - Implement NBGL UI (display, menu, settings) --- .vscode/c_cpp_properties.json | 6 +- Makefile | 4 + src/common/user_format.c | 21 +++- src/common/user_format.h | 7 +- src/ui/bagl_display.c | 193 ++++------------------------- src/ui/bagl_display.h | 5 + src/ui/bagl_menu.c | 4 - src/ui/bagl_settings.c | 18 +-- src/ui/common_display.c | 165 ++++++++++++++++++++++++- src/ui/common_settings.c | 29 +++++ src/ui/display.h | 17 ++- src/ui/nbgl_display.c | 92 ++++++++++++++ src/ui/nbgl_display.h | 23 ++++ src/ui/nbgl_display_address.c | 71 +++++++++++ src/ui/nbgl_display_message.c | 92 ++++++++++++++ src/ui/nbgl_display_transaction.c | 196 ++++++++++++++++++++++++++++++ src/ui/nbgl_menu.c | 110 +++++++++++++++++ src/ui/settings.h | 6 - 18 files changed, 855 insertions(+), 204 deletions(-) create mode 100644 src/ui/common_settings.c create mode 100644 src/ui/nbgl_display.c create mode 100644 src/ui/nbgl_display.h create mode 100644 src/ui/nbgl_display_address.c create mode 100755 src/ui/nbgl_display_message.c create mode 100755 src/ui/nbgl_display_transaction.c create mode 100644 src/ui/nbgl_menu.c diff --git a/.vscode/c_cpp_properties.json b/.vscode/c_cpp_properties.json index 8f5af08..82f13c1 100644 --- a/.vscode/c_cpp_properties.json +++ b/.vscode/c_cpp_properties.json @@ -13,11 +13,14 @@ "${env:BOLOS_SDK}/lib_ux/include/*", "${env:BOLOS_SDK}/lib_cxng/include/*", "${env:BOLOS_SDK}/lib_bagl/include/*", + "${env:BOLOS_SDK}/lib_nbgl/include/*", "${env:BOLOS_SDK}/lib_standard_app/*", "${env:BOLOS_SDK}/target/nanos2/include", - "./build/nanos2/gen_src" + // "./build/nanos2/gen_src" + "./build/stax/gen_src" ], "defines": [ + "HAVE_PIEZO_SOUND", "TARGET_NANOS", "OS_IO_SEPROXYHAL", "HAVE_ECC", @@ -31,6 +34,7 @@ "HAVE_ECC_WEIERSTRASS", "HAVE_SECP256K1_CURVE", "HAVE_BAGL", + "HAVE_NBGL", "HAVE_SPRINTF", "HAVE_IO_USB", "HAVE_L4_USBLIB", diff --git a/Makefile b/Makefile index 2a0ac05..5229620 100644 --- a/Makefile +++ b/Makefile @@ -34,6 +34,10 @@ endif ifeq ($(TARGET_NAME),TARGET_NANOX) DEFINES += MAX_TRANSACTION_PACKETS=90 endif +ifeq ($(TARGET_NAME),TARGET_STAX) + # still need to find the right value + DEFINES += MAX_TRANSACTION_PACKETS=70 +endif ######################################## # Mandatory configuration # diff --git a/src/common/user_format.c b/src/common/user_format.c index 848475f..0e638e7 100644 --- a/src/common/user_format.c +++ b/src/common/user_format.c @@ -15,9 +15,10 @@ * limitations under the License. *****************************************************************************/ -#include // size_t -#include // int*_t, uint*_t -#include // strncpy, memmove +#include // bool +#include // size_t +#include // int*_t, uint*_t +#include // strncpy, memmove #include "format.h" @@ -33,3 +34,17 @@ int format_prefixed_hex(const uint8_t *in, size_t in_len, char *out, size_t out_ strncpy(out, prefix, sizeof(prefix)); return format_hex(in, in_len, out + prefix_len, out_len - prefix_len); } + +bool is_str_interrupted(const char *src, size_t len) { + bool interrupted = false; + for (size_t i = 0; i < len; i++) { + if (!interrupted && src[i] == 0) { + interrupted = true; + continue; + } + if (interrupted && src[i] != 0) { + return true; + } + } + return false; +} diff --git a/src/common/user_format.h b/src/common/user_format.h index 1857462..3b55f58 100644 --- a/src/common/user_format.h +++ b/src/common/user_format.h @@ -1,7 +1,8 @@ #pragma once -#include // size_t -#include // int*_t, uint*_t +#include // bool +#include // size_t +#include // int*_t, uint*_t /** * Format byte buffer to uppercase hexadecimal string prefixed with '0x'. @@ -19,3 +20,5 @@ * */ int format_prefixed_hex(const uint8_t *in, size_t in_len, char *out, size_t out_len); + +bool is_str_interrupted(const char *src, size_t len); diff --git a/src/ui/bagl_display.c b/src/ui/bagl_display.c index 8772efb..e2192b4 100644 --- a/src/ui/bagl_display.c +++ b/src/ui/bagl_display.c @@ -24,8 +24,6 @@ #include "ux.h" #include "glyphs.h" #include "io.h" -#include "bip32.h" -#include "format.h" #include "bagl_display.h" #include "display.h" @@ -34,19 +32,13 @@ #include "constants.h" #include "../globals.h" #include "../sw.h" -#include "../address.h" #include "action/validate.h" -#include "../transaction/types.h" #include "../common/user_format.h" #define DOTS "[...]" static action_validate_cb g_validate_callback; static action_extend_ctx_t g_allow_blind_sign_ctx; -static char g_amount[30]; -static char g_gas_fee[30]; -static char g_function[120]; -static char g_struct[120]; // Validate/Invalidate public key and go back to home static void ui_action_validate_pubkey(bool choice) { @@ -69,29 +61,6 @@ static void ui_action_allow_blind_signing(const ux_flow_step_t *const *steps) { ux_flow_init(0, steps, steps[1]); } -static size_t count_leading_zeros(const uint8_t *src, size_t len) { - for (size_t i = 0; i < len; i++) { - if (src[i] != 0) { - return i; - } - } - return len; -} - -static bool is_str_interrupted(const char *src, size_t len) { - bool interrupted = false; - for (size_t i = 0; i < len; i++) { - if (!interrupted && src[i] == 0) { - interrupted = true; - continue; - } - if (interrupted && src[i] != 0) { - return true; - } - } - return false; -} - #ifdef TARGET_NANOS UX_STEP_NOCB(ux_display_blind_sign_banner_step, bnnn_paging, @@ -189,9 +158,10 @@ UX_FLOW(ux_display_pubkey_flow, &ux_display_reject_step); int ui_display_address() { + g_validate_callback = &ui_action_validate_pubkey; + const int ret = ui_prepare_address(); if (ret == UI_PREPARED) { - g_validate_callback = &ui_action_validate_pubkey; ui_flow_display(ux_display_pubkey_flow); return 0; } @@ -373,58 +343,15 @@ UX_FLOW(ux_display_tx_coin_transfer_flow, &ux_display_reject_step); int ui_display_transaction() { - if (G_context.req_type != CONFIRM_TRANSACTION || G_context.state != STATE_PARSED) { - G_context.state = STATE_NONE; - return io_send_sw(SW_BAD_STATE); - } - g_validate_callback = &ui_action_validate_transaction; - transaction_t *transaction = &G_context.tx_info.transaction; - - if (transaction->tx_variant == TX_MESSAGE) { - return ui_display_message(); - } else if (transaction->tx_variant != TX_UNDEFINED) { - uint64_t gas_fee_value = transaction->gas_unit_price * transaction->max_gas_amount; - memset(g_gas_fee, 0, sizeof(g_gas_fee)); - char gas_fee[30] = {0}; - if (!format_fpu64(gas_fee, sizeof(gas_fee), gas_fee_value, 8)) { - return io_send_sw(SW_DISPLAY_GAS_FEE_FAIL); - } - snprintf(g_gas_fee, sizeof(g_gas_fee), "APT %.*s", sizeof(gas_fee), gas_fee); - PRINTF("Gas Fee: %s\n", g_gas_fee); - - if (transaction->tx_variant == TX_RAW) { - switch (transaction->payload_variant) { - case PAYLOAD_ENTRY_FUNCTION: - return ui_display_entry_function(); - case PAYLOAD_SCRIPT: - memset(g_struct, 0, sizeof(g_struct)); - snprintf(g_struct, - sizeof(g_struct), - "%s [payload = SCRIPT]", - RAW_TRANSACTION_SALT); - break; - default: - memset(g_struct, 0, sizeof(g_struct)); - snprintf(g_struct, - sizeof(g_struct), - "%s [payload = UNKNOWN]", - RAW_TRANSACTION_SALT); - break; - } - } else if (transaction->tx_variant == TX_RAW_WITH_DATA) { - memset(g_struct, 0, sizeof(g_struct)); - snprintf(g_struct, sizeof(g_struct), RAW_TRANSACTION_WITH_DATA_SALT); - } - } else { - memset(g_struct, 0, sizeof(g_struct)); - snprintf(g_struct, sizeof(g_struct), "unknown data type"); + const int ret = ui_prepare_transaction(); + if (ret == UI_PREPARED) { + ui_flow_verified_display(ux_display_blind_tx_default_flow); + return 0; } - ui_flow_verified_display(ux_display_blind_tx_default_flow); - - return 0; + return ret; } int ui_display_message() { @@ -460,107 +387,33 @@ int ui_display_message() { } int ui_display_entry_function() { - entry_function_payload_t *function = &G_context.tx_info.transaction.payload.entry_function; - char function_module_id_address_hex[67] = {0}; - - // Be sure to display at least 1 byte, even if it is zero - size_t leading_zeros = count_leading_zeros(function->module_id.address, ADDRESS_LEN - 1); - if (0 > format_prefixed_hex(function->module_id.address + leading_zeros, - ADDRESS_LEN - leading_zeros, - function_module_id_address_hex, - sizeof(function_module_id_address_hex))) { - return io_send_sw(SW_DISPLAY_ADDRESS_FAIL); - } - memset(g_function, 0, sizeof(g_function)); - snprintf(g_function, - sizeof(g_function), - "%s::%.*s::%.*s", - function_module_id_address_hex, - function->module_id.name.len, - function->module_id.name.bytes, - function->function_name.len, - function->function_name.bytes); - PRINTF("Function: %s\n", g_function); - - switch (function->known_type) { - case FUNC_APTOS_ACCOUNT_TRANSFER: - return ui_display_tx_aptos_account_transfer(); - case FUNC_COIN_TRANSFER: - return ui_display_tx_coin_transfer(); - default: - ui_flow_verified_display(ux_display_blind_tx_entry_function_flow); - break; + const int ret = ui_prepare_entry_function(); + if (ret == UI_PREPARED) { + ui_flow_verified_display(ux_display_blind_tx_entry_function_flow); + return 0; } - return 0; + + return ret; } int ui_display_tx_aptos_account_transfer() { - agrs_aptos_account_trasfer_t *transfer = - &G_context.tx_info.transaction.payload.entry_function.args.transfer; - - // For well-known functions, display the transaction type in human-readable format - memset(g_struct, 0, sizeof(g_struct)); - snprintf(g_struct, sizeof(g_struct), "APT transfer"); - PRINTF("Tx Type: %s\n", g_struct); - - memset(g_address, 0, sizeof(g_address)); - if (0 > format_prefixed_hex(transfer->receiver, ADDRESS_LEN, g_address, sizeof(g_address))) { - return io_send_sw(SW_DISPLAY_ADDRESS_FAIL); - } - PRINTF("Receiver: %s\n", g_address); - - memset(g_amount, 0, sizeof(g_amount)); - char amount[30] = {0}; - if (!format_fpu64(amount, sizeof(amount), transfer->amount, 8)) { - return io_send_sw(SW_DISPLAY_AMOUNT_FAIL); + const int ret = ui_prepare_tx_aptos_account_transfer(); + if (ret == UI_PREPARED) { + ui_flow_display(ux_display_tx_aptos_account_transfer_flow); + return 0; } - snprintf(g_amount, sizeof(g_amount), "APT %.*s", sizeof(amount), amount); - PRINTF("Amount: %s\n", g_amount); - ui_flow_display(ux_display_tx_aptos_account_transfer_flow); - - return 0; + return ret; } int ui_display_tx_coin_transfer() { - agrs_coin_trasfer_t *transfer = - &G_context.tx_info.transaction.payload.entry_function.args.coin_transfer; - char transfer_ty_coin_address_hex[67] = {0}; - - // Be sure to display at least 1 byte, even if it is zero - size_t leading_zeros = count_leading_zeros(transfer->ty_coin.address, ADDRESS_LEN - 1); - if (0 > format_prefixed_hex(transfer->ty_coin.address + leading_zeros, - ADDRESS_LEN - leading_zeros, - transfer_ty_coin_address_hex, - sizeof(transfer_ty_coin_address_hex))) { - return io_send_sw(SW_DISPLAY_ADDRESS_FAIL); - } - memset(g_struct, 0, sizeof(g_struct)); - snprintf(g_struct, - sizeof(g_struct), - "%s::%.*s::%.*s", - transfer_ty_coin_address_hex, - transfer->ty_coin.module_name.len, - transfer->ty_coin.module_name.bytes, - transfer->ty_coin.name.len, - transfer->ty_coin.name.bytes); - PRINTF("Coin Type: %s\n", g_struct); - - memset(g_address, 0, sizeof(g_address)); - if (0 > format_prefixed_hex(transfer->receiver, ADDRESS_LEN, g_address, sizeof(g_address))) { - return io_send_sw(SW_DISPLAY_ADDRESS_FAIL); - } - PRINTF("Receiver: %s\n", g_address); - - memset(g_amount, 0, sizeof(g_amount)); - if (!format_fpu64(g_amount, sizeof(g_amount), transfer->amount, 8)) { - return io_send_sw(SW_DISPLAY_AMOUNT_FAIL); + const int ret = ui_prepare_tx_coin_transfer(); + if (ret == UI_PREPARED) { + ui_flow_display(ux_display_tx_coin_transfer_flow); + return 0; } - PRINTF("Amount: %s\n", g_amount); - - ui_flow_display(ux_display_tx_coin_transfer_flow); - return 0; + return ret; } #endif diff --git a/src/ui/bagl_display.h b/src/ui/bagl_display.h index 48bf04d..94589d5 100644 --- a/src/ui/bagl_display.h +++ b/src/ui/bagl_display.h @@ -3,6 +3,11 @@ #include // bool #include "ux.h" +/** + * Callback to reuse action with approve/reject in step FLOW. + */ +typedef void (*action_validate_cb)(bool); + /** * A convenient function for displaying the sequence of steps. */ diff --git a/src/ui/bagl_menu.c b/src/ui/bagl_menu.c index 6a6a906..6138b61 100644 --- a/src/ui/bagl_menu.c +++ b/src/ui/bagl_menu.c @@ -51,10 +51,6 @@ void ui_menu_main() { ui_flow_display(ux_menu_main_flow); } -void ui_menu_settings() { - ux_menulist_init(0, settings_submenu_getter, settings_submenu_selector); -} - UX_STEP_NOCB(ux_menu_info_step, bn, {"Aptos App", "(c) 2022 Pontem"}); UX_STEP_NOCB(ux_menu_version_step, bn, {"Version", APPVERSION}); UX_STEP_CB(ux_menu_back_step, pb, ui_menu_main(), {&C_icon_back, "Back"}); diff --git a/src/ui/bagl_settings.c b/src/ui/bagl_settings.c index ed68632..987993e 100644 --- a/src/ui/bagl_settings.c +++ b/src/ui/bagl_settings.c @@ -23,6 +23,12 @@ #include "menu.h" #include "../globals.h" +static const char* settings_submenu_getter(unsigned int idx); + +static void settings_submenu_selector(unsigned int idx); + +enum menu_options { MENU_SHOW_FULL_MSG = 0, MENU_ALLOW_BLIND_SIGNING = 1 }; + static const char* const binary_choice_getter_values[] = {"No", "Yes", "Back"}; static const char* binary_choice_getter(unsigned int idx) { @@ -58,14 +64,14 @@ static const char* const settings_submenu_getter_values[] = { "Back", }; -const char* settings_submenu_getter(unsigned int idx) { +static const char* settings_submenu_getter(unsigned int idx) { if (idx < ARRAYLEN(settings_submenu_getter_values)) { return settings_submenu_getter_values[idx]; } return NULL; } -void settings_submenu_selector(unsigned int idx) { +static void settings_submenu_selector(unsigned int idx) { switch (idx) { case MENU_SHOW_FULL_MSG: ux_menulist_init_select(0, @@ -84,12 +90,8 @@ void settings_submenu_selector(unsigned int idx) { } } -void settings_show_full_message_change(uint8_t value) { - nvm_write((void*) &N_storage.settings.show_full_message, &value, sizeof(value)); -} - -void settings_allow_blind_signing_change(uint8_t value) { - nvm_write((void*) &N_storage.settings.allow_blind_signing, &value, sizeof(value)); +void ui_menu_settings() { + ux_menulist_init(0, settings_submenu_getter, settings_submenu_selector); } #endif diff --git a/src/ui/common_display.c b/src/ui/common_display.c index df59829..e4ea779 100644 --- a/src/ui/common_display.c +++ b/src/ui/common_display.c @@ -27,7 +27,6 @@ #include "display.h" #include "settings.h" -#include "menu.h" #include "constants.h" #include "../globals.h" #include "../sw.h" @@ -38,6 +37,19 @@ char g_bip32_path[60]; char g_address[67]; +char g_gas_fee[30]; +char g_struct[120]; +char g_function[120]; +char g_amount[30]; + +static size_t count_leading_zeros(const uint8_t *src, size_t len) { + for (size_t i = 0; i < len; i++) { + if (src[i] != 0) { + return i; + } + } + return len; +} int ui_prepare_address() { if (G_context.req_type != CONFIRM_ADDRESS) { @@ -63,3 +75,154 @@ int ui_prepare_address() { return UI_PREPARED; } + +int ui_prepare_transaction() { + if (G_context.req_type != CONFIRM_TRANSACTION || G_context.state != STATE_PARSED) { + G_context.state = STATE_NONE; + return io_send_sw(SW_BAD_STATE); + } + + transaction_t *transaction = &G_context.tx_info.transaction; + + if (transaction->tx_variant == TX_MESSAGE) { + return ui_display_message(); + } else if (transaction->tx_variant != TX_UNDEFINED) { + uint64_t gas_fee_value = transaction->gas_unit_price * transaction->max_gas_amount; + memset(g_gas_fee, 0, sizeof(g_gas_fee)); + char gas_fee[30] = {0}; + if (!format_fpu64(gas_fee, sizeof(gas_fee), gas_fee_value, 8)) { + return io_send_sw(SW_DISPLAY_GAS_FEE_FAIL); + } + snprintf(g_gas_fee, sizeof(g_gas_fee), "APT %.*s", sizeof(gas_fee), gas_fee); + PRINTF("Gas Fee: %s\n", g_gas_fee); + + if (transaction->tx_variant == TX_RAW) { + switch (transaction->payload_variant) { + case PAYLOAD_ENTRY_FUNCTION: + return ui_display_entry_function(); + case PAYLOAD_SCRIPT: + memset(g_struct, 0, sizeof(g_struct)); + snprintf(g_struct, + sizeof(g_struct), + "%s [payload = SCRIPT]", + RAW_TRANSACTION_SALT); + break; + default: + memset(g_struct, 0, sizeof(g_struct)); + snprintf(g_struct, + sizeof(g_struct), + "%s [payload = UNKNOWN]", + RAW_TRANSACTION_SALT); + break; + } + } else if (transaction->tx_variant == TX_RAW_WITH_DATA) { + memset(g_struct, 0, sizeof(g_struct)); + snprintf(g_struct, sizeof(g_struct), RAW_TRANSACTION_WITH_DATA_SALT); + } + } else { + memset(g_struct, 0, sizeof(g_struct)); + snprintf(g_struct, sizeof(g_struct), "unknown data type"); + } + + return UI_PREPARED; +} + +int ui_prepare_entry_function() { + entry_function_payload_t *function = &G_context.tx_info.transaction.payload.entry_function; + char function_module_id_address_hex[67] = {0}; + + // Be sure to display at least 1 byte, even if it is zero + size_t leading_zeros = count_leading_zeros(function->module_id.address, ADDRESS_LEN - 1); + if (0 > format_prefixed_hex(function->module_id.address + leading_zeros, + ADDRESS_LEN - leading_zeros, + function_module_id_address_hex, + sizeof(function_module_id_address_hex))) { + return io_send_sw(SW_DISPLAY_ADDRESS_FAIL); + } + memset(g_function, 0, sizeof(g_function)); + snprintf(g_function, + sizeof(g_function), + "%s::%.*s::%.*s", + function_module_id_address_hex, + function->module_id.name.len, + function->module_id.name.bytes, + function->function_name.len, + function->function_name.bytes); + PRINTF("Function: %s\n", g_function); + + switch (function->known_type) { + case FUNC_APTOS_ACCOUNT_TRANSFER: + return ui_display_tx_aptos_account_transfer(); + case FUNC_COIN_TRANSFER: + return ui_display_tx_coin_transfer(); + default: + break; + } + + return UI_PREPARED; +} + +int ui_prepare_tx_aptos_account_transfer() { + agrs_aptos_account_trasfer_t *transfer = + &G_context.tx_info.transaction.payload.entry_function.args.transfer; + + // For well-known functions, display the transaction type in human-readable format + memset(g_struct, 0, sizeof(g_struct)); + snprintf(g_struct, sizeof(g_struct), "APT transfer"); + PRINTF("Tx Type: %s\n", g_struct); + + memset(g_address, 0, sizeof(g_address)); + if (0 > format_prefixed_hex(transfer->receiver, ADDRESS_LEN, g_address, sizeof(g_address))) { + return io_send_sw(SW_DISPLAY_ADDRESS_FAIL); + } + PRINTF("Receiver: %s\n", g_address); + + memset(g_amount, 0, sizeof(g_amount)); + char amount[30] = {0}; + if (!format_fpu64(amount, sizeof(amount), transfer->amount, 8)) { + return io_send_sw(SW_DISPLAY_AMOUNT_FAIL); + } + snprintf(g_amount, sizeof(g_amount), "APT %.*s", sizeof(amount), amount); + PRINTF("Amount: %s\n", g_amount); + + return UI_PREPARED; +} + +int ui_prepare_tx_coin_transfer() { + agrs_coin_trasfer_t *transfer = + &G_context.tx_info.transaction.payload.entry_function.args.coin_transfer; + char transfer_ty_coin_address_hex[67] = {0}; + + // Be sure to display at least 1 byte, even if it is zero + size_t leading_zeros = count_leading_zeros(transfer->ty_coin.address, ADDRESS_LEN - 1); + if (0 > format_prefixed_hex(transfer->ty_coin.address + leading_zeros, + ADDRESS_LEN - leading_zeros, + transfer_ty_coin_address_hex, + sizeof(transfer_ty_coin_address_hex))) { + return io_send_sw(SW_DISPLAY_ADDRESS_FAIL); + } + memset(g_struct, 0, sizeof(g_struct)); + snprintf(g_struct, + sizeof(g_struct), + "%s::%.*s::%.*s", + transfer_ty_coin_address_hex, + transfer->ty_coin.module_name.len, + transfer->ty_coin.module_name.bytes, + transfer->ty_coin.name.len, + transfer->ty_coin.name.bytes); + PRINTF("Coin Type: %s\n", g_struct); + + memset(g_address, 0, sizeof(g_address)); + if (0 > format_prefixed_hex(transfer->receiver, ADDRESS_LEN, g_address, sizeof(g_address))) { + return io_send_sw(SW_DISPLAY_ADDRESS_FAIL); + } + PRINTF("Receiver: %s\n", g_address); + + memset(g_amount, 0, sizeof(g_amount)); + if (!format_fpu64(g_amount, sizeof(g_amount), transfer->amount, 8)) { + return io_send_sw(SW_DISPLAY_AMOUNT_FAIL); + } + PRINTF("Amount: %s\n", g_amount); + + return UI_PREPARED; +} diff --git a/src/ui/common_settings.c b/src/ui/common_settings.c new file mode 100644 index 0000000..f1bf7bc --- /dev/null +++ b/src/ui/common_settings.c @@ -0,0 +1,29 @@ +/***************************************************************************** + * Ledger App Aptos. + * (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 "os.h" + +#include "settings.h" +#include "../globals.h" + +void settings_show_full_message_change(uint8_t value) { + nvm_write((void*) &N_storage.settings.show_full_message, &value, sizeof(value)); +} + +void settings_allow_blind_signing_change(uint8_t value) { + nvm_write((void*) &N_storage.settings.allow_blind_signing, &value, sizeof(value)); +} diff --git a/src/ui/display.h b/src/ui/display.h index 7579706..dd0edec 100644 --- a/src/ui/display.h +++ b/src/ui/display.h @@ -1,17 +1,13 @@ #pragma once -#include // bool -#include "ux.h" - #define UI_PREPARED -10 extern char g_bip32_path[60]; extern char g_address[67]; - -/** - * Callback to reuse action with approve/reject in step FLOW. - */ -typedef void (*action_validate_cb)(bool); +extern char g_gas_fee[30]; +extern char g_struct[120]; +extern char g_function[120]; +extern char g_amount[30]; /** * Display address on the device and ask confirmation to export. @@ -20,7 +16,6 @@ typedef void (*action_validate_cb)(bool); * */ int ui_display_address(void); - int ui_prepare_address(void); /** @@ -30,11 +25,15 @@ int ui_prepare_address(void); * */ int ui_display_transaction(void); +int ui_prepare_transaction(void); int ui_display_message(void); int ui_display_entry_function(void); +int ui_prepare_entry_function(void); int ui_display_tx_aptos_account_transfer(void); +int ui_prepare_tx_aptos_account_transfer(void); int ui_display_tx_coin_transfer(void); +int ui_prepare_tx_coin_transfer(void); diff --git a/src/ui/nbgl_display.c b/src/ui/nbgl_display.c new file mode 100644 index 0000000..8b59118 --- /dev/null +++ b/src/ui/nbgl_display.c @@ -0,0 +1,92 @@ +/***************************************************************************** + * Ledger App Aptos. + * (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. + *****************************************************************************/ + +#ifdef HAVE_NBGL + +#include // bool +#include // memset + +#include "os.h" +#include "glyphs.h" +#include "nbgl_use_case.h" + +#include "nbgl_display.h" +#include "display.h" +#include "settings.h" +#include "menu.h" +#include "constants.h" +#include "../globals.h" + +static use_case_review_ctx_t blind_sign_ctx; + +nbgl_layoutTagValue_t pairs[5]; +nbgl_layoutTagValueList_t pairList; +nbgl_pageInfoLongPress_t infoLongPress; + +static void blind_sign_continue() { + nbgl_useCaseReviewStart(blind_sign_ctx.icon, + blind_sign_ctx.review_title, + blind_sign_ctx.review_sub_title, + blind_sign_ctx.reject_text, + blind_sign_ctx.continue_callback, + blind_sign_ctx.reject_callback); +} + +static void blind_sign_info() { + nbgl_useCaseReviewStart(&C_round_warning_64px, + "Blind Signing", + "This operation cannot be\nsecurely interpreted by Ledger\nStax. It " + "might put your assets\nat risk.", + blind_sign_ctx.reject_text, + blind_sign_continue, + blind_sign_ctx.reject_callback); +} + +static void blind_sign_choice(bool enable) { + if (enable) { + settings_allow_blind_signing_change(1); + nbgl_useCaseStatus("BLIND SIGNING\nENABLED", true, blind_sign_info); + } else { + blind_sign_ctx.reject_callback(); + } +} + +void nbgl_useCaseReviewVerify(const nbgl_icon_details_t *icon, + const char *review_title, + const char *review_sub_title, + const char *reject_text, + nbgl_callback_t continue_callback, + nbgl_callback_t reject_callback) { + blind_sign_ctx.icon = icon; + blind_sign_ctx.review_title = review_title; + blind_sign_ctx.review_sub_title = review_sub_title; + blind_sign_ctx.reject_text = reject_text; + blind_sign_ctx.continue_callback = continue_callback; + blind_sign_ctx.reject_callback = reject_callback; + if (N_storage.settings.allow_blind_signing) { + blind_sign_info(); + } else { + nbgl_useCaseChoice(&C_round_warning_64px, + "Enable blind signing to\nauthorize this\noperation", + NULL, + "Enable blind signing", + reject_text, + blind_sign_choice); + } +} + +#endif diff --git a/src/ui/nbgl_display.h b/src/ui/nbgl_display.h new file mode 100644 index 0000000..94da09c --- /dev/null +++ b/src/ui/nbgl_display.h @@ -0,0 +1,23 @@ +#pragma once + +#include "nbgl_use_case.h" + +extern nbgl_layoutTagValue_t pairs[5]; +extern nbgl_layoutTagValueList_t pairList; +extern nbgl_pageInfoLongPress_t infoLongPress; + +typedef struct use_case_review_ctx_s { + const nbgl_icon_details_t *icon; + const char *review_title; + const char *review_sub_title; + const char *reject_text; + nbgl_callback_t continue_callback; + nbgl_callback_t reject_callback; +} use_case_review_ctx_t; + +void nbgl_useCaseReviewVerify(const nbgl_icon_details_t *icon, + const char *review_title, + const char *review_sub_title, + const char *reject_text, + nbgl_callback_t continue_callback, + nbgl_callback_t reject_callback); diff --git a/src/ui/nbgl_display_address.c b/src/ui/nbgl_display_address.c new file mode 100644 index 0000000..78cf488 --- /dev/null +++ b/src/ui/nbgl_display_address.c @@ -0,0 +1,71 @@ +/***************************************************************************** + * Ledger App Aptos. + * (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. + *****************************************************************************/ + +#ifdef HAVE_NBGL + +#include // bool +#include // memset + +#include "os.h" +#include "glyphs.h" +#include "nbgl_use_case.h" + +#include "nbgl_display.h" +#include "display.h" +#include "menu.h" +#include "constants.h" +#include "../globals.h" +#include "../address.h" +#include "action/validate.h" + +static void confirm_address(bool choice) { + validate_pubkey(choice); + nbgl_useCaseStatus(choice ? "ADDRESS\nVERIFIED" : "Address verification\ncanceled", + choice, + ui_menu_main); +} + +static void confirm_address_rejection(void) { + confirm_address(false); +} + +static void continue_review(void) { + pairs[0].item = "Derivation Path"; + pairs[0].value = g_bip32_path; + + pairList.nbMaxLinesForValue = 0; + pairList.nbPairs = 1; + pairList.pairs = pairs; + nbgl_useCaseAddressConfirmationExt(g_address, confirm_address, &pairList); +} + +int ui_display_address() { + const int ret = ui_prepare_address(); + if (ret == UI_PREPARED) { + nbgl_useCaseReviewStart(&C_aptos_logo_64px, + "Verify Aptos\naddress", + NULL, + "Cancel", + continue_review, + confirm_address_rejection); + return 0; + } + + return ret; +} + +#endif diff --git a/src/ui/nbgl_display_message.c b/src/ui/nbgl_display_message.c new file mode 100755 index 0000000..19607c8 --- /dev/null +++ b/src/ui/nbgl_display_message.c @@ -0,0 +1,92 @@ +/***************************************************************************** + * Ledger App Aptos. + * (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. + *****************************************************************************/ + +#ifdef HAVE_NBGL + +#include // bool +#include // memset + +#include "os.h" +#include "glyphs.h" +#include "nbgl_use_case.h" + +#include "nbgl_display.h" +#include "display.h" +#include "menu.h" +#include "constants.h" +#include "../globals.h" +#include "action/validate.h" +#include "../common/user_format.h" + +static void confirm_message_rejection(void) { + validate_transaction(false); + nbgl_useCaseStatus("Message rejected", false, ui_menu_main); +} + +static void ask_message_rejection_confirmation(void) { + nbgl_useCaseConfirm("Reject message?", + NULL, + "Yes, Reject", + "Go back to message", + confirm_message_rejection); +} + +static void review_choice(bool confirm) { + if (confirm) { + validate_transaction(true); + nbgl_useCaseStatus("MESSAGE\nSIGNED", true, ui_menu_main); + } else { + ask_message_rejection_confirmation(); + } +} + +static void review_message_continue(void) { + pairs[0].item = "Message"; + pairs[0].value = (const char *) G_context.tx_info.raw_tx; + + pairList.nbMaxLinesForValue = 0; + pairList.nbPairs = 1; + pairList.pairs = pairs; + + infoLongPress.icon = &C_Message_64px; + infoLongPress.text = "Sign message"; + infoLongPress.longPressText = "Hold to sign"; + + nbgl_useCaseStaticReview(&pairList, &infoLongPress, "Reject message", review_choice); +} + +int ui_display_message() { + if (is_str_interrupted((const char *) G_context.tx_info.raw_tx, G_context.tx_info.raw_tx_len)) { + nbgl_useCaseReviewVerify(&C_Message_64px, + "Review message", + NULL, + "Reject message", + review_message_continue, + ask_message_rejection_confirmation); + } else { + nbgl_useCaseReviewStart(&C_Message_64px, + "Review message", + NULL, + "Reject message", + review_message_continue, + ask_message_rejection_confirmation); + } + + return 0; +} + +#endif diff --git a/src/ui/nbgl_display_transaction.c b/src/ui/nbgl_display_transaction.c new file mode 100755 index 0000000..014d210 --- /dev/null +++ b/src/ui/nbgl_display_transaction.c @@ -0,0 +1,196 @@ +/***************************************************************************** + * Ledger App Aptos. + * (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. + *****************************************************************************/ + +#ifdef HAVE_NBGL + +#include // bool +#include // memset + +#include "os.h" +#include "glyphs.h" +#include "nbgl_use_case.h" + +#include "nbgl_display.h" +#include "display.h" +#include "menu.h" +#include "constants.h" +#include "../globals.h" +#include "action/validate.h" + +static void confirm_transaction_rejection(void) { + validate_transaction(false); + nbgl_useCaseStatus("Transaction rejected", false, ui_menu_main); +} + +static void ask_transaction_rejection_confirmation(void) { + nbgl_useCaseConfirm("Reject transaction?", + NULL, + "Yes, Reject", + "Go back to transaction", + confirm_transaction_rejection); +} + +static void review_choice(bool confirm) { + if (confirm) { + validate_transaction(true); + nbgl_useCaseStatus("TRANSACTION\nSIGNED", true, ui_menu_main); + } else { + ask_transaction_rejection_confirmation(); + } +} + +static void review_default_continue(void) { + pairs[0].item = "Transaction Type"; + pairs[0].value = g_struct; + pairs[1].item = "Gas Fee"; + pairs[1].value = g_gas_fee; + + pairList.nbMaxLinesForValue = 0; + pairList.nbPairs = 2; + pairList.pairs = pairs; + + infoLongPress.icon = &C_aptos_logo_64px; + infoLongPress.text = "Sign transaction"; + infoLongPress.longPressText = "Hold to sign"; + + nbgl_useCaseStaticReview(&pairList, &infoLongPress, "Reject transaction", review_choice); +} + +static void review_entry_function_continue(void) { + pairs[0].item = "Function"; + pairs[0].value = g_function; + pairs[1].item = "Gas Fee"; + pairs[1].value = g_gas_fee; + + pairList.nbMaxLinesForValue = 0; + pairList.nbPairs = 2; + pairList.pairs = pairs; + + infoLongPress.icon = &C_aptos_logo_64px; + infoLongPress.text = "Sign transaction"; + infoLongPress.longPressText = "Hold to sign"; + + nbgl_useCaseStaticReview(&pairList, &infoLongPress, "Reject transaction", review_choice); +} + +static void review_tx_aptos_account_transfer_continue(void) { + pairs[0].item = "Transaction Type"; + pairs[0].value = g_struct; + pairs[1].item = "Function"; + pairs[1].value = g_function; + pairs[2].item = "Receiver"; + pairs[2].value = g_address; + pairs[3].item = "Amount"; + pairs[3].value = g_amount; + pairs[4].item = "Gas Fee"; + pairs[4].value = g_gas_fee; + + pairList.nbMaxLinesForValue = 0; + pairList.nbPairs = 5; + pairList.pairs = pairs; + + infoLongPress.icon = &C_aptos_logo_64px; + infoLongPress.text = "Sign transaction"; + infoLongPress.longPressText = "Hold to sign"; + + nbgl_useCaseStaticReview(&pairList, &infoLongPress, "Reject transaction", review_choice); +} + +static void review_tx_coin_transfer_continue(void) { + pairs[0].item = "Function"; + pairs[0].value = g_function; + pairs[1].item = "Coin Type"; + pairs[1].value = g_struct; + pairs[2].item = "Receiver"; + pairs[2].value = g_address; + pairs[3].item = "Amount"; + pairs[3].value = g_amount; + pairs[4].item = "Gas Fee"; + pairs[4].value = g_gas_fee; + + pairList.nbMaxLinesForValue = 0; + pairList.nbPairs = 5; + pairList.pairs = pairs; + + infoLongPress.icon = &C_aptos_logo_64px; + infoLongPress.text = "Sign transaction"; + infoLongPress.longPressText = "Hold to sign"; + + nbgl_useCaseStaticReview(&pairList, &infoLongPress, "Reject transaction", review_choice); +} + +int ui_display_transaction() { + const int ret = ui_prepare_transaction(); + if (ret == UI_PREPARED) { + nbgl_useCaseReviewVerify(&C_aptos_logo_64px, + "Review transaction", + NULL, + "Reject transaction", + review_default_continue, + ask_transaction_rejection_confirmation); + return 0; + } + + return ret; +} + +int ui_display_entry_function() { + const int ret = ui_prepare_entry_function(); + if (ret == UI_PREPARED) { + nbgl_useCaseReviewVerify(&C_aptos_logo_64px, + "Review transaction", + NULL, + "Reject transaction", + review_entry_function_continue, + ask_transaction_rejection_confirmation); + return 0; + } + + return ret; +} + +int ui_display_tx_aptos_account_transfer() { + const int ret = ui_prepare_tx_aptos_account_transfer(); + if (ret == UI_PREPARED) { + nbgl_useCaseReviewStart(&C_aptos_logo_64px, + "Review transaction\nto send Aptos", + NULL, + "Reject transaction", + review_tx_aptos_account_transfer_continue, + ask_transaction_rejection_confirmation); + return 0; + } + + return ret; +} + +int ui_display_tx_coin_transfer() { + const int ret = ui_prepare_tx_coin_transfer(); + if (ret == UI_PREPARED) { + nbgl_useCaseReviewStart(&C_aptos_logo_64px, + "Review transaction\nto transfer coins", + NULL, + "Reject transaction", + review_tx_coin_transfer_continue, + ask_transaction_rejection_confirmation); + return 0; + } + + return ret; +} + +#endif diff --git a/src/ui/nbgl_menu.c b/src/ui/nbgl_menu.c new file mode 100644 index 0000000..649329d --- /dev/null +++ b/src/ui/nbgl_menu.c @@ -0,0 +1,110 @@ + +/***************************************************************************** + * Ledger App Aptos. + * (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. + *****************************************************************************/ + +#ifdef HAVE_NBGL + +#include "os.h" +#include "io.h" +#include "glyphs.h" +#include "nbgl_use_case.h" + +#include "../globals.h" +#include "menu.h" +#include "settings.h" + +#define SETTINGS_PAGE_NUMBER 2 + +enum { + SWITCH_BLIND_SIGNING = 0, + SWITCHES_COUNT, +}; + +enum { + TOKEN_BLIND_SIGNING = FIRST_USER_TOKEN, +}; + +static const char* const INFO_TYPES[] = {"Version", "Developer", "Copyright"}; +static const char* const INFO_CONTENTS[] = {APPVERSION, + "Pontem Network", + "(c) 2022 Pontem Network"}; + +static nbgl_layoutSwitch_t g_switches[SWITCHES_COUNT]; + +static bool settings_nav_callback(uint8_t page, nbgl_pageContent_t* content) { + switch (page) { + case 0: + content->type = INFOS_LIST; + content->infosList.nbInfos = ARRAYLEN(INFO_TYPES); + content->infosList.infoTypes = (const char**) INFO_TYPES; + content->infosList.infoContents = (const char**) INFO_CONTENTS; + + return true; + case 1: + if (N_storage.settings.allow_blind_signing == 0) { + g_switches[SWITCH_BLIND_SIGNING].initState = OFF_STATE; + } else { + g_switches[SWITCH_BLIND_SIGNING].initState = ON_STATE; + } + content->type = SWITCHES_LIST; + content->switchesList.nbSwitches = SWITCHES_COUNT; + content->switchesList.switches = g_switches; + + return true; + default: + break; + } + + return false; +} + +static void settings_controls_callback(int token, uint8_t index) { + switch (token) { + case TOKEN_BLIND_SIGNING: + if (index == 0 || index == 1) { + settings_allow_blind_signing_change(index); + } + break; + default: + break; + } +} + +void app_quit(void) { + os_sched_exit(-1); +} + +void ui_menu_main(void) { + nbgl_useCaseHome(APPNAME, &C_aptos_logo_64px, NULL, true, ui_menu_settings, app_quit); +} + +void ui_menu_settings(void) { + g_switches[SWITCH_BLIND_SIGNING].text = "Blind signing"; + g_switches[SWITCH_BLIND_SIGNING].subText = "Enable blind signing"; + g_switches[SWITCH_BLIND_SIGNING].token = TOKEN_BLIND_SIGNING; + g_switches[SWITCH_BLIND_SIGNING].tuneId = TUNE_TAP_CASUAL; + + nbgl_useCaseSettings(APPNAME " settings", + 0, + SETTINGS_PAGE_NUMBER, + false, + ui_menu_main, + settings_nav_callback, + settings_controls_callback); +} + +#endif diff --git a/src/ui/settings.h b/src/ui/settings.h index ccd5535..834c71e 100644 --- a/src/ui/settings.h +++ b/src/ui/settings.h @@ -1,11 +1,5 @@ #pragma once -enum menu_options { MENU_SHOW_FULL_MSG = 0, MENU_ALLOW_BLIND_SIGNING = 1 }; - -const char* settings_submenu_getter(unsigned int idx); - -void settings_submenu_selector(unsigned int idx); - void settings_show_full_message_change(uint8_t value); void settings_allow_blind_signing_change(uint8_t value); From 0c29dda4b944e151cf935460cdc13c963e6ac8c6 Mon Sep 17 00:00:00 2001 From: vldmkr Date: Wed, 5 Jul 2023 18:59:18 +0300 Subject: [PATCH 08/32] Version bump to 0.6.0 --- Makefile | 4 ++-- tests/ledgercomm/test_name_version.py | 2 +- tests/ledgercomm/test_version_cmd.py | 2 +- tests/speculos/test_name_version.py | 2 +- tests/speculos/test_version_cmd.py | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Makefile b/Makefile index 5229620..d1bf228 100644 --- a/Makefile +++ b/Makefile @@ -47,8 +47,8 @@ APPNAME = "Aptos" # Application version APPVERSION_M = 0 -APPVERSION_N = 4 -APPVERSION_P = 17 +APPVERSION_N = 6 +APPVERSION_P = 0 APPVERSION = "$(APPVERSION_M).$(APPVERSION_N).$(APPVERSION_P)" # Application source files diff --git a/tests/ledgercomm/test_name_version.py b/tests/ledgercomm/test_name_version.py index c487a14..1971a08 100644 --- a/tests/ledgercomm/test_name_version.py +++ b/tests/ledgercomm/test_name_version.py @@ -4,4 +4,4 @@ def test_get_app_and_version(cmd, hid): app_name, version = cmd.get_app_and_version() assert app_name == "Aptos" - assert version == "0.4.17" + assert version == "0.6.0" diff --git a/tests/ledgercomm/test_version_cmd.py b/tests/ledgercomm/test_version_cmd.py index 8eab8c8..da60ef8 100644 --- a/tests/ledgercomm/test_version_cmd.py +++ b/tests/ledgercomm/test_version_cmd.py @@ -1,2 +1,2 @@ def test_version(cmd): - assert cmd.get_version() == (0, 4, 17) + assert cmd.get_version() == (0, 6, 0) diff --git a/tests/speculos/test_name_version.py b/tests/speculos/test_name_version.py index 82126d4..86ec372 100644 --- a/tests/speculos/test_name_version.py +++ b/tests/speculos/test_name_version.py @@ -2,4 +2,4 @@ def test_get_app_and_version(cmd): app_name, version = cmd.get_app_and_version() assert app_name == "Aptos" - assert version == "0.4.17" + assert version == "0.6.0" diff --git a/tests/speculos/test_version_cmd.py b/tests/speculos/test_version_cmd.py index 8eab8c8..da60ef8 100644 --- a/tests/speculos/test_version_cmd.py +++ b/tests/speculos/test_version_cmd.py @@ -1,2 +1,2 @@ def test_version(cmd): - assert cmd.get_version() == (0, 4, 17) + assert cmd.get_version() == (0, 6, 0) From 7b7965d93a3c200f23fdab12f560e2e8421db624 Mon Sep 17 00:00:00 2001 From: vldmkr Date: Sun, 1 Oct 2023 09:12:17 +0300 Subject: [PATCH 09/32] Improve the UI for Ledger Stax - Add Aptos icon - Fix typo on Blind Signing warning screen --- glyphs/aptos_logo_64px.gif | Bin 228 -> 1175 bytes icons/app_aptos_32px.gif | Bin 116 -> 998 bytes src/ui/nbgl_display.c | 4 ++-- 3 files changed, 2 insertions(+), 2 deletions(-) mode change 100755 => 100644 glyphs/aptos_logo_64px.gif mode change 100755 => 100644 icons/app_aptos_32px.gif diff --git a/glyphs/aptos_logo_64px.gif b/glyphs/aptos_logo_64px.gif old mode 100755 new mode 100644 index 0125e6b45ca7127e161ad0fb4534a92b15b2e45a..bd87bd2c59a2bc7c92547e89744f82f371f5a5a3 GIT binary patch literal 1175 zcmZ?wbhEHbbYO5`XlG#f`}Z#c1B0upYi4HVwr$&h>`^cp0wX5`6#sMkxrPKgI|jHK z=@~FH0)4LdlZAx|Nb7(?0hCP`IQ}y*a>#gWSa7hJLs%>3#0EtMCKfi2IUE-k9_?mP z=HfW8aq;m!CN_Zs9zqWrdgX&x@hEIcImxJ97>W*t=R$9Gzwe`WJKGS@zh|}BF-rint zcUH~pE$i;?uK4`w?&&yHN*kbJtX*Wl5c+Z*(i@15Pf{r&y@jLgSh6z*_6 zd8}HG??Od>#`#$3$!&6xI$uvspC6wdRbX}D@GVXAMDY__Dt}yCvwwMeo{;(5=B~%5 z=AREM|MdIE=jfc3@rqs>|1R7X+Q5|OwxC@8;&O#ry}8Hd`SOLC#Ug}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*;(K|?dEuvUnNgF{2R05gZgh7F4x+69fB zR1!8SF!m}a2fgVqT;ka$>OD(@GvV=}er;o+BNm$$pPg+{{7Ob6Vfk4`f%;=It3E1S zT+FYzD(0r}Gp|0TMP75QL{%HwLRMb;a&qhIb1UM+lisW>)(n~~(l}4n>cWx(TT>WQ zSWg$PySp~=^RwC&(-+)Y!p_Vs*K^@fR7YX(x}(t_^UoZyV4rdKM8tDPCKj%89u5X; E0LuDYg#Z8m literal 116 zcmZ?wbhEHbRA5kGXkY+=|NsB%fM}2i15KIUBc02Qn~N0|4sJF$(|y diff --git a/src/ui/nbgl_display.c b/src/ui/nbgl_display.c index 8b59118..04c906c 100644 --- a/src/ui/nbgl_display.c +++ b/src/ui/nbgl_display.c @@ -49,8 +49,8 @@ static void blind_sign_continue() { static void blind_sign_info() { nbgl_useCaseReviewStart(&C_round_warning_64px, "Blind Signing", - "This operation cannot be\nsecurely interpreted by Ledger\nStax. It " - "might put your assets\nat risk.", + "This operation cannot be\nsecurely interpreted by\nLedger Stax.\n" + "It might put your assets\nat risk.", blind_sign_ctx.reject_text, blind_sign_continue, blind_sign_ctx.reject_callback); From ef2fafa2417031cf4381a76180807ae4d24ceceb Mon Sep 17 00:00:00 2001 From: vldmkr Date: Sun, 1 Oct 2023 09:53:24 +0300 Subject: [PATCH 10/32] Version bump to 0.6.2 --- Makefile | 2 +- tests/ledgercomm/test_name_version.py | 2 +- tests/ledgercomm/test_version_cmd.py | 2 +- tests/speculos/test_name_version.py | 2 +- tests/speculos/test_version_cmd.py | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Makefile b/Makefile index d1bf228..2964352 100644 --- a/Makefile +++ b/Makefile @@ -48,7 +48,7 @@ APPNAME = "Aptos" # Application version APPVERSION_M = 0 APPVERSION_N = 6 -APPVERSION_P = 0 +APPVERSION_P = 2 APPVERSION = "$(APPVERSION_M).$(APPVERSION_N).$(APPVERSION_P)" # Application source files diff --git a/tests/ledgercomm/test_name_version.py b/tests/ledgercomm/test_name_version.py index 1971a08..ed2ced6 100644 --- a/tests/ledgercomm/test_name_version.py +++ b/tests/ledgercomm/test_name_version.py @@ -4,4 +4,4 @@ def test_get_app_and_version(cmd, hid): app_name, version = cmd.get_app_and_version() assert app_name == "Aptos" - assert version == "0.6.0" + assert version == "0.6.2" diff --git a/tests/ledgercomm/test_version_cmd.py b/tests/ledgercomm/test_version_cmd.py index da60ef8..b8561d9 100644 --- a/tests/ledgercomm/test_version_cmd.py +++ b/tests/ledgercomm/test_version_cmd.py @@ -1,2 +1,2 @@ def test_version(cmd): - assert cmd.get_version() == (0, 6, 0) + assert cmd.get_version() == (0, 6, 2) diff --git a/tests/speculos/test_name_version.py b/tests/speculos/test_name_version.py index 86ec372..6866971 100644 --- a/tests/speculos/test_name_version.py +++ b/tests/speculos/test_name_version.py @@ -2,4 +2,4 @@ def test_get_app_and_version(cmd): app_name, version = cmd.get_app_and_version() assert app_name == "Aptos" - assert version == "0.6.0" + assert version == "0.6.2" diff --git a/tests/speculos/test_version_cmd.py b/tests/speculos/test_version_cmd.py index da60ef8..b8561d9 100644 --- a/tests/speculos/test_version_cmd.py +++ b/tests/speculos/test_version_cmd.py @@ -1,2 +1,2 @@ def test_version(cmd): - assert cmd.get_version() == (0, 6, 0) + assert cmd.get_version() == (0, 6, 2) From 2143587b41486d3736e93447ad4181fe3f9be51e Mon Sep 17 00:00:00 2001 From: vldmkr Date: Tue, 7 Nov 2023 12:47:11 +0200 Subject: [PATCH 11/32] Fix initialization of `sha3` variable in `address_from_pubkey` function. --- src/address.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/address.c b/src/address.c index e74baa1..0a0c498 100644 --- a/src/address.c +++ b/src/address.c @@ -36,7 +36,10 @@ bool address_from_pubkey(const uint8_t public_key[static 32], uint8_t *out, size } cx_sha3_t sha3; - cx_sha3_init(&sha3, 256); + cx_err_t error = cx_sha3_init_no_throw(&sha3, 256); + if (error != CX_OK) { + return false; + } cx_hash_update((cx_hash_t *) &sha3, public_key, 32); cx_hash_update((cx_hash_t *) &sha3, &signature_scheme_id, 1); cx_hash_final((cx_hash_t *) &sha3, address); From 40774985c062c9fe3adb4d7f256a0c1a88d0cb8c Mon Sep 17 00:00:00 2001 From: vldmkr Date: Mon, 20 Nov 2023 08:42:46 +0200 Subject: [PATCH 12/32] Use "no_throw" crypto functions instead of deprecated ones --- src/crypto.c | 121 ++++++++++++++++------------------- src/crypto.h | 22 +++---- src/handler/get_public_key.c | 22 +++++-- src/ui/action/validate.c | 2 +- 4 files changed, 82 insertions(+), 85 deletions(-) diff --git a/src/crypto.c b/src/crypto.c index 3e59f37..cf2e139 100644 --- a/src/crypto.c +++ b/src/crypto.c @@ -23,47 +23,43 @@ #include "globals.h" -int crypto_derive_private_key(cx_ecfp_private_key_t *private_key, - uint8_t chain_code[static 32], - const uint32_t *bip32_path, - uint8_t bip32_path_len) { - uint8_t raw_private_key[32] = {0}; - int error = 0; - - BEGIN_TRY { - TRY { - // derive the seed with bip32_path - os_perso_derive_node_bip32_seed_key(HDW_ED25519_SLIP10, - CX_CURVE_Ed25519, - bip32_path, - bip32_path_len, - raw_private_key, - chain_code, - (unsigned char *) "ed25519 seed", - 12); - // new private_key from raw - cx_ecfp_init_private_key(CX_CURVE_Ed25519, - raw_private_key, - sizeof(raw_private_key), - private_key); - } - CATCH_OTHER(e) { - error = e; - } - FINALLY { - explicit_bzero(&raw_private_key, sizeof(raw_private_key)); - } +cx_err_t crypto_derive_private_key(cx_ecfp_private_key_t *private_key, + uint8_t chain_code[static 32], + const uint32_t *bip32_path, + uint8_t bip32_path_len) { + uint8_t raw_private_key[64] = {0}; + cx_err_t error = CX_OK; + + // derive the seed with bip32_path + error = os_derive_bip32_with_seed_no_throw(HDW_ED25519_SLIP10, + CX_CURVE_Ed25519, + bip32_path, + bip32_path_len, + raw_private_key, + chain_code, + (unsigned char *) "ed25519 seed", + 12); + if (error != CX_OK) { + explicit_bzero(&raw_private_key, sizeof(raw_private_key)); + return error; } - END_TRY; + // new private_key from raw + error = cx_ecfp_init_private_key_no_throw(CX_CURVE_Ed25519, raw_private_key, 32, private_key); + + explicit_bzero(&raw_private_key, sizeof(raw_private_key)); return error; } -void crypto_init_public_key(cx_ecfp_private_key_t *private_key, - cx_ecfp_public_key_t *public_key, - uint8_t raw_public_key[static 32]) { +cx_err_t crypto_init_public_key(cx_ecfp_private_key_t *private_key, + cx_ecfp_public_key_t *public_key, + uint8_t raw_public_key[static 32]) { // generate corresponding public key - cx_ecfp_generate_pair(CX_CURVE_Ed25519, public_key, private_key, 1); + cx_err_t error = cx_ecfp_generate_pair_no_throw(CX_CURVE_Ed25519, public_key, private_key, 1); + + if (error != CX_OK) { + return error; + } for (int i = 0; i < 32; i++) { raw_public_key[i] = public_key->W[64 - i]; @@ -71,49 +67,42 @@ void crypto_init_public_key(cx_ecfp_private_key_t *private_key, if (public_key->W[32] & 1) { raw_public_key[31] |= 0x80; } + + return error; } -int crypto_sign_message() { +cx_err_t crypto_sign_message() { cx_ecfp_private_key_t private_key = {0}; uint8_t chain_code[32] = {0}; - int sig_len = 0; // derive private key according to BIP32 path - int error = crypto_derive_private_key(&private_key, - chain_code, - G_context.bip32_path, - G_context.bip32_path_len); - if (error != 0) { + cx_err_t error = crypto_derive_private_key(&private_key, + chain_code, + G_context.bip32_path, + G_context.bip32_path_len); + if (error != CX_OK) { explicit_bzero(&private_key, sizeof(private_key)); return error; } - BEGIN_TRY { - TRY { - sig_len = cx_eddsa_sign(&private_key, - CX_LAST, - CX_SHA512, - G_context.tx_info.raw_tx, - G_context.tx_info.raw_tx_len, - NULL, - 0, - G_context.tx_info.signature, - sizeof(G_context.tx_info.signature), - NULL); - PRINTF("Signature: %.*H\n", sig_len, G_context.tx_info.signature); - } - CATCH_OTHER(e) { - error = e; - } - FINALLY { - explicit_bzero(&private_key, sizeof(private_key)); - } - } - END_TRY; + error = cx_eddsa_sign_no_throw(&private_key, + CX_SHA512, + G_context.tx_info.raw_tx, + G_context.tx_info.raw_tx_len, + G_context.tx_info.signature, + sizeof(G_context.tx_info.signature)); - if (error == 0) { - G_context.tx_info.signature_len = sig_len; + if (error != CX_OK) { + explicit_bzero(&private_key, sizeof(private_key)); + return error; } + size_t size; + cx_ecdomain_parameters_length(private_key.curve, &size); + G_context.tx_info.signature_len = 2 * size; + + PRINTF("Signature: %.*H\n", G_context.tx_info.signature_len, G_context.tx_info.signature); + + explicit_bzero(&private_key, sizeof(private_key)); return error; } diff --git a/src/crypto.h b/src/crypto.h index 72c66c0..a03d963 100644 --- a/src/crypto.h +++ b/src/crypto.h @@ -18,13 +18,13 @@ * @param[in] bip32_path_len * Number of path in BIP32 path. * - * @return 0 on success, error number otherwise. + * @return CX_OK on success, error number otherwise. * */ -int crypto_derive_private_key(cx_ecfp_private_key_t *private_key, - uint8_t chain_code[static 32], - const uint32_t *bip32_path, - uint8_t bip32_path_len); +cx_err_t crypto_derive_private_key(cx_ecfp_private_key_t *private_key, + uint8_t chain_code[static 32], + const uint32_t *bip32_path, + uint8_t bip32_path_len); /** * Initialize public key given private key. @@ -36,19 +36,19 @@ int crypto_derive_private_key(cx_ecfp_private_key_t *private_key, * @param[out] raw_public_key * Pointer to raw public key. * - * @throw INVALID_PARAMETER + * @return CX_OK on success, error number otherwise. * */ -void crypto_init_public_key(cx_ecfp_private_key_t *private_key, - cx_ecfp_public_key_t *public_key, - uint8_t raw_public_key[static 32]); +cx_err_t crypto_init_public_key(cx_ecfp_private_key_t *private_key, + cx_ecfp_public_key_t *public_key, + uint8_t raw_public_key[static 32]); /** * Sign message hash in global context. * * @see G_context.bip32_path, G_context.tx_info.signature. * - * @return 0 on success, error number otherwise. + * @return CX_OK on success, error number otherwise. * */ -int crypto_sign_message(void); +cx_err_t crypto_sign_message(void); diff --git a/src/handler/get_public_key.c b/src/handler/get_public_key.c index 5610d9c..f163e43 100644 --- a/src/handler/get_public_key.c +++ b/src/handler/get_public_key.c @@ -47,18 +47,26 @@ int handler_get_public_key(buffer_t *cdata, bool display) { } // derive private key according to BIP32 path - int error = crypto_derive_private_key(&private_key, - G_context.pk_info.chain_code, - G_context.bip32_path, - G_context.bip32_path_len); - if (error != 0) { + cx_err_t error = crypto_derive_private_key(&private_key, + G_context.pk_info.chain_code, + G_context.bip32_path, + G_context.bip32_path_len); + if (error != CX_OK) { explicit_bzero(&private_key, sizeof(private_key)); - PRINTF("Error code: %x.\n", error); + PRINTF("crypto_derive_private_key error code: %x.\n", error); G_context.req_type = REQUEST_UNDEFINED; return io_send_sw(SW_GET_PUB_KEY_FAIL); } + // generate corresponding public key - crypto_init_public_key(&private_key, &public_key, G_context.pk_info.raw_public_key); + error = crypto_init_public_key(&private_key, &public_key, G_context.pk_info.raw_public_key); + + if (error != CX_OK) { + explicit_bzero(&private_key, sizeof(private_key)); + PRINTF("crypto_init_public_key error code: %x.\n", error); + G_context.req_type = REQUEST_UNDEFINED; + return io_send_sw(SW_GET_PUB_KEY_FAIL); + } // reset private key explicit_bzero(&private_key, sizeof(private_key)); diff --git a/src/ui/action/validate.c b/src/ui/action/validate.c index f1597ef..e28c3bf 100644 --- a/src/ui/action/validate.c +++ b/src/ui/action/validate.c @@ -37,7 +37,7 @@ void validate_transaction(bool choice) { if (choice) { G_context.state = STATE_APPROVED; - if (crypto_sign_message() != 0) { + if (crypto_sign_message() != CX_OK) { G_context.state = STATE_NONE; io_send_sw(SW_SIGNATURE_FAIL); } else { From ffc83c7ca82602d6ff48d60023bb2f82b6c1ce79 Mon Sep 17 00:00:00 2001 From: vldmkr Date: Mon, 20 Nov 2023 08:47:14 +0200 Subject: [PATCH 13/32] Version bump to 0.6.3 --- Makefile | 2 +- tests/ledgercomm/test_name_version.py | 2 +- tests/ledgercomm/test_version_cmd.py | 2 +- tests/speculos/test_name_version.py | 2 +- tests/speculos/test_version_cmd.py | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Makefile b/Makefile index 2964352..3e22820 100644 --- a/Makefile +++ b/Makefile @@ -48,7 +48,7 @@ APPNAME = "Aptos" # Application version APPVERSION_M = 0 APPVERSION_N = 6 -APPVERSION_P = 2 +APPVERSION_P = 3 APPVERSION = "$(APPVERSION_M).$(APPVERSION_N).$(APPVERSION_P)" # Application source files diff --git a/tests/ledgercomm/test_name_version.py b/tests/ledgercomm/test_name_version.py index ed2ced6..a9ae023 100644 --- a/tests/ledgercomm/test_name_version.py +++ b/tests/ledgercomm/test_name_version.py @@ -4,4 +4,4 @@ def test_get_app_and_version(cmd, hid): app_name, version = cmd.get_app_and_version() assert app_name == "Aptos" - assert version == "0.6.2" + assert version == "0.6.3" diff --git a/tests/ledgercomm/test_version_cmd.py b/tests/ledgercomm/test_version_cmd.py index b8561d9..11eeeb1 100644 --- a/tests/ledgercomm/test_version_cmd.py +++ b/tests/ledgercomm/test_version_cmd.py @@ -1,2 +1,2 @@ def test_version(cmd): - assert cmd.get_version() == (0, 6, 2) + assert cmd.get_version() == (0, 6, 3) diff --git a/tests/speculos/test_name_version.py b/tests/speculos/test_name_version.py index 6866971..1fd1407 100644 --- a/tests/speculos/test_name_version.py +++ b/tests/speculos/test_name_version.py @@ -2,4 +2,4 @@ def test_get_app_and_version(cmd): app_name, version = cmd.get_app_and_version() assert app_name == "Aptos" - assert version == "0.6.2" + assert version == "0.6.3" diff --git a/tests/speculos/test_version_cmd.py b/tests/speculos/test_version_cmd.py index b8561d9..11eeeb1 100644 --- a/tests/speculos/test_version_cmd.py +++ b/tests/speculos/test_version_cmd.py @@ -1,2 +1,2 @@ def test_version(cmd): - assert cmd.get_version() == (0, 6, 2) + assert cmd.get_version() == (0, 6, 3) From d84bbc2735992b4d756ed2ac02e0930bea65b2d7 Mon Sep 17 00:00:00 2001 From: vldmkr Date: Mon, 27 Nov 2023 12:28:04 +0200 Subject: [PATCH 14/32] tests: Rewrite existing tests using the Ragger framework. Add new tests. --- tests/.gitignore | 1 + tests/README.md | 93 +++++--- .../__init__.py | 0 .../aptos_command_sender.py | 128 +++++++++++ .../aptos_response_unpacker.py | 70 ++++++ .../aptos_utils.py} | 24 +- tests/application_client/py.typed | 0 tests/aptos_client/aptos_cmd.py | 146 ------------ tests/aptos_client/aptos_cmd_builder.py | 215 ------------------ tests/aptos_client/aptos_speculos_cmd.py | 147 ------------ tests/aptos_client/button.py | 52 ----- tests/aptos_client/exception/__init__.py | 35 --- .../exception/device_exception.py | 39 ---- tests/aptos_client/exception/errors.py | 62 ----- tests/conftest.py | 15 ++ tests/ledgercomm/README.md | 61 ----- tests/ledgercomm/aptos_client | 1 - tests/ledgercomm/conftest.py | 75 ------ tests/ledgercomm/requirements.txt | 5 - tests/ledgercomm/test_appname_cmd.py | 2 - tests/ledgercomm/test_error_cmd.py | 44 ---- tests/ledgercomm/test_name_version.py | 7 - tests/ledgercomm/test_pubkey_cmd.py | 8 - tests/ledgercomm/test_sign_raw_cmd.py | 26 --- tests/ledgercomm/test_status_word.py | 39 ---- tests/ledgercomm/test_version_cmd.py | 2 - tests/requirements.txt | 4 + tests/{ledgercomm => }/setup.cfg | 3 +- .../nanos/test_app_mainmenu/00000.png | Bin 0 -> 408 bytes .../nanos/test_app_mainmenu/00001.png | Bin 0 -> 355 bytes .../nanos/test_app_mainmenu/00002.png | Bin 0 -> 327 bytes .../nanos/test_app_mainmenu/00003.png | Bin 0 -> 274 bytes .../part0/00000.png | Bin 0 -> 428 bytes .../part0/00001.png | Bin 0 -> 426 bytes .../part0/00002.png | Bin 0 -> 398 bytes .../part1/00000.png | Bin 0 -> 387 bytes .../part1/00001.png | Bin 0 -> 469 bytes .../part1/00002.png | Bin 0 -> 479 bytes .../part1/00003.png | Bin 0 -> 464 bytes .../part1/00004.png | Bin 0 -> 486 bytes .../part1/00005.png | Bin 0 -> 416 bytes .../part1/00006.png | Bin 0 -> 355 bytes .../part1/00007.png | Bin 0 -> 341 bytes .../part1/00008.png | Bin 0 -> 408 bytes .../00000.png | Bin 0 -> 359 bytes .../00001.png | Bin 0 -> 349 bytes .../00002.png | Bin 0 -> 491 bytes .../00003.png | Bin 0 -> 496 bytes .../00004.png | Bin 0 -> 491 bytes .../00005.png | Bin 0 -> 444 bytes .../00006.png | Bin 0 -> 341 bytes .../00007.png | Bin 0 -> 408 bytes .../00000.png | Bin 0 -> 359 bytes .../00001.png | Bin 0 -> 349 bytes .../00002.png | Bin 0 -> 491 bytes .../00003.png | Bin 0 -> 496 bytes .../00004.png | Bin 0 -> 491 bytes .../00005.png | Bin 0 -> 444 bytes .../00006.png | Bin 0 -> 341 bytes .../00007.png | Bin 0 -> 340 bytes .../00008.png | Bin 0 -> 408 bytes .../nanos/test_sign_tx_refused/00000.png | Bin 0 -> 379 bytes .../nanos/test_sign_tx_refused/00001.png | Bin 0 -> 413 bytes .../nanos/test_sign_tx_refused/00002.png | Bin 0 -> 400 bytes .../nanos/test_sign_tx_refused/00003.png | Bin 0 -> 407 bytes .../nanos/test_sign_tx_refused/00004.png | Bin 0 -> 471 bytes .../nanos/test_sign_tx_refused/00005.png | Bin 0 -> 472 bytes .../nanos/test_sign_tx_refused/00006.png | Bin 0 -> 476 bytes .../nanos/test_sign_tx_refused/00007.png | Bin 0 -> 444 bytes .../nanos/test_sign_tx_refused/00008.png | Bin 0 -> 321 bytes .../nanos/test_sign_tx_refused/00009.png | Bin 0 -> 341 bytes .../nanos/test_sign_tx_refused/00010.png | Bin 0 -> 341 bytes .../nanos/test_sign_tx_refused/00011.png | Bin 0 -> 340 bytes .../nanos/test_sign_tx_refused/00012.png | Bin 0 -> 408 bytes .../nanos/test_sign_tx_short_msg/00000.png | Bin 0 -> 388 bytes .../nanos/test_sign_tx_short_msg/00001.png | Bin 0 -> 379 bytes .../nanos/test_sign_tx_short_msg/00002.png | Bin 0 -> 341 bytes .../nanos/test_sign_tx_short_msg/00003.png | Bin 0 -> 408 bytes .../nanos/test_sign_tx_short_tx/00000.png | Bin 0 -> 379 bytes .../nanos/test_sign_tx_short_tx/00001.png | Bin 0 -> 383 bytes .../nanos/test_sign_tx_short_tx/00002.png | Bin 0 -> 433 bytes .../nanos/test_sign_tx_short_tx/00003.png | Bin 0 -> 451 bytes .../nanos/test_sign_tx_short_tx/00004.png | Bin 0 -> 478 bytes .../nanos/test_sign_tx_short_tx/00005.png | Bin 0 -> 474 bytes .../nanos/test_sign_tx_short_tx/00006.png | Bin 0 -> 473 bytes .../nanos/test_sign_tx_short_tx/00007.png | Bin 0 -> 442 bytes .../nanos/test_sign_tx_short_tx/00008.png | Bin 0 -> 310 bytes .../nanos/test_sign_tx_short_tx/00009.png | Bin 0 -> 347 bytes .../nanos/test_sign_tx_short_tx/00010.png | Bin 0 -> 341 bytes .../nanos/test_sign_tx_short_tx/00011.png | Bin 0 -> 408 bytes .../nanosp/test_app_mainmenu/00000.png | Bin 0 -> 471 bytes .../nanosp/test_app_mainmenu/00001.png | Bin 0 -> 379 bytes .../nanosp/test_app_mainmenu/00002.png | Bin 0 -> 350 bytes .../nanosp/test_app_mainmenu/00003.png | Bin 0 -> 295 bytes .../part0/00000.png | Bin 0 -> 580 bytes .../part0/00001.png | Bin 0 -> 457 bytes .../part1/00000.png | Bin 0 -> 430 bytes .../part1/00001.png | Bin 0 -> 890 bytes .../part1/00002.png | Bin 0 -> 706 bytes .../part1/00003.png | Bin 0 -> 404 bytes .../part1/00004.png | Bin 0 -> 364 bytes .../part1/00005.png | Bin 0 -> 471 bytes .../00000.png | Bin 0 -> 375 bytes .../00001.png | Bin 0 -> 390 bytes .../00002.png | Bin 0 -> 903 bytes .../00003.png | Bin 0 -> 492 bytes .../00004.png | Bin 0 -> 364 bytes .../00005.png | Bin 0 -> 471 bytes .../00000.png | Bin 0 -> 375 bytes .../00001.png | Bin 0 -> 390 bytes .../00002.png | Bin 0 -> 903 bytes .../00003.png | Bin 0 -> 492 bytes .../00004.png | Bin 0 -> 364 bytes .../00005.png | Bin 0 -> 365 bytes .../00006.png | Bin 0 -> 471 bytes .../nanosp/test_sign_tx_refused/00000.png | Bin 0 -> 419 bytes .../nanosp/test_sign_tx_refused/00001.png | Bin 0 -> 517 bytes .../nanosp/test_sign_tx_refused/00002.png | Bin 0 -> 538 bytes .../nanosp/test_sign_tx_refused/00003.png | Bin 0 -> 888 bytes .../nanosp/test_sign_tx_refused/00004.png | Bin 0 -> 514 bytes .../nanosp/test_sign_tx_refused/00005.png | Bin 0 -> 376 bytes .../nanosp/test_sign_tx_refused/00006.png | Bin 0 -> 388 bytes .../nanosp/test_sign_tx_refused/00007.png | Bin 0 -> 364 bytes .../nanosp/test_sign_tx_refused/00008.png | Bin 0 -> 365 bytes .../nanosp/test_sign_tx_refused/00009.png | Bin 0 -> 471 bytes .../nanosp/test_sign_tx_short_msg/00000.png | Bin 0 -> 420 bytes .../nanosp/test_sign_tx_short_msg/00001.png | Bin 0 -> 449 bytes .../nanosp/test_sign_tx_short_msg/00002.png | Bin 0 -> 364 bytes .../nanosp/test_sign_tx_short_msg/00003.png | Bin 0 -> 471 bytes .../nanosp/test_sign_tx_short_tx/00000.png | Bin 0 -> 419 bytes .../nanosp/test_sign_tx_short_tx/00001.png | Bin 0 -> 439 bytes .../nanosp/test_sign_tx_short_tx/00002.png | Bin 0 -> 571 bytes .../nanosp/test_sign_tx_short_tx/00003.png | Bin 0 -> 889 bytes .../nanosp/test_sign_tx_short_tx/00004.png | Bin 0 -> 501 bytes .../nanosp/test_sign_tx_short_tx/00005.png | Bin 0 -> 363 bytes .../nanosp/test_sign_tx_short_tx/00006.png | Bin 0 -> 390 bytes .../nanosp/test_sign_tx_short_tx/00007.png | Bin 0 -> 364 bytes .../nanosp/test_sign_tx_short_tx/00008.png | Bin 0 -> 471 bytes .../nanox/test_app_mainmenu/00000.png | Bin 0 -> 471 bytes .../nanox/test_app_mainmenu/00001.png | Bin 0 -> 381 bytes .../nanox/test_app_mainmenu/00002.png | Bin 0 -> 350 bytes .../nanox/test_app_mainmenu/00003.png | Bin 0 -> 295 bytes .../part0/00000.png | Bin 0 -> 580 bytes .../part0/00001.png | Bin 0 -> 457 bytes .../part1/00000.png | Bin 0 -> 430 bytes .../part1/00001.png | Bin 0 -> 890 bytes .../part1/00002.png | Bin 0 -> 706 bytes .../part1/00003.png | Bin 0 -> 404 bytes .../part1/00004.png | Bin 0 -> 364 bytes .../part1/00005.png | Bin 0 -> 471 bytes .../00000.png | Bin 0 -> 375 bytes .../00001.png | Bin 0 -> 390 bytes .../00002.png | Bin 0 -> 903 bytes .../00003.png | Bin 0 -> 494 bytes .../00004.png | Bin 0 -> 364 bytes .../00005.png | Bin 0 -> 471 bytes .../00000.png | Bin 0 -> 375 bytes .../00001.png | Bin 0 -> 390 bytes .../00002.png | Bin 0 -> 903 bytes .../00003.png | Bin 0 -> 494 bytes .../00004.png | Bin 0 -> 364 bytes .../00005.png | Bin 0 -> 366 bytes .../00006.png | Bin 0 -> 471 bytes .../nanox/test_sign_tx_refused/00000.png | Bin 0 -> 419 bytes .../nanox/test_sign_tx_refused/00001.png | Bin 0 -> 517 bytes .../nanox/test_sign_tx_refused/00002.png | Bin 0 -> 538 bytes .../nanox/test_sign_tx_refused/00003.png | Bin 0 -> 888 bytes .../nanox/test_sign_tx_refused/00004.png | Bin 0 -> 514 bytes .../nanox/test_sign_tx_refused/00005.png | Bin 0 -> 376 bytes .../nanox/test_sign_tx_refused/00006.png | Bin 0 -> 388 bytes .../nanox/test_sign_tx_refused/00007.png | Bin 0 -> 364 bytes .../nanox/test_sign_tx_refused/00008.png | Bin 0 -> 366 bytes .../nanox/test_sign_tx_refused/00009.png | Bin 0 -> 471 bytes .../nanox/test_sign_tx_short_msg/00000.png | Bin 0 -> 420 bytes .../nanox/test_sign_tx_short_msg/00001.png | Bin 0 -> 449 bytes .../nanox/test_sign_tx_short_msg/00002.png | Bin 0 -> 364 bytes .../nanox/test_sign_tx_short_msg/00003.png | Bin 0 -> 471 bytes .../nanox/test_sign_tx_short_tx/00000.png | Bin 0 -> 419 bytes .../nanox/test_sign_tx_short_tx/00001.png | Bin 0 -> 439 bytes .../nanox/test_sign_tx_short_tx/00002.png | Bin 0 -> 571 bytes .../nanox/test_sign_tx_short_tx/00003.png | Bin 0 -> 889 bytes .../nanox/test_sign_tx_short_tx/00004.png | Bin 0 -> 501 bytes .../nanox/test_sign_tx_short_tx/00005.png | Bin 0 -> 363 bytes .../nanox/test_sign_tx_short_tx/00006.png | Bin 0 -> 389 bytes .../nanox/test_sign_tx_short_tx/00007.png | Bin 0 -> 364 bytes .../nanox/test_sign_tx_short_tx/00008.png | Bin 0 -> 471 bytes .../stax/test_app_mainmenu/00000.png | Bin 0 -> 10733 bytes .../stax/test_app_mainmenu/00001.png | Bin 0 -> 12847 bytes .../stax/test_app_mainmenu/00002.png | Bin 0 -> 8398 bytes .../stax/test_app_mainmenu/00003.png | Bin 0 -> 8408 bytes .../stax/test_app_mainmenu/00004.png | Bin 0 -> 8398 bytes .../stax/test_app_mainmenu/00005.png | Bin 0 -> 12847 bytes .../stax/test_app_mainmenu/00006.png | Bin 0 -> 10733 bytes .../part0/00000.png | Bin 0 -> 11829 bytes .../part0/00001.png | Bin 0 -> 5208 bytes .../part1/00000.png | Bin 0 -> 14317 bytes .../part1/00001.png | Bin 0 -> 8400 bytes .../part1/00002.png | Bin 0 -> 19728 bytes .../part1/00003.png | Bin 0 -> 9157 bytes .../part1/00004.png | Bin 0 -> 5467 bytes .../part1/00005.png | Bin 0 -> 10733 bytes .../00000.png | Bin 0 -> 8637 bytes .../00001.png | Bin 0 -> 16382 bytes .../00002.png | Bin 0 -> 11214 bytes .../00003.png | Bin 0 -> 16382 bytes .../00004.png | Bin 0 -> 7925 bytes .../00005.png | Bin 0 -> 4615 bytes .../00006.png | Bin 0 -> 10733 bytes .../part0/00000.png | Bin 0 -> 8637 bytes .../part0/00001.png | Bin 0 -> 6532 bytes .../part0/00002.png | Bin 0 -> 10733 bytes .../part1/00000.png | Bin 0 -> 8637 bytes .../part1/00001.png | Bin 0 -> 16382 bytes .../part1/00002.png | Bin 0 -> 6532 bytes .../part1/00003.png | Bin 0 -> 10733 bytes .../stax/test_sign_tx_refused/part0/00000.png | Bin 0 -> 10071 bytes .../stax/test_sign_tx_refused/part0/00001.png | Bin 0 -> 8273 bytes .../stax/test_sign_tx_refused/part0/00002.png | Bin 0 -> 5076 bytes .../stax/test_sign_tx_refused/part0/00003.png | Bin 0 -> 10733 bytes .../stax/test_sign_tx_refused/part1/00000.png | Bin 0 -> 10071 bytes .../stax/test_sign_tx_refused/part1/00001.png | Bin 0 -> 12572 bytes .../stax/test_sign_tx_refused/part1/00002.png | Bin 0 -> 8273 bytes .../stax/test_sign_tx_refused/part1/00003.png | Bin 0 -> 5076 bytes .../stax/test_sign_tx_refused/part1/00004.png | Bin 0 -> 10733 bytes .../stax/test_sign_tx_refused/part2/00000.png | Bin 0 -> 10071 bytes .../stax/test_sign_tx_refused/part2/00001.png | Bin 0 -> 12572 bytes .../stax/test_sign_tx_refused/part2/00002.png | Bin 0 -> 20356 bytes .../stax/test_sign_tx_refused/part2/00003.png | Bin 0 -> 8273 bytes .../stax/test_sign_tx_refused/part2/00004.png | Bin 0 -> 5076 bytes .../stax/test_sign_tx_refused/part2/00005.png | Bin 0 -> 10733 bytes .../stax/test_sign_tx_refused/part3/00000.png | Bin 0 -> 10071 bytes .../stax/test_sign_tx_refused/part3/00001.png | Bin 0 -> 12572 bytes .../stax/test_sign_tx_refused/part3/00002.png | Bin 0 -> 20356 bytes .../stax/test_sign_tx_refused/part3/00003.png | Bin 0 -> 9157 bytes .../stax/test_sign_tx_refused/part3/00004.png | Bin 0 -> 8273 bytes .../stax/test_sign_tx_refused/part3/00005.png | Bin 0 -> 5076 bytes .../stax/test_sign_tx_refused/part3/00006.png | Bin 0 -> 10733 bytes .../stax/test_sign_tx_short_msg/00000.png | Bin 0 -> 7712 bytes .../stax/test_sign_tx_short_msg/00001.png | Bin 0 -> 8036 bytes .../stax/test_sign_tx_short_msg/00002.png | Bin 0 -> 8440 bytes .../stax/test_sign_tx_short_msg/00003.png | Bin 0 -> 5084 bytes .../stax/test_sign_tx_short_msg/00004.png | Bin 0 -> 10733 bytes .../stax/test_sign_tx_short_tx/00000.png | Bin 0 -> 10109 bytes .../stax/test_sign_tx_short_tx/00001.png | Bin 0 -> 12801 bytes .../stax/test_sign_tx_short_tx/00002.png | Bin 0 -> 19442 bytes .../stax/test_sign_tx_short_tx/00003.png | Bin 0 -> 9157 bytes .../stax/test_sign_tx_short_tx/00004.png | Bin 0 -> 5467 bytes .../stax/test_sign_tx_short_tx/00005.png | Bin 0 -> 10733 bytes tests/speculos/README.md | 28 --- tests/speculos/aptos_client | 1 - tests/speculos/conftest.py | 53 ----- tests/speculos/requirements.txt | 6 - tests/speculos/setup.cfg | 20 -- tests/speculos/test_appname_cmd.py | 2 - tests/speculos/test_error_cmd.py | 42 ---- tests/speculos/test_name_version.py | 5 - tests/speculos/test_pubkey_cmd.py | 8 - tests/speculos/test_sign_raw_cmd.py | 25 -- tests/speculos/test_status_word.py | 39 ---- tests/speculos/test_version_cmd.py | 2 - tests/test_app_mainmenu.py | 25 ++ tests/test_appname_cmd.py | 12 + tests/test_error_cmd.py | 57 +++++ tests/test_name_version.py | 15 ++ tests/test_pubkey_cmd.py | 101 ++++++++ tests/test_sign_cmd.py | 171 ++++++++++++++ tests/test_version_cmd.py | 16 ++ tests/utils.py | 16 ++ 268 files changed, 703 insertions(+), 1245 deletions(-) create mode 100644 tests/.gitignore rename tests/{aptos_client => application_client}/__init__.py (100%) create mode 100644 tests/application_client/aptos_command_sender.py create mode 100644 tests/application_client/aptos_response_unpacker.py rename tests/{aptos_client/utils.py => application_client/aptos_utils.py} (66%) create mode 100644 tests/application_client/py.typed delete mode 100644 tests/aptos_client/aptos_cmd.py delete mode 100644 tests/aptos_client/aptos_cmd_builder.py delete mode 100644 tests/aptos_client/aptos_speculos_cmd.py delete mode 100644 tests/aptos_client/button.py delete mode 100644 tests/aptos_client/exception/__init__.py delete mode 100644 tests/aptos_client/exception/device_exception.py delete mode 100644 tests/aptos_client/exception/errors.py create mode 100644 tests/conftest.py delete mode 100644 tests/ledgercomm/README.md delete mode 120000 tests/ledgercomm/aptos_client delete mode 100644 tests/ledgercomm/conftest.py delete mode 100644 tests/ledgercomm/requirements.txt delete mode 100644 tests/ledgercomm/test_appname_cmd.py delete mode 100644 tests/ledgercomm/test_error_cmd.py delete mode 100644 tests/ledgercomm/test_name_version.py delete mode 100644 tests/ledgercomm/test_pubkey_cmd.py delete mode 100644 tests/ledgercomm/test_sign_raw_cmd.py delete mode 100644 tests/ledgercomm/test_status_word.py delete mode 100644 tests/ledgercomm/test_version_cmd.py create mode 100644 tests/requirements.txt rename tests/{ledgercomm => }/setup.cfg (91%) create mode 100644 tests/snapshots/nanos/test_app_mainmenu/00000.png create mode 100644 tests/snapshots/nanos/test_app_mainmenu/00001.png create mode 100644 tests/snapshots/nanos/test_app_mainmenu/00002.png create mode 100644 tests/snapshots/nanos/test_app_mainmenu/00003.png create mode 100644 tests/snapshots/nanos/test_blind_sign_tx_long_tx/part0/00000.png create mode 100644 tests/snapshots/nanos/test_blind_sign_tx_long_tx/part0/00001.png create mode 100644 tests/snapshots/nanos/test_blind_sign_tx_long_tx/part0/00002.png create mode 100644 tests/snapshots/nanos/test_blind_sign_tx_long_tx/part1/00000.png create mode 100644 tests/snapshots/nanos/test_blind_sign_tx_long_tx/part1/00001.png create mode 100644 tests/snapshots/nanos/test_blind_sign_tx_long_tx/part1/00002.png create mode 100644 tests/snapshots/nanos/test_blind_sign_tx_long_tx/part1/00003.png create mode 100644 tests/snapshots/nanos/test_blind_sign_tx_long_tx/part1/00004.png create mode 100644 tests/snapshots/nanos/test_blind_sign_tx_long_tx/part1/00005.png create mode 100644 tests/snapshots/nanos/test_blind_sign_tx_long_tx/part1/00006.png create mode 100644 tests/snapshots/nanos/test_blind_sign_tx_long_tx/part1/00007.png create mode 100644 tests/snapshots/nanos/test_blind_sign_tx_long_tx/part1/00008.png create mode 100644 tests/snapshots/nanos/test_get_public_key_confirm_accepted/00000.png create mode 100644 tests/snapshots/nanos/test_get_public_key_confirm_accepted/00001.png create mode 100644 tests/snapshots/nanos/test_get_public_key_confirm_accepted/00002.png create mode 100644 tests/snapshots/nanos/test_get_public_key_confirm_accepted/00003.png create mode 100644 tests/snapshots/nanos/test_get_public_key_confirm_accepted/00004.png create mode 100644 tests/snapshots/nanos/test_get_public_key_confirm_accepted/00005.png create mode 100644 tests/snapshots/nanos/test_get_public_key_confirm_accepted/00006.png create mode 100644 tests/snapshots/nanos/test_get_public_key_confirm_accepted/00007.png create mode 100644 tests/snapshots/nanos/test_get_public_key_confirm_refused/00000.png create mode 100644 tests/snapshots/nanos/test_get_public_key_confirm_refused/00001.png create mode 100644 tests/snapshots/nanos/test_get_public_key_confirm_refused/00002.png create mode 100644 tests/snapshots/nanos/test_get_public_key_confirm_refused/00003.png create mode 100644 tests/snapshots/nanos/test_get_public_key_confirm_refused/00004.png create mode 100644 tests/snapshots/nanos/test_get_public_key_confirm_refused/00005.png create mode 100644 tests/snapshots/nanos/test_get_public_key_confirm_refused/00006.png create mode 100644 tests/snapshots/nanos/test_get_public_key_confirm_refused/00007.png create mode 100644 tests/snapshots/nanos/test_get_public_key_confirm_refused/00008.png create mode 100644 tests/snapshots/nanos/test_sign_tx_refused/00000.png create mode 100644 tests/snapshots/nanos/test_sign_tx_refused/00001.png create mode 100644 tests/snapshots/nanos/test_sign_tx_refused/00002.png create mode 100644 tests/snapshots/nanos/test_sign_tx_refused/00003.png create mode 100644 tests/snapshots/nanos/test_sign_tx_refused/00004.png create mode 100644 tests/snapshots/nanos/test_sign_tx_refused/00005.png create mode 100644 tests/snapshots/nanos/test_sign_tx_refused/00006.png create mode 100644 tests/snapshots/nanos/test_sign_tx_refused/00007.png create mode 100644 tests/snapshots/nanos/test_sign_tx_refused/00008.png create mode 100644 tests/snapshots/nanos/test_sign_tx_refused/00009.png create mode 100644 tests/snapshots/nanos/test_sign_tx_refused/00010.png create mode 100644 tests/snapshots/nanos/test_sign_tx_refused/00011.png create mode 100644 tests/snapshots/nanos/test_sign_tx_refused/00012.png create mode 100644 tests/snapshots/nanos/test_sign_tx_short_msg/00000.png create mode 100644 tests/snapshots/nanos/test_sign_tx_short_msg/00001.png create mode 100644 tests/snapshots/nanos/test_sign_tx_short_msg/00002.png create mode 100644 tests/snapshots/nanos/test_sign_tx_short_msg/00003.png create mode 100644 tests/snapshots/nanos/test_sign_tx_short_tx/00000.png create mode 100644 tests/snapshots/nanos/test_sign_tx_short_tx/00001.png create mode 100644 tests/snapshots/nanos/test_sign_tx_short_tx/00002.png create mode 100644 tests/snapshots/nanos/test_sign_tx_short_tx/00003.png create mode 100644 tests/snapshots/nanos/test_sign_tx_short_tx/00004.png create mode 100644 tests/snapshots/nanos/test_sign_tx_short_tx/00005.png create mode 100644 tests/snapshots/nanos/test_sign_tx_short_tx/00006.png create mode 100644 tests/snapshots/nanos/test_sign_tx_short_tx/00007.png create mode 100644 tests/snapshots/nanos/test_sign_tx_short_tx/00008.png create mode 100644 tests/snapshots/nanos/test_sign_tx_short_tx/00009.png create mode 100644 tests/snapshots/nanos/test_sign_tx_short_tx/00010.png create mode 100644 tests/snapshots/nanos/test_sign_tx_short_tx/00011.png create mode 100644 tests/snapshots/nanosp/test_app_mainmenu/00000.png create mode 100644 tests/snapshots/nanosp/test_app_mainmenu/00001.png create mode 100644 tests/snapshots/nanosp/test_app_mainmenu/00002.png create mode 100644 tests/snapshots/nanosp/test_app_mainmenu/00003.png create mode 100644 tests/snapshots/nanosp/test_blind_sign_tx_long_tx/part0/00000.png create mode 100644 tests/snapshots/nanosp/test_blind_sign_tx_long_tx/part0/00001.png create mode 100644 tests/snapshots/nanosp/test_blind_sign_tx_long_tx/part1/00000.png create mode 100644 tests/snapshots/nanosp/test_blind_sign_tx_long_tx/part1/00001.png create mode 100644 tests/snapshots/nanosp/test_blind_sign_tx_long_tx/part1/00002.png create mode 100644 tests/snapshots/nanosp/test_blind_sign_tx_long_tx/part1/00003.png create mode 100644 tests/snapshots/nanosp/test_blind_sign_tx_long_tx/part1/00004.png create mode 100644 tests/snapshots/nanosp/test_blind_sign_tx_long_tx/part1/00005.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_accepted/00005.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_get_public_key_confirm_refused/00004.png create mode 100644 tests/snapshots/nanosp/test_get_public_key_confirm_refused/00005.png create mode 100644 tests/snapshots/nanosp/test_get_public_key_confirm_refused/00006.png create mode 100644 tests/snapshots/nanosp/test_sign_tx_refused/00000.png create mode 100644 tests/snapshots/nanosp/test_sign_tx_refused/00001.png create mode 100644 tests/snapshots/nanosp/test_sign_tx_refused/00002.png create mode 100644 tests/snapshots/nanosp/test_sign_tx_refused/00003.png create mode 100644 tests/snapshots/nanosp/test_sign_tx_refused/00004.png create mode 100644 tests/snapshots/nanosp/test_sign_tx_refused/00005.png create mode 100644 tests/snapshots/nanosp/test_sign_tx_refused/00006.png create mode 100644 tests/snapshots/nanosp/test_sign_tx_refused/00007.png create mode 100644 tests/snapshots/nanosp/test_sign_tx_refused/00008.png create mode 100644 tests/snapshots/nanosp/test_sign_tx_refused/00009.png create mode 100644 tests/snapshots/nanosp/test_sign_tx_short_msg/00000.png create mode 100644 tests/snapshots/nanosp/test_sign_tx_short_msg/00001.png create mode 100644 tests/snapshots/nanosp/test_sign_tx_short_msg/00002.png create mode 100644 tests/snapshots/nanosp/test_sign_tx_short_msg/00003.png create mode 100644 tests/snapshots/nanosp/test_sign_tx_short_tx/00000.png create mode 100644 tests/snapshots/nanosp/test_sign_tx_short_tx/00001.png create mode 100644 tests/snapshots/nanosp/test_sign_tx_short_tx/00002.png create mode 100644 tests/snapshots/nanosp/test_sign_tx_short_tx/00003.png create mode 100644 tests/snapshots/nanosp/test_sign_tx_short_tx/00004.png create mode 100644 tests/snapshots/nanosp/test_sign_tx_short_tx/00005.png create mode 100644 tests/snapshots/nanosp/test_sign_tx_short_tx/00006.png create mode 100644 tests/snapshots/nanosp/test_sign_tx_short_tx/00007.png create mode 100644 tests/snapshots/nanosp/test_sign_tx_short_tx/00008.png create mode 100644 tests/snapshots/nanox/test_app_mainmenu/00000.png create mode 100644 tests/snapshots/nanox/test_app_mainmenu/00001.png create mode 100644 tests/snapshots/nanox/test_app_mainmenu/00002.png create mode 100644 tests/snapshots/nanox/test_app_mainmenu/00003.png create mode 100644 tests/snapshots/nanox/test_blind_sign_tx_long_tx/part0/00000.png create mode 100644 tests/snapshots/nanox/test_blind_sign_tx_long_tx/part0/00001.png create mode 100644 tests/snapshots/nanox/test_blind_sign_tx_long_tx/part1/00000.png create mode 100644 tests/snapshots/nanox/test_blind_sign_tx_long_tx/part1/00001.png create mode 100644 tests/snapshots/nanox/test_blind_sign_tx_long_tx/part1/00002.png create mode 100644 tests/snapshots/nanox/test_blind_sign_tx_long_tx/part1/00003.png create mode 100644 tests/snapshots/nanox/test_blind_sign_tx_long_tx/part1/00004.png create mode 100644 tests/snapshots/nanox/test_blind_sign_tx_long_tx/part1/00005.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_accepted/00005.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_get_public_key_confirm_refused/00004.png create mode 100644 tests/snapshots/nanox/test_get_public_key_confirm_refused/00005.png create mode 100644 tests/snapshots/nanox/test_get_public_key_confirm_refused/00006.png create mode 100644 tests/snapshots/nanox/test_sign_tx_refused/00000.png create mode 100644 tests/snapshots/nanox/test_sign_tx_refused/00001.png create mode 100644 tests/snapshots/nanox/test_sign_tx_refused/00002.png create mode 100644 tests/snapshots/nanox/test_sign_tx_refused/00003.png create mode 100644 tests/snapshots/nanox/test_sign_tx_refused/00004.png create mode 100644 tests/snapshots/nanox/test_sign_tx_refused/00005.png create mode 100644 tests/snapshots/nanox/test_sign_tx_refused/00006.png create mode 100644 tests/snapshots/nanox/test_sign_tx_refused/00007.png create mode 100644 tests/snapshots/nanox/test_sign_tx_refused/00008.png create mode 100644 tests/snapshots/nanox/test_sign_tx_refused/00009.png create mode 100644 tests/snapshots/nanox/test_sign_tx_short_msg/00000.png create mode 100644 tests/snapshots/nanox/test_sign_tx_short_msg/00001.png create mode 100644 tests/snapshots/nanox/test_sign_tx_short_msg/00002.png create mode 100644 tests/snapshots/nanox/test_sign_tx_short_msg/00003.png create mode 100644 tests/snapshots/nanox/test_sign_tx_short_tx/00000.png create mode 100644 tests/snapshots/nanox/test_sign_tx_short_tx/00001.png create mode 100644 tests/snapshots/nanox/test_sign_tx_short_tx/00002.png create mode 100644 tests/snapshots/nanox/test_sign_tx_short_tx/00003.png create mode 100644 tests/snapshots/nanox/test_sign_tx_short_tx/00004.png create mode 100644 tests/snapshots/nanox/test_sign_tx_short_tx/00005.png create mode 100644 tests/snapshots/nanox/test_sign_tx_short_tx/00006.png create mode 100644 tests/snapshots/nanox/test_sign_tx_short_tx/00007.png create mode 100644 tests/snapshots/nanox/test_sign_tx_short_tx/00008.png create mode 100644 tests/snapshots/stax/test_app_mainmenu/00000.png create mode 100644 tests/snapshots/stax/test_app_mainmenu/00001.png create mode 100644 tests/snapshots/stax/test_app_mainmenu/00002.png create mode 100644 tests/snapshots/stax/test_app_mainmenu/00003.png create mode 100644 tests/snapshots/stax/test_app_mainmenu/00004.png create mode 100644 tests/snapshots/stax/test_app_mainmenu/00005.png create mode 100644 tests/snapshots/stax/test_app_mainmenu/00006.png create mode 100644 tests/snapshots/stax/test_blind_sign_tx_long_tx/part0/00000.png create mode 100644 tests/snapshots/stax/test_blind_sign_tx_long_tx/part0/00001.png create mode 100644 tests/snapshots/stax/test_blind_sign_tx_long_tx/part1/00000.png create mode 100644 tests/snapshots/stax/test_blind_sign_tx_long_tx/part1/00001.png create mode 100644 tests/snapshots/stax/test_blind_sign_tx_long_tx/part1/00002.png create mode 100644 tests/snapshots/stax/test_blind_sign_tx_long_tx/part1/00003.png create mode 100644 tests/snapshots/stax/test_blind_sign_tx_long_tx/part1/00004.png create mode 100644 tests/snapshots/stax/test_blind_sign_tx_long_tx/part1/00005.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_accepted/00004.png create mode 100644 tests/snapshots/stax/test_get_public_key_confirm_accepted/00005.png create mode 100644 tests/snapshots/stax/test_get_public_key_confirm_accepted/00006.png create mode 100644 tests/snapshots/stax/test_get_public_key_confirm_refused/part0/00000.png create mode 100644 tests/snapshots/stax/test_get_public_key_confirm_refused/part0/00001.png create mode 100644 tests/snapshots/stax/test_get_public_key_confirm_refused/part0/00002.png create mode 100644 tests/snapshots/stax/test_get_public_key_confirm_refused/part1/00000.png create mode 100644 tests/snapshots/stax/test_get_public_key_confirm_refused/part1/00001.png create mode 100644 tests/snapshots/stax/test_get_public_key_confirm_refused/part1/00002.png create mode 100644 tests/snapshots/stax/test_get_public_key_confirm_refused/part1/00003.png create mode 100644 tests/snapshots/stax/test_sign_tx_refused/part0/00000.png create mode 100644 tests/snapshots/stax/test_sign_tx_refused/part0/00001.png create mode 100644 tests/snapshots/stax/test_sign_tx_refused/part0/00002.png create mode 100644 tests/snapshots/stax/test_sign_tx_refused/part0/00003.png create mode 100644 tests/snapshots/stax/test_sign_tx_refused/part1/00000.png create mode 100644 tests/snapshots/stax/test_sign_tx_refused/part1/00001.png create mode 100644 tests/snapshots/stax/test_sign_tx_refused/part1/00002.png create mode 100644 tests/snapshots/stax/test_sign_tx_refused/part1/00003.png create mode 100644 tests/snapshots/stax/test_sign_tx_refused/part1/00004.png create mode 100644 tests/snapshots/stax/test_sign_tx_refused/part2/00000.png create mode 100644 tests/snapshots/stax/test_sign_tx_refused/part2/00001.png create mode 100644 tests/snapshots/stax/test_sign_tx_refused/part2/00002.png create mode 100644 tests/snapshots/stax/test_sign_tx_refused/part2/00003.png create mode 100644 tests/snapshots/stax/test_sign_tx_refused/part2/00004.png create mode 100644 tests/snapshots/stax/test_sign_tx_refused/part2/00005.png create mode 100644 tests/snapshots/stax/test_sign_tx_refused/part3/00000.png create mode 100644 tests/snapshots/stax/test_sign_tx_refused/part3/00001.png create mode 100644 tests/snapshots/stax/test_sign_tx_refused/part3/00002.png create mode 100644 tests/snapshots/stax/test_sign_tx_refused/part3/00003.png create mode 100644 tests/snapshots/stax/test_sign_tx_refused/part3/00004.png create mode 100644 tests/snapshots/stax/test_sign_tx_refused/part3/00005.png create mode 100644 tests/snapshots/stax/test_sign_tx_refused/part3/00006.png create mode 100644 tests/snapshots/stax/test_sign_tx_short_msg/00000.png create mode 100644 tests/snapshots/stax/test_sign_tx_short_msg/00001.png create mode 100644 tests/snapshots/stax/test_sign_tx_short_msg/00002.png create mode 100644 tests/snapshots/stax/test_sign_tx_short_msg/00003.png create mode 100644 tests/snapshots/stax/test_sign_tx_short_msg/00004.png create mode 100644 tests/snapshots/stax/test_sign_tx_short_tx/00000.png create mode 100644 tests/snapshots/stax/test_sign_tx_short_tx/00001.png create mode 100644 tests/snapshots/stax/test_sign_tx_short_tx/00002.png create mode 100644 tests/snapshots/stax/test_sign_tx_short_tx/00003.png create mode 100644 tests/snapshots/stax/test_sign_tx_short_tx/00004.png create mode 100644 tests/snapshots/stax/test_sign_tx_short_tx/00005.png delete mode 100644 tests/speculos/README.md delete mode 120000 tests/speculos/aptos_client delete mode 100644 tests/speculos/conftest.py delete mode 100644 tests/speculos/requirements.txt delete mode 100644 tests/speculos/setup.cfg delete mode 100644 tests/speculos/test_appname_cmd.py delete mode 100644 tests/speculos/test_error_cmd.py delete mode 100644 tests/speculos/test_name_version.py delete mode 100644 tests/speculos/test_pubkey_cmd.py delete mode 100644 tests/speculos/test_sign_raw_cmd.py delete mode 100644 tests/speculos/test_status_word.py delete mode 100644 tests/speculos/test_version_cmd.py create mode 100644 tests/test_app_mainmenu.py create mode 100644 tests/test_appname_cmd.py create mode 100644 tests/test_error_cmd.py create mode 100644 tests/test_name_version.py create mode 100644 tests/test_pubkey_cmd.py create mode 100644 tests/test_sign_cmd.py create mode 100644 tests/test_version_cmd.py create mode 100644 tests/utils.py diff --git a/tests/.gitignore b/tests/.gitignore new file mode 100644 index 0000000..dc1a0c8 --- /dev/null +++ b/tests/.gitignore @@ -0,0 +1 @@ +snapshots-tmp/ diff --git a/tests/README.md b/tests/README.md index 070f490..be8890f 100644 --- a/tests/README.md +++ b/tests/README.md @@ -1,37 +1,74 @@ -# Functional tests +# How to use the Ragger test framework -> :point_right: Every path on this document assumes you are at the root of the repository +This framework allows testing the application on the Speculos emulator or on a real device using LedgerComm or LedgerWallet -This directory contains examples of functional tests: -- `tests/ledgercomm/` directory uses the - [Python LedgerComm library](https://github.com/LedgerHQ/ledgercomm), which - allows the tests to run either on an actual Nano, or on - [Speculos](https://github.com/LedgerHQ/speculos), -- `tests/speculos/` directory uses the Python client of - [Speculos](https://github.com/LedgerHQ/speculos) to run the tests directly on - the Speculos emulator +## Quickly get started with Ragger and Speculos -## Speculos or LedgerComm? +### Install ragger and dependencies -Speculos is a Nano S/X emulator which provides a Python HTTP client. Despite not -being able to emulate **every** feature of a Nano S/X, it is a fast and powerful -tool, and is broadly used to test application (directly, or through LedgerComm, -or third-party tool such as [Zemu](https://github.com/Zondax/zemu)) which helps -building strong tests and CIs. +``` +pip install --extra-index-url https://test.pypi.org/simple/ -r requirements.txt +sudo apt-get update && sudo apt-get install qemu-user-static +``` -LedgerComm is a library which eases the exchange of APDU though HID or TCP -sockets. It works with both a real Nano S/X wallet, or Speculos. As the CI of -this repository does not have access to a Nano S/X, it uses Speculos. +### Compile the application -The functional tests using Speculos (`tests/speculos/` directory) or LedgerComm -\+ Speculos (`tests/ledgercomm/` directory) are the same, use the same language -(Python) and most of the code is also the same, so it is a good opportunity to -compare how they behave. +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`: +``` +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 [NANOS, NANOX, NANOSP, STAX] +exit +``` -Speculos tests are a bit smaller and more straightforward, as the physical -interaction through buttons are managed through the client just like the APDU, -and the emulator is automatically spawned and stopped. +### Run a simple test using the Speculos emulator + +You can use the following command to get your first experience with Ragger and Speculos +``` +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`: +``` +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 [NANOS, NANOX, NANOSP, STAX] +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. +``` +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 +``` + -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 +``` + --device run the test on the specified device [nanos,nanox,nanosp,stax,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 +``` -LedgerComm tests are a bit heavier, and need a backend (either Speculos, or a -physical device) up and running, but can be run on an actual Nano S/X. diff --git a/tests/aptos_client/__init__.py b/tests/application_client/__init__.py similarity index 100% rename from tests/aptos_client/__init__.py rename to tests/application_client/__init__.py diff --git a/tests/application_client/aptos_command_sender.py b/tests/application_client/aptos_command_sender.py new file mode 100644 index 0000000..7e01ebd --- /dev/null +++ b/tests/application_client/aptos_command_sender.py @@ -0,0 +1,128 @@ +from enum import IntEnum +from typing import Generator, List, Optional +from contextlib import contextmanager + +from ragger.backend.interface import BackendInterface, RAPDU +from ragger.bip import pack_derivation_path + + +MAX_APDU_LEN: int = 255 + +CLA: int = 0x5B + +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_VERSION = 0x03 + GET_APP_NAME = 0x04 + GET_PUBLIC_KEY = 0x05 + SIGN_TX = 0x06 + +class Errors(IntEnum): + SW_DENY = 0x6985 + 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_GET_PUB_KEY_FAIL = 0xB006 + SW_BAD_STATE = 0xB007 + SW_SIGNATURE_FAIL = 0xB008 + SW_DISPLAY_GAS_FEE_FAIL = 0xB009 + + +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 AptosCommandSender: + 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_version(self) -> RAPDU: + return self.backend.exchange(cla=CLA, + ins=InsType.GET_VERSION, + p1=P1.P1_START, + p2=P2.P2_LAST, + data=b"") + + + def get_app_name(self) -> RAPDU: + return self.backend.exchange(cla=CLA, + ins=InsType.GET_APP_NAME, + p1=P1.P1_START, + p2=P2.P2_LAST, + data=b"") + + + def get_public_key(self, path: str) -> RAPDU: + return self.backend.exchange(cla=CLA, + ins=InsType.GET_PUBLIC_KEY, + p1=P1.P1_START, + p2=P2.P2_LAST, + data=pack_derivation_path(path)) + + + @contextmanager + def get_public_key_with_confirmation(self, path: str) -> 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=pack_derivation_path(path)) as response: + yield response + + + @contextmanager + def sign_tx(self, path: str, transaction: bytes) -> Generator[None, None, None]: + self.backend.exchange(cla=CLA, + ins=InsType.SIGN_TX, + p1=P1.P1_START, + p2=P2.P2_MORE, + data=pack_derivation_path(path)) + messages = split_message(transaction, MAX_APDU_LEN) + idx: int = P1.P1_START + 1 + + for msg in messages[:-1]: + self.backend.exchange(cla=CLA, + ins=InsType.SIGN_TX, + p1=idx, + p2=P2.P2_MORE, + data=msg) + idx += 1 + + with self.backend.exchange_async(cla=CLA, + ins=InsType.SIGN_TX, + p1=idx, + p2=P2.P2_LAST, + data=messages[-1]) as response: + yield response + + def get_async_response(self) -> Optional[RAPDU]: + return self.backend.last_async_response diff --git a/tests/application_client/aptos_response_unpacker.py b/tests/application_client/aptos_response_unpacker.py new file mode 100644 index 0000000..cc8bc2d --- /dev/null +++ b/tests/application_client/aptos_response_unpacker.py @@ -0,0 +1,70 @@ +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) +# chain_code_len (1) +# chain_code (var) +def unpack_get_public_key_response(response: bytes) -> Tuple[int, bytes, int, bytes]: + response, pub_key_len, pub_key = pop_size_prefixed_buf_from_buf(response) + response, chain_code_len, chain_code = pop_size_prefixed_buf_from_buf(response) + + assert pub_key_len == 33 + assert chain_code_len == 32 + assert len(response) == 0 + + return pub_key_len, pub_key, chain_code_len, chain_code + +# 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, sig_len, sig = pop_size_prefixed_buf_from_buf(response) + response, v = pop_sized_buf_from_buffer(response, 1) + + assert len(response) == 0 + + return sig_len, sig, int.from_bytes(v, byteorder='big') diff --git a/tests/aptos_client/utils.py b/tests/application_client/aptos_utils.py similarity index 66% rename from tests/aptos_client/utils.py rename to tests/application_client/aptos_utils.py index 6260ed2..fd96e62 100644 --- a/tests/aptos_client/utils.py +++ b/tests/application_client/aptos_utils.py @@ -1,24 +1,10 @@ from io import BytesIO -from typing import List, Optional, Literal +from typing import Optional, Literal -UINT64_MAX: int = 18446744073709551615 -UINT32_MAX: int = 4294967295 -UINT16_MAX: int = 65535 - - -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] +UINT64_MAX: int = 2**64-1 +UINT32_MAX: int = 2**32-1 +UINT16_MAX: int = 2**16-1 def write_varint(n: int) -> bytes: @@ -42,7 +28,7 @@ def read_varint(buf: BytesIO, b: bytes = prefix if prefix else buf.read(1) if not b: - raise ValueError(f"Can't read prefix: '{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 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/aptos_client/aptos_cmd.py b/tests/aptos_client/aptos_cmd.py deleted file mode 100644 index f2ddde8..0000000 --- a/tests/aptos_client/aptos_cmd.py +++ /dev/null @@ -1,146 +0,0 @@ -import struct -from typing import Tuple - -from ledgercomm import Transport - -from aptos_client.aptos_cmd_builder import AptosCommandBuilder, InsType -from aptos_client.button import Button -from aptos_client.exception import DeviceException - - -class AptosCommand: - def __init__(self, - transport: Transport, - debug: bool = False) -> None: - self.transport = transport - self.builder = AptosCommandBuilder(debug=debug) - self.debug = debug - - def get_app_and_version(self) -> Tuple[str, str]: - sw, response = self.transport.exchange_raw( - self.builder.get_app_and_version() - ) # type: int, bytes - - if sw != 0x9000: - raise DeviceException(error_code=sw, ins=0x01) - - # response = format_id (1) || - # app_name_len (1) || - # app_name (var) || - # version_len (1) || - # version (var) || - offset: int = 0 - - format_id: int = response[offset] - offset += 1 - app_name_len: int = response[offset] - offset += 1 - app_name: str = response[offset:offset + app_name_len].decode("ascii") - offset += app_name_len - version_len: int = response[offset] - offset += 1 - version: str = response[offset:offset + version_len].decode("ascii") - offset += version_len - - return app_name, version - - def get_version(self) -> Tuple[int, int, int]: - sw, response = self.transport.exchange_raw( - self.builder.get_version() - ) # type: int, bytes - - if sw != 0x9000: - raise DeviceException(error_code=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_app_name(self) -> str: - sw, response = self.transport.exchange_raw( - self.builder.get_app_name() - ) # type: int, bytes - - if sw != 0x9000: - raise DeviceException(error_code=sw, ins=InsType.INS_GET_APP_NAME) - - return response.decode("ascii") - - def get_public_key(self, bip32_path: str, display: bool = False) -> Tuple[bytes, bytes]: - sw, response = self.transport.exchange_raw( - self.builder.get_public_key(bip32_path=bip32_path, - display=display) - ) # type: int, bytes - - if sw != 0x9000: - raise DeviceException(error_code=sw, ins=InsType.INS_GET_PUBLIC_KEY) - - # response = pub_key_len (1) || - # pub_key (var) || - # chain_code_len (1) || - # chain_code (var) - offset: int = 0 - - pub_key_len: int = response[offset] - offset += 1 - pub_key: bytes = response[offset:offset + pub_key_len] - offset += pub_key_len - chain_code_len: int = response[offset] - offset += 1 - chain_code: bytes = response[offset:offset + chain_code_len] - offset += chain_code_len - - assert len(response) == 1 + pub_key_len + 1 + chain_code_len - - return pub_key, chain_code - - def sign_raw(self, bip32_path: str, data: bytes, button: Button, model: str) -> Tuple[int, bytes]: - sw: int - response: bytes = b"" - - for is_last, chunk in self.builder.sign_raw(bip32_path=bip32_path, data=data): - self.transport.send_raw(chunk) - - if is_last: - # Review Transaction - button.right_click() - # Function - button.right_click() - # Coin Type - # Due to screen size, NanoS needs 1 more screens to display the coin type - if model == 'nanos': - button.right_click() - button.right_click() - # Receiver - # Due to screen size, NanoS needs 2 more screens to display the address - if model == 'nanos': - button.right_click() - button.right_click() - button.right_click() - button.right_click() - # Amount - button.right_click() - # Gas Fee - button.right_click() - # Approve - button.both_click() - - sw, response = self.transport.recv() # type: int, bytes - - if sw != 0x9000: - raise DeviceException(error_code=sw, ins=InsType.INS_SIGN_TX) - - # response = der_sig_len (1) || - # der_sig (var) - der_sig_len: int = response[0] - der_sig: bytes = response[1: 1 + der_sig_len] - - assert len(response) == 1 + der_sig_len - - return der_sig diff --git a/tests/aptos_client/aptos_cmd_builder.py b/tests/aptos_client/aptos_cmd_builder.py deleted file mode 100644 index 8f7a39e..0000000 --- a/tests/aptos_client/aptos_cmd_builder.py +++ /dev/null @@ -1,215 +0,0 @@ -import enum -import logging -import struct -from typing import List, Tuple, Union, Iterator, cast - -from aptos_client.utils import bip32_path_from_string - -MAX_APDU_LEN: int = 255 - - -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_VERSION = 0x03 - INS_GET_APP_NAME = 0x04 - INS_GET_PUBLIC_KEY = 0x05 - INS_SIGN_TX = 0x06 - - -class AptosCommandBuilder: - """APDU command builder for the Aptos 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 = 0x5B - - 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()) - - return header + cdata - - def get_app_and_version(self) -> bytes: - """Command builder for GET_APP_AND_VERSION (builtin in BOLOS SDK). - - Returns - ------- - bytes - APDU command for GET_APP_AND_VERSION. - - """ - return self.serialize(cla=0xB0, # specific CLA for BOLOS - ins=0x01, - p1=0x00, - p2=0x00, - cdata=b"") - - def get_version(self) -> bytes: - """Command builder for GET_VERSION. - - Returns - ------- - bytes - APDU command for GET_VERSION. - - """ - return self.serialize(cla=self.CLA, - ins=InsType.INS_GET_VERSION, - p1=0x00, - p2=0x00, - cdata=b"") - - def get_app_name(self) -> bytes: - """Command builder for GET_APP_NAME. - - Returns - ------- - bytes - APDU command for GET_APP_NAME. - - """ - return self.serialize(cla=self.CLA, - ins=InsType.INS_GET_APP_NAME, - p1=0x00, - p2=0x00, - cdata=b"") - - def get_public_key(self, bip32_path: str, 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. - - """ - bip32_paths: List[bytes] = bip32_path_from_string(bip32_path) - - cdata: bytes = b"".join([ - len(bip32_paths).to_bytes(1, byteorder="big"), - *bip32_paths - ]) - - return self.serialize(cla=self.CLA, - ins=InsType.INS_GET_PUBLIC_KEY, - p1=0x01 if display else 0x00, - p2=0x00, - cdata=cdata) - - def sign_raw(self, bip32_path: str, data: bytes) -> Iterator[Tuple[bool, bytes]]: - """Command builder for INS_SIGN_TX. - - Parameters - ---------- - bip32_path : str - String representation of BIP32 path. - data : bytes - Representation of the transaction data to be signed. - - Yields - ------- - bytes - APDU command chunk for INS_SIGN_TX. - - """ - bip32_paths: List[bytes] = bip32_path_from_string(bip32_path) - - cdata: bytes = b"".join([ - len(bip32_paths).to_bytes(1, byteorder="big"), - *bip32_paths - ]) - - yield False, self.serialize(cla=self.CLA, - ins=InsType.INS_SIGN_TX, - p1=0x00, - p2=0x80, - cdata=cdata) - - for i, (is_last, chunk) in enumerate(chunkify(data, MAX_APDU_LEN)): - if is_last: - yield True, self.serialize(cla=self.CLA, - ins=InsType.INS_SIGN_TX, - p1=i + 1, - p2=0x00, - cdata=chunk) - return - else: - yield False, self.serialize(cla=self.CLA, - ins=InsType.INS_SIGN_TX, - p1=i + 1, - p2=0x80, - cdata=chunk) diff --git a/tests/aptos_client/aptos_speculos_cmd.py b/tests/aptos_client/aptos_speculos_cmd.py deleted file mode 100644 index 6adcad0..0000000 --- a/tests/aptos_client/aptos_speculos_cmd.py +++ /dev/null @@ -1,147 +0,0 @@ -import struct -from typing import Tuple - -from speculos.client import SpeculosClient, ApduException - -from aptos_client.aptos_cmd_builder import AptosCommandBuilder, InsType -from aptos_client.exception import DeviceException - - -class AptosSpeculosCommand: - def __init__(self, - client: SpeculosClient, - debug: bool = False) -> None: - self.client = client - self.builder = AptosCommandBuilder(debug=debug) - self.debug = debug - - def get_app_and_version(self) -> Tuple[str, str]: - try: - response = self.client._apdu_exchange( - self.builder.get_app_and_version() - ) # type: int, bytes - except ApduException as error: - raise DeviceException(error_code=error.sw, ins=0x01) - - # response = format_id (1) || - # app_name_len (1) || - # app_name (var) || - # version_len (1) || - # version (var) || - offset: int = 0 - - format_id: int = response[offset] - offset += 1 - app_name_len: int = response[offset] - offset += 1 - app_name: str = response[offset:offset + app_name_len].decode("ascii") - offset += app_name_len - version_len: int = response[offset] - offset += 1 - version: str = response[offset:offset + version_len].decode("ascii") - offset += version_len - - return app_name, version - - def get_version(self) -> Tuple[int, int, int]: - try: - response = self.client._apdu_exchange( - self.builder.get_version() - ) # 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_app_name(self) -> str: - try: - response = self.client._apdu_exchange( - self.builder.get_app_name() - ) # type: int, bytes - except ApduException as error: - raise DeviceException(error_code=error.sw, - ins=InsType.INS_GET_APP_NAME) - - return response.decode("ascii") - - def get_public_key(self, bip32_path: str, display: bool = False) -> Tuple[bytes, bytes]: - try: - response = self.client._apdu_exchange( - self.builder.get_public_key(bip32_path=bip32_path, - display=display) - ) # type: int, 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) || - # chain_code_len (1) || - # chain_code (var) - offset: int = 0 - - pub_key_len: int = response[offset] - offset += 1 - pub_key: bytes = response[offset:offset + pub_key_len] - offset += pub_key_len - chain_code_len: int = response[offset] - offset += 1 - chain_code: bytes = response[offset:offset + chain_code_len] - offset += chain_code_len - - assert len(response) == 1 + pub_key_len + 1 + chain_code_len - - return pub_key, chain_code - - def sign_raw(self, bip32_path: str, data: bytes, model: str) -> Tuple[int, bytes]: - response: bytes = b"" - - for is_last, chunk in self.builder.sign_raw(bip32_path=bip32_path, data=data): - if is_last: - with self.client.apdu_exchange_nowait(cla=chunk[0], ins=chunk[1], - p1=chunk[2], p2=chunk[3], - data=chunk[5:]) as exchange: - # Review Transaction - self.client.press_and_release('right') - # Function - self.client.press_and_release('right') - # Coin Type - # Due to screen size, NanoS needs 1 more screens to display the coin type - if model == 'nanos': - self.client.press_and_release('right') - self.client.press_and_release('right') - # Receiver - # Due to screen size, NanoS needs 2 more screens to display the address - if model == 'nanos': - self.client.press_and_release('right') - self.client.press_and_release('right') - self.client.press_and_release('right') - self.client.press_and_release('right') - # Amount - self.client.press_and_release('right') - # Gas Fee - self.client.press_and_release('right') - # Approve - self.client.press_and_release('both') - response = exchange.receive() - else: - response = self.client._apdu_exchange(chunk) - print(response) - - # response = der_sig_len (1) || - # der_sig (var) - der_sig_len: int = response[0] - der_sig: bytes = response[1: 1 + der_sig_len] - - assert len(response) == 1 + der_sig_len - - return der_sig diff --git a/tests/aptos_client/button.py b/tests/aptos_client/button.py deleted file mode 100644 index 8f89005..0000000 --- a/tests/aptos_client/button.py +++ /dev/null @@ -1,52 +0,0 @@ -from abc import ABCMeta, abstractmethod -import socket - - -class Button(metaclass=ABCMeta): - @abstractmethod - def right_click(self): - ... - - @abstractmethod - def left_click(self): - ... - - @abstractmethod - def both_click(self): - ... - - @abstractmethod - def close(self): - ... - - -class ButtonFake(Button): - def right_click(self): - pass - - def left_click(self): - pass - - def both_click(self): - pass - - def close(self): - pass - - -class ButtonTCP(Button): - def __init__(self, server: str, port: int) -> None: - self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - self.socket.connect((server, port)) - - def right_click(self): - self.socket.sendall(b"Rr") - - def left_click(self): - self.socket.sendall(b"Ll") - - def both_click(self): - self.socket.sendall(b"LRlr") - - def close(self): - self.socket.close() diff --git a/tests/aptos_client/exception/__init__.py b/tests/aptos_client/exception/__init__.py deleted file mode 100644 index e411c17..0000000 --- a/tests/aptos_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, - TxGetPubKeyFail, - BadStateError, - SignatureFailError) - -__all__ = [ - "DeviceException", - "DenyError", - "UnknownDeviceError", - "WrongP1P2Error", - "WrongDataLengthError", - "InsNotSupportedError", - "ClaNotSupportedError", - "WrongResponseLengthError", - "DisplayBip32PathFailError", - "DisplayAddressFailError", - "DisplayAmountFailError", - "WrongTxLengthError", - "TxParsingFailError", - "TxGetPubKeyFail", - "BadStateError", - "SignatureFailError" -] diff --git a/tests/aptos_client/exception/device_exception.py b/tests/aptos_client/exception/device_exception.py deleted file mode 100644 index e0f8459..0000000 --- a/tests/aptos_client/exception/device_exception.py +++ /dev/null @@ -1,39 +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: TxGetPubKeyFail, - 0xB007: BadStateError, - 0xB008: SignatureFailError, - 0xB009: DisplayGasFeeFailError, - } - - 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/tests/aptos_client/exception/errors.py b/tests/aptos_client/exception/errors.py deleted file mode 100644 index 3abcdfb..0000000 --- a/tests/aptos_client/exception/errors.py +++ /dev/null @@ -1,62 +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 TxGetPubKeyFail(Exception): - pass - - -class BadStateError(Exception): - pass - - -class SignatureFailError(Exception): - pass - - -class DisplayGasFeeFailError(Exception): - pass diff --git a/tests/conftest.py b/tests/conftest.py new file mode 100644 index 0000000..909ec8b --- /dev/null +++ b/tests/conftest.py @@ -0,0 +1,15 @@ +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 + +######################### +### CONFIGURATION END ### +######################### + +# Pull all features from the base ragger conftest using the overridden configuration +pytest_plugins = ("ragger.conftest.base_conftest", ) diff --git a/tests/ledgercomm/README.md b/tests/ledgercomm/README.md deleted file mode 100644 index 3ab5201..0000000 --- a/tests/ledgercomm/README.md +++ /dev/null @@ -1,61 +0,0 @@ -# LedgerComm functional tests - -> :point_right: Every path on this document assumes you are at the root of the repository. - -These tests are implemented in Python and can be executed either using the -[Speculos](https://github.com/LedgerHQ/speculos) emulator or a Ledger Nano S/X. - -Python dependencies are listed in [requirements.txt](requirements.txt), install -them using [pip](https://pypi.org/project/pip/) - -``` -pip install -r tests/ledgercomm/requirements.txt -``` - -## Launch with Speculos - -You will need Speculos installed first: - -``` -pip install --extra-index-url https://test.pypi.org/simple/ speculos -``` - -The extra index allows to fetch the latest version of Speculos. - -Then, start the Aptos application on Speculos: - -``` -speculos bin/app.elf --button-port 42000 -``` - -then in the `tests` folder run - -``` -pytest --headless tests/ledgercomm/ -``` - -The `--headless` option means the tests will trigger the buttons themselves -(button actions are needed to approve the signing), by connecting on the `42000` -port opened by Speculos (`--button-port 42000`). - -By removing this option, the tests will be stuck, waiting for the someone to -approve the step. The user could validate this step manually, and the test will -continue thereafter. - -## Launch with your Nano S/X - -To run the tests on your Ledger Nano S/X, you also need to install an optional -dependency: - -``` -pip install ledgercomm[hid] -``` - -Be sure to have the Aptos application installed (see -[this page](https://developers.ledger.com/docs/nano-app/load/) for installing an -application on a Nano S) and opened on the device, and the device connected -through USB, without any other software interacting with it. Then run: - -``` -pytest --hid tests/ledgercomm/ -``` diff --git a/tests/ledgercomm/aptos_client b/tests/ledgercomm/aptos_client deleted file mode 120000 index 20b8dd6..0000000 --- a/tests/ledgercomm/aptos_client +++ /dev/null @@ -1 +0,0 @@ -../aptos_client \ No newline at end of file diff --git a/tests/ledgercomm/conftest.py b/tests/ledgercomm/conftest.py deleted file mode 100644 index 851920f..0000000 --- a/tests/ledgercomm/conftest.py +++ /dev/null @@ -1,75 +0,0 @@ -from pathlib import Path - -import pytest - -from ledgercomm import Transport - -from aptos_client.aptos_cmd import AptosCommand -from aptos_client.button import ButtonTCP, ButtonFake - - -def pytest_addoption(parser): - parser.addoption("--hid", - action="store_true") - parser.addoption("--headless", - action="store_true") - parser.addoption("--model", - action="store", - default="nanos") - - -@pytest.fixture(scope="module") -def sw_h_path(): - # path with tests - conftest_folder_path: Path = Path(__file__).parent - # sw.h should be in ../../src/sw.h - sw_h_path = conftest_folder_path.parent.parent / "src" / "sw.h" - - if not sw_h_path.is_file(): - raise FileNotFoundError(f"Can't find sw.h: '{sw_h_path}'") - - return sw_h_path - - -@pytest.fixture(scope="session") -def hid(pytestconfig): - return pytestconfig.getoption("hid") - - -@pytest.fixture(scope="session") -def headless(pytestconfig): - return pytestconfig.getoption("headless") - - -@pytest.fixture(scope="session") -def model(pytestconfig): - return pytestconfig.getoption("model") - - -@pytest.fixture(scope="module") -def button(headless): - if headless: - button_client = ButtonTCP(server="127.0.0.1", port=42000) - else: - button_client = ButtonFake() - - yield button_client - - button_client.close() - - -@pytest.fixture(scope="session") -def cmd(hid): - transport = (Transport(interface="hid", debug=True) - if hid else Transport(interface="tcp", - server="127.0.0.1", - port=9999, - debug=True)) - command = AptosCommand( - transport=transport, - debug=True - ) - - yield command - - command.transport.close() diff --git a/tests/ledgercomm/requirements.txt b/tests/ledgercomm/requirements.txt deleted file mode 100644 index 4e3c395..0000000 --- a/tests/ledgercomm/requirements.txt +++ /dev/null @@ -1,5 +0,0 @@ -pytest==6.2.5 -ledgercomm==1.1.2 -ecdsa==0.16.1 -pysha3==1.0.2 -pynacl==1.3.0 diff --git a/tests/ledgercomm/test_appname_cmd.py b/tests/ledgercomm/test_appname_cmd.py deleted file mode 100644 index aa4c84d..0000000 --- a/tests/ledgercomm/test_appname_cmd.py +++ /dev/null @@ -1,2 +0,0 @@ -def test_app_name(cmd): - assert cmd.get_app_name() == "Aptos" diff --git a/tests/ledgercomm/test_error_cmd.py b/tests/ledgercomm/test_error_cmd.py deleted file mode 100644 index 06b4fe9..0000000 --- a/tests/ledgercomm/test_error_cmd.py +++ /dev/null @@ -1,44 +0,0 @@ -import pytest - -from aptos_client.exception import * - - -@pytest.mark.xfail(raises=ClaNotSupportedError) -def test_bad_cla(cmd): - sw, _ = cmd.transport.exchange(cla=0xa0, # 0xa0 instead of 0x5b - ins=0x03, - p1=0x00, - p2=0x00, - cdata=b"") - - raise DeviceException(error_code=sw) - - -@pytest.mark.xfail(raises=InsNotSupportedError) -def test_bad_ins(cmd): - sw, _ = cmd.transport.exchange(cla=0x5b, - ins=0xff, # bad INS - p1=0x00, - p2=0x00, - cdata=b"") - - raise DeviceException(error_code=sw) - - -@pytest.mark.xfail(raises=WrongP1P2Error) -def test_wrong_p1p2(cmd): - sw, _ = cmd.transport.exchange(cla=0x5b, - ins=0x03, - p1=0x01, # 0x01 instead of 0x00 - p2=0x00, - cdata=b"") - - raise DeviceException(error_code=sw) - - -@pytest.mark.xfail(raises=WrongDataLengthError) -def test_wrong_data_length(cmd): - # APDUs must be at least 5 bytes: CLA, INS, P1, P2, Lc. - sw, _ = cmd.transport.exchange_raw("5B00") - - raise DeviceException(error_code=sw) diff --git a/tests/ledgercomm/test_name_version.py b/tests/ledgercomm/test_name_version.py deleted file mode 100644 index a9ae023..0000000 --- a/tests/ledgercomm/test_name_version.py +++ /dev/null @@ -1,7 +0,0 @@ -def test_get_app_and_version(cmd, hid): - if hid: - # for now it doesn't work with Speculos - app_name, version = cmd.get_app_and_version() - - assert app_name == "Aptos" - assert version == "0.6.3" diff --git a/tests/ledgercomm/test_pubkey_cmd.py b/tests/ledgercomm/test_pubkey_cmd.py deleted file mode 100644 index 4d1e81b..0000000 --- a/tests/ledgercomm/test_pubkey_cmd.py +++ /dev/null @@ -1,8 +0,0 @@ -def test_get_public_key(cmd): - pub_key, chain_code = cmd.get_public_key( - bip32_path="m/44'/637'/1'/0'/0'", - display=False - ) # type: bytes, bytes - - assert len(pub_key) == 33 - assert len(chain_code) == 32 diff --git a/tests/ledgercomm/test_sign_raw_cmd.py b/tests/ledgercomm/test_sign_raw_cmd.py deleted file mode 100644 index 95e58a1..0000000 --- a/tests/ledgercomm/test_sign_raw_cmd.py +++ /dev/null @@ -1,26 +0,0 @@ -from nacl.signing import VerifyKey -from nacl.exceptions import BadSignatureError - -from aptos_client.exception import * - - -def test_sign_raw_tx(cmd, button, model): - message = bytes.fromhex("b5e97db07fa0bd0e5598aa3643a9bc6f6693bddc1a9fec9e674a461eaa00b193783135e8b00430253a22ba041d860c373d7a1501ccf7ac2d1ad37a8ed2775aee000000000000000002000000000000000000000000000000000000000000000000000000000000000104636f696e087472616e73666572010700000000000000000000000000000000000000000000000000000000000000010a6170746f735f636f696e094170746f73436f696e000220094c6fc0d3b382a599c37e1aaa7618eff2c96a3586876082c4594c50c50d7dde082a00000000000000204e0000000000006400000000000000565c51630000000022") - bip32_path: str = "m/44'/637'/1'/0'/0'" - - pub_key, chain_code = cmd.get_public_key( - bip32_path=bip32_path, - display=False - ) # type: bytes, bytes - - pk = VerifyKey(pub_key[1:]) - - der_sig = cmd.sign_raw(bip32_path=bip32_path, - data=message, - button=button, - model=model) - - try: - pk.verify(signature=der_sig, smessage=message) - except BadSignatureError as exc: - assert False, exc diff --git a/tests/ledgercomm/test_status_word.py b/tests/ledgercomm/test_status_word.py deleted file mode 100644 index 2b929ba..0000000 --- a/tests/ledgercomm/test_status_word.py +++ /dev/null @@ -1,39 +0,0 @@ -from pathlib import Path -from typing import List, Dict, Any, Tuple -import re - -from aptos_client.exception import DeviceException - - -SW_RE = re.compile(r"""(?x) - \# # character '#' - define # string 'define' - \s+ # spaces - (?PSW(?:_[A-Z0-9]+)*) # identifier (e.g. 'SW_OK') - \s+ # spaces - 0x(?P[a-fA-F0-9]{4}) # 4 bytes status word -""") - - -def parse_sw(path: Path) -> List[Tuple[str, int]]: - if not path.is_file(): - raise FileNotFoundError(f"Can't find file: '{path}'") - - sw_h: str = path.read_text() - - return [(identifier, int(sw, base=16)) - for identifier, sw in SW_RE.findall(sw_h) if sw != "9000"] - - -def test_status_word(sw_h_path): - expected_status_words: List[Tuple[str, int]] = parse_sw(sw_h_path) - status_words: Dict[int, Any] = DeviceException.exc - - assert len(expected_status_words) == len(status_words), ( - f"{expected_status_words} doesn't match {status_words}") - - # just keep status words - expected_status_words = [sw for (identifier, sw) in expected_status_words] - - for sw in status_words.keys(): - assert sw in expected_status_words, f"{status_words[sw]}({hex(sw)}) not found in sw.h!" diff --git a/tests/ledgercomm/test_version_cmd.py b/tests/ledgercomm/test_version_cmd.py deleted file mode 100644 index 11eeeb1..0000000 --- a/tests/ledgercomm/test_version_cmd.py +++ /dev/null @@ -1,2 +0,0 @@ -def test_version(cmd): - assert cmd.get_version() == (0, 6, 3) diff --git a/tests/requirements.txt b/tests/requirements.txt new file mode 100644 index 0000000..e529676 --- /dev/null +++ b/tests/requirements.txt @@ -0,0 +1,4 @@ +pytest +ragger[speculos,ledgerwallet]>=1.11.4 +pysha3>=1.0.0,<2.0.0 +pynacl==1.3.0 diff --git a/tests/ledgercomm/setup.cfg b/tests/setup.cfg similarity index 91% rename from tests/ledgercomm/setup.cfg rename to tests/setup.cfg index c79fd88..7d0d7e3 100644 --- a/tests/ledgercomm/setup.cfg +++ b/tests/setup.cfg @@ -8,10 +8,11 @@ disable = C0114, # missing-module-docstring C0103, # invalid-name R0801, # duplicate-code R0913 # too-many-arguments +max-line-length=100 extension-pkg-whitelist=hid [pycodestyle] -max-line-length = 90 +max-line-length = 100 [mypy-hid.*] ignore_missing_imports = True diff --git a/tests/snapshots/nanos/test_app_mainmenu/00000.png b/tests/snapshots/nanos/test_app_mainmenu/00000.png new file mode 100644 index 0000000000000000000000000000000000000000..02d922befda7ad5494398ded74de6ab739697b06 GIT binary patch literal 408 zcmV;J0cZY+P)tP{{Ii&hxNhEIZ=euB@oYbT~S*K@+uU9<2a7vtmHgakKmt)-tWf1Xpr8k z2T&vT^|oJ@_?%nP+p5JO0W+Zbn)L-eycYldd3+b_womY&!WamUpjlo^(xgg)h64cI z$DKbE@eyJs>50KMbammfBqPN6Lr+Bu+=K(zW6f^D^ksM+w?|?B%^1|tnHtyot!oEk zU^oB)nH_7|RqwY>id<|5AlxRnT_%=vLiLAs-CF!G6^C;(09o(j+kkB*s1Wo%vL!e< zch7)hC{c^>lVV}V@AI5e2`mU^4k_u3Sp5+)43v3=SY98|gPc}GtBk_yuWlm3!dPHh z3{jM0+(p;zWfB{oc+*sH$8@+CG;uXi)~30wUO+cALhNP2PoWm6V)g$41ylYNXx&z% z`isc`N-r}H4|4WZn+>Ls8Wmv@bKJw0s&ql17QTXhUT=s@I^p<{MG2~3KfJAa4*;*KxxYW;n`ORBfu@f%om{} z6gyEROCLa?vvQ#-(N2W65$o#AxEWF$Q>XPOlRiL_SqRCk>M$K?-e?5qgvWTI0eGMzz&*SsCeCeLUMR!S`jd8I>WalhPmEcRIo%?%tOtWCx@aCUMQGF zQ&-y}+*>pB5c>)npawh}bPAe-n}U)=MBaiXla}m^Esp>I002ovPDHLkV1haa BnL_{o literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanos/test_app_mainmenu/00002.png b/tests/snapshots/nanos/test_app_mainmenu/00002.png new file mode 100644 index 0000000000000000000000000000000000000000..3476b972aad8b16723e63d03d83db7de63b698cd GIT binary patch literal 327 zcmV-N0l5B&P)q%Lk}$JN=*+Ya3V52_$ri_Tw`0y zW~o~dSBJ_)jqx$FVQ-p{pr~clG9JlqkTUKDen}9lbG=+9r&_RRCT`@ta9}o@5 zoGR6f6v&VngBn2&rF;h11n5AoQ(n^?5wLi<0+<0A9oYrVM?&+_T6|lSEB|J;2qA=^ ZvjZ`uW$88COrih)002ovPDHLkV1i+HiM9X$ literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanos/test_app_mainmenu/00003.png b/tests/snapshots/nanos/test_app_mainmenu/00003.png new file mode 100644 index 0000000000000000000000000000000000000000..e2279803e79ec6d6443deff45a1f9326b562e303 GIT binary patch literal 274 zcmV+t0qy>YP)D zPq`+h_bpEEKgJ+x(tj8nSi&r1$%l|}@K=b}8w!8IP1np9%K2s%)5~a1UA{VmQ8=+t z-ij#s)CI>TUk!C8`c(mGx8WRa z!xd`|I)kHai-|mfH_EU=@WQ<8?vt;iutXgsJ7fsT#RT=*@-kDbFv|(3aIfXRyfj@+?msfv|9!ih8`J$fW)Vn zz~CO>;T|BN_mLd%e%vjPJ%D;eMaiRY#At6&Lsw*_J&nWB{N+Jii(`R~LM#+7vH7^1 zF{YKPgOW#*A8m0f)G#fTs8dpVu7-&qzkS-3oiTU-^*<9k78P5Y>WHD!W4f~aS-%if z=ZR@VlnSwV`CZM!$c^HXr@$^f3+e?K9T@e1AEk+s4NtSE;t^;oLOod9f%9u_+g!V> zg-|*Hr>)vEHnNj9aru-OX(LJU#UxzW#2tv5bk|2oN7xMoGovT4Cs$JRS3(FO58w+7 Wi7X{&VtL~L0000c)VqKK#{wdKnWi$6d?v9bX;j^j9QWi!)!9>|JaO=b{v36CU) z0cr0w@kQVOjFX95nBEb_$oN_*Ccq0bTBPKfjar;K&g1{NT5vD_onP!lIg;KfnC^hl zix+41G|S&3?|-Zf7zXd(dw3rn8-PW;55_4-c#x7Wj=5pvDNW`dEbvAlv3ns?pxO9o zPhC*7wD)0!0C2ii_x?fM)KmrR6WVTjCP*1@|wl~-{6W52;vK)0%=LIq3q5GQ4xzqJOvqJ_rIVAFyd5q9LJf+4};Sn UVzi>sz5oCK07*qoM6N<$f|h^9Q~&?~ literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanos/test_blind_sign_tx_long_tx/part0/00002.png b/tests/snapshots/nanos/test_blind_sign_tx_long_tx/part0/00002.png new file mode 100644 index 0000000000000000000000000000000000000000..2d1b9409c6522828731aab12cfaa18aa574835da GIT binary patch literal 398 zcmV;90df9`P)RF|2j{?)lOikugDmzd53ViMBoUAZ0002!$+3qIz4I&b>fHdMW2f!& z1h0b(&;d%0{kNTm{8DfqsBo4AO-$R(ACw}K&^rTM{ULg66?*q>z?5OT5X#D3 zgT-sK1>rGwQRK>bDPms_GiviM=;K$~jo8>iu7ZE4roejmD{9aEJRlCfEXq@VIeX=2UOS4^go=mtjW9`lm8lGU*`Ko sh^YTB$;Y$hZ&{Dntm1wV008L97k%0p$W|+otpET307*qoM6N<$f)F>k>Hq)$ literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanos/test_blind_sign_tx_long_tx/part1/00000.png b/tests/snapshots/nanos/test_blind_sign_tx_long_tx/part1/00000.png new file mode 100644 index 0000000000000000000000000000000000000000..58b87c3562358906c929660d8c3d1f2eff1a3068 GIT binary patch literal 387 zcmV-}0et?6P)Nkl-Y<|~U4B0EpfM}y81^(-jPwy8X)}fl7WirS1y~Ke7HoKpUn6|fpN5U--`4=0O4Yg}g%G|k0&EjWU zai{#YAFFaBws&$fZYFE*^MH+0T+odbKQIuF5KenBy$xj>BGpf-tG8iUOT^rRo{&%) zTy~;Yw!=X(PA6-3q6fQ6ydKC<;%v$YalLwiVm!eCb_%|vd*fb$f=y5K#WP4rQ=Yqh hTVfRe0002MFJI@40xkU6L%09{002ovPDHLkV1jbMFj@AiM+Y))PP#J80e9!xpY`e9#x*I=cgBXY3}t!9h*W zf^@H@A(hubG{u^%T-@6SMYI2^HwXUQHM1gNs;rScm_4HLoD@#pGUz&6WC|;IBTQ^SsgnkV?1d3ED3{@ z8&VoYyJE%^Y+EdUbL1wRzo*CD1iUK^u#1~(==1QKuuc2u7nh(zc9F_$eLgY)`_&)W z6^6myQ~Sn{uX}4G3VTODOCp!8x$KKgUcS|iqqx(G`qga@X{wfr58}Uln;YfEmWx|2 z+C_S6|72R!BLG}*G-LGRhITMzH7j7|a$C0bHCCY@2!bF8f)nxrhi-B35lM+600000 LNkvXXu0mjf0QJ|w literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanos/test_blind_sign_tx_long_tx/part1/00002.png b/tests/snapshots/nanos/test_blind_sign_tx_long_tx/part1/00002.png new file mode 100644 index 0000000000000000000000000000000000000000..20702e10daf420c2f6c2ac1f399d69b6780b1689 GIT binary patch literal 479 zcmV<50U-W~P)AWr}`U4>!u=I zvQ1DO0^D+vA7%eM2nXyyrFr-W{ofZGidPV?4StUFVJ!7|6l*?y9>JI`yAf>Iq?8Q-Xx%2+|P(EiuJf)*>T%&|l7WnuT1Z)j!ed4nh(>ZR~WW zxMT?;d}&2BhQ5S{zgD(+ug1aq62{+(;A8dX<5Ncf&7h~CxAaXnn>^UUVF!rCn1Qur zoMzC9AR&>6{sHpc%KQ|e6_F0Ej*6NGTM_1f)59p@GQJTGLNL6#!`G?S&}KE@0AwY@ z5@C`V?uYbWpXQ!^X8jH0j-t{+hFwF>tzM_^v>>rg~5{X12kw_#SiVuWV VV9cyZ!6yI!002ovPDHLkV1nsF;nn~E literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanos/test_blind_sign_tx_long_tx/part1/00003.png b/tests/snapshots/nanos/test_blind_sign_tx_long_tx/part1/00003.png new file mode 100644 index 0000000000000000000000000000000000000000..9efc0aee571817cf53426edbebead867c6d96c31 GIT binary patch literal 464 zcmV;>0WbcEP)t_flB}tMbc`7f**x%n{Q=e&JheI{r zrj3QF22^>opQV2tYyu*Ll5yyr_8Xf`<;N+m4qZobF_z!7j~&W%~r6Q2&1PQVD%PbokW`9JH6&WTcC;w zY*^(7$iAcb>`)nc6Q1}=5~NnKPloMHSlvykO*uPo=5l%xu92ZCv0&jlEjZXbqV3+_)#jzD8 zdp4|x_!KgJXavb0P$H$)JI16|?FH}+l4T@Gk|arz1mh3Awm#%{BncG&0000@P)ja&g$@wfu%@-kP|07g1sS)<1?8-HG>>ckqb4x-px8YpueKrZLB zHm0>YwUi#i$OI$BU9-Z^aMf+U3QoUT7t0ic+}QeI4F@1O_qP607^ZgXPsV+4C7y+@ zPP|nQq8l7#cw)lF0(2cJ^Mad>bC0iG6WiO~XKk!R?jV9%Rq9#nFW*ATd znv2!8e~++CH=8$W)BkJv6~H9N_{cOZrUi#dz6@q_G{AJPbz>xxPuC~ufZ9&2<2a7v cIL`m$4Q}yZiT=X)4FCWD07*qoM6N<$g7!e*EC2ui literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanos/test_blind_sign_tx_long_tx/part1/00005.png b/tests/snapshots/nanos/test_blind_sign_tx_long_tx/part1/00005.png new file mode 100644 index 0000000000000000000000000000000000000000..2001bf6bd98036636f237140b1d675c118a3d1c4 GIT binary patch literal 416 zcmV;R0bl-!P)VS6w!6cN#hV#~?0G^<`wpgJ0Y<2a7$yIZU=&D)oi7 zLABT*zx&Ui%RmmWAeD4TLFVqjxmC(VBk_02_8yg@I)Ul-YMEE!&!>ts9eI0p` z^dUuXl!U=53l}7rHB#5}j&C(sTK@++YPP)q*U8 zNkLfYBukz`HQwM|+3qYc%i!tn10IyBbyzA(Of`|47?)S>U^{;v_nSUadtZ5{ zsRT6G#W1(M2|tCkC*bcJg3P6*i10oB#(&2W{PZcgx)zk(9Bt}Owbob=S5E+U&asby z?Pv_{I8m61@~gs8ik_zWEYyMaE5-o;00000?HqB2=vf082X_Df002ovPDHLkV1oWm BoNfRB literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanos/test_blind_sign_tx_long_tx/part1/00007.png b/tests/snapshots/nanos/test_blind_sign_tx_long_tx/part1/00007.png new file mode 100644 index 0000000000000000000000000000000000000000..66c411c2ebc833c701039f213ad4ff68cc881146 GIT binary patch literal 341 zcmV-b0jmCqP)_wxG+Yry2qARt#sf<#$}=)VJ~ zBlvESR-Jq3=$jydfC?r!$iuAw9oGJ!U-M%YMJ+y&Ch%TCM^JUq5BGkf8O_{y`#mQ} nq4{V^xv44i3V1v$0C_ea3_go|-rj`700000NkvXXu0mjfd&QW1 literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanos/test_blind_sign_tx_long_tx/part1/00008.png b/tests/snapshots/nanos/test_blind_sign_tx_long_tx/part1/00008.png new file mode 100644 index 0000000000000000000000000000000000000000..02d922befda7ad5494398ded74de6ab739697b06 GIT binary patch literal 408 zcmV;J0cZY+P)tP{{Ii&hxNhEIZ=euB@oYbT~S*K@+uU9<2a7vtmHgakKmt)-tWf1Xpr8k z2T&vT^|oJ@_?%nP+p5JO0W+Zbn)L-eycYldd3+b_womY&!WamUpjlo^(xgg)h64cI z$DKbE@eyJs>50KMbammfBqPN6Lr+Bu+=K(zW6f^D^ksM+w?|?B%^1|tnHtyot!oEk zU^oB)nH_7|RqwY>id<|5AlxRnT_%=vLiLAs-CF!G6^C;(09o(j+kkB*s1Wo%vL!e< zch7)hC{c^>lVV}V@AI5e2`mU^4k_u3Sp5+)43v3=SY98|gPc}GtBk_yuWlm3!dPHh z3{jM0+(p;zWfB{oc+*sH$8@+CG;uXi)~30wUO+cALhNP2PoWm6V)g$41ylYNXx&z% z`isc`N-r}H4|4WZn+>Ls8Wmv@$-~WL<*h4xt4L>Si!`l6(heAsxZXgg0fe=E-zcP6{P|Lb}zE88CAFTie zKufQ|3}Hz_Tv^4(e{qo@#os`*_LplFK>eKNkk- z&QoI#c3yJ-x76)?_0Vw&Hd>+I(? zq$+x>0CB=>N)=mWBW5y+0}_l_qg~-*|Hs{g2_b}F@&Y&g#@?_l)gu4^002ovPDHLk FV1l=KnBo8c literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanos/test_get_public_key_confirm_accepted/00001.png b/tests/snapshots/nanos/test_get_public_key_confirm_accepted/00001.png new file mode 100644 index 0000000000000000000000000000000000000000..5ddc2dd5983df091496c718ac4d4ff6bc5b69981 GIT binary patch literal 349 zcmV-j0iyniP)bM$xBYmp9zYc&EZnX8cWd7}AQW23FKut(+_sMf4G|D8=j~;cqhSJ)X@sO2wY*jj z;OS_HfF#_0pnliYAJkh@kQeGtfE5|)Pa`2U)SnFIU?s>xE19h5!wc}tuOnzP3W3QL~F=3#|S=zRC02V+jcTtz;%_c}Ml{YWg5e(HS03^)nP z)z9?cAk{b0{4YMd>`@CMQraUCD8BA5?`Nn_CwfnS&%7iBbM}@8>0kb)e+mjk2{q#E vU?7s$(4-sp(phZP{w$#n000000BGX_x4QNWy!xOn00000NkvXXu0mjfu8EbD literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanos/test_get_public_key_confirm_accepted/00002.png b/tests/snapshots/nanos/test_get_public_key_confirm_accepted/00002.png new file mode 100644 index 0000000000000000000000000000000000000000..3d84e93b34c43d7f330202a86805fafaa632644b GIT binary patch literal 491 zcmVm5A}hb2wnT2p^l4)(#g@KI8H=@kd;oA7K^wX3EgXgX zb?HGC?u^I)kZGW6*mTs)QO^eUm#`8KqnB5wsjoT!0Ko8!;w~lOgB`+A0nikFrT5Q- zadmosF&TrMWER@Ve<#0~$K>R$9KxQu$XW0yWVO{Tb#2O7)6!8ALUqtIYEwEYLdT(2 zDvYpgBneSsEc3c5#`X%cQY`AIBUw5cGK!}b^UrDJxMzO5zqXEFD`o z-vLr7Z5iwgjrOq3%8dG|r=(-o%8+*en{aCC9M_##jF1tFor)P!GpSf>F+l3b4ho09 h|C1z1k|aqs@&|3UR`1ScHh=&C002ovPDHLkV1l4J+=c)E literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanos/test_get_public_key_confirm_accepted/00003.png b/tests/snapshots/nanos/test_get_public_key_confirm_accepted/00003.png new file mode 100644 index 0000000000000000000000000000000000000000..be3ff7dabeb9aa0b2c078514c8afa22ae46e9eee GIT binary patch literal 496 zcmVHmLlAKHg>Jd{mb&`ircc}QGPK#2m7BuSDafjsVQRYv=f(I5BMQymVM z%$>{zP6aeIRysf|5o;GZ;5Ssdiqr0;u;X6Ql?L(Qf}E!nB7d=u{gyxfB1V`Gs| zjBQg~wQy%dI)JEAOe2P)YK+1S{6Ash58TFS<<(*8qYeN7FsxDZnK*E;i*P9iSOP!N z`qxA-by|Nh>4TkQ6xzwVkq@ETxT=uD@=M11A&vHeb|+^5TJ&{B3mwNz*tpr- zlW^jZQw>3!65s4lCXO|(kz2w*DuRd6)>v_-CA60ISoY{R(?Bvsb}tQ*)}6OaYYy<| z2#vMrRC16$$>L8{)Yo}LY|N_G9Iz=zxD7*J(G%PzjTY+-K|I2CglT6RK9(5Yr}WY$ mX{2>${R@*MNs=TxDVB?;`BR8w*B;Fvtir*`@6n`p8)ZDgOIq%6I7mps`F}^ zgSd@T4e;4e05RLjb|1gwZ2OlbXx=);r=Y;?L!5<~2V)E!J|!o0R&2%x0GBc7ARjv# zXCarT^dJ*Y#>fDWWuR-sbX3hzE008J-(de3Z;A9u!QUS0O z{-yV?iQww={$w%+E6FUhl5Zz(!fjF!zXwV}U}ZiZCcXz4g`@Ele^9i+p0uP~tYMxZ z(X{y`UPx0{yvzG4&bFe_=V|NJXd}s(YFo4_(X@f&0g0ww5Raipaw%e8uR63j-h_E> zX{N1X+}URq^OC5_$Y8dl!#R!sbT+xTDneEB*`@LpNV9oj`wtw|3TXrDHZ1x>1_|%9 zR29Z{Jq>NXlCmiPQC^$xeTeRQ8rpo3s0DzhyyHwoWpg6ImZw(ribA_?_M2LL)~QNs h11Cw6BuSDaA6_ldZi)V?{_X$(002ovPDHLkV1heO<*NVy literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanos/test_get_public_key_confirm_accepted/00005.png b/tests/snapshots/nanos/test_get_public_key_confirm_accepted/00005.png new file mode 100644 index 0000000000000000000000000000000000000000..cbe4902f79849b821535151be8ea35e80d02ad41 GIT binary patch literal 444 zcmV;t0YmpLbUnkT#{2z;KZq9Dw(H@u|PGewWwNpY@$gXfYO1aCA_b# z5~aFTTOxgBJvPy#4M5d_B8{4k%p7$z@V|t?c&Ls1(kzCDy#4~hO39EFZUY& zc>G<2yC$bHk{MjXhgN~Ch^urCU$Y=fcx?O;r(5fc_)Rmy@E;V< zr662|3(YEA?r{!$`nckUOcFg2&FOjRiS&a8piLLIS6`HE=mcQnC~@0R;J+1dYkn*C m_Ku?)Q(#62A%qY@+`Iu8OI{>6ow?Zn0000E5v>P literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanos/test_get_public_key_confirm_accepted/00006.png b/tests/snapshots/nanos/test_get_public_key_confirm_accepted/00006.png new file mode 100644 index 0000000000000000000000000000000000000000..66c411c2ebc833c701039f213ad4ff68cc881146 GIT binary patch literal 341 zcmV-b0jmCqP)_wxG+Yry2qARt#sf<#$}=)VJ~ zBlvESR-Jq3=$jydfC?r!$iuAw9oGJ!U-M%YMJ+y&Ch%TCM^JUq5BGkf8O_{y`#mQ} nq4{V^xv44i3V1v$0C_ea3_go|-rj`700000NkvXXu0mjfd&QW1 literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanos/test_get_public_key_confirm_accepted/00007.png b/tests/snapshots/nanos/test_get_public_key_confirm_accepted/00007.png new file mode 100644 index 0000000000000000000000000000000000000000..02d922befda7ad5494398ded74de6ab739697b06 GIT binary patch literal 408 zcmV;J0cZY+P)tP{{Ii&hxNhEIZ=euB@oYbT~S*K@+uU9<2a7vtmHgakKmt)-tWf1Xpr8k z2T&vT^|oJ@_?%nP+p5JO0W+Zbn)L-eycYldd3+b_womY&!WamUpjlo^(xgg)h64cI z$DKbE@eyJs>50KMbammfBqPN6Lr+Bu+=K(zW6f^D^ksM+w?|?B%^1|tnHtyot!oEk zU^oB)nH_7|RqwY>id<|5AlxRnT_%=vLiLAs-CF!G6^C;(09o(j+kkB*s1Wo%vL!e< zch7)hC{c^>lVV}V@AI5e2`mU^4k_u3Sp5+)43v3=SY98|gPc}GtBk_yuWlm3!dPHh z3{jM0+(p;zWfB{oc+*sH$8@+CG;uXi)~30wUO+cALhNP2PoWm6V)g$41ylYNXx&z% z`isc`N-r}H4|4WZn+>Ls8Wmv@$-~WL<*h4xt4L>Si!`l6(heAsxZXgg0fe=E-zcP6{P|Lb}zE88CAFTie zKufQ|3}Hz_Tv^4(e{qo@#os`*_LplFK>eKNkk- z&QoI#c3yJ-x76)?_0Vw&Hd>+I(? zq$+x>0CB=>N)=mWBW5y+0}_l_qg~-*|Hs{g2_b}F@&Y&g#@?_l)gu4^002ovPDHLk FV1l=KnBo8c literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanos/test_get_public_key_confirm_refused/00001.png b/tests/snapshots/nanos/test_get_public_key_confirm_refused/00001.png new file mode 100644 index 0000000000000000000000000000000000000000..5ddc2dd5983df091496c718ac4d4ff6bc5b69981 GIT binary patch literal 349 zcmV-j0iyniP)bM$xBYmp9zYc&EZnX8cWd7}AQW23FKut(+_sMf4G|D8=j~;cqhSJ)X@sO2wY*jj z;OS_HfF#_0pnliYAJkh@kQeGtfE5|)Pa`2U)SnFIU?s>xE19h5!wc}tuOnzP3W3QL~F=3#|S=zRC02V+jcTtz;%_c}Ml{YWg5e(HS03^)nP z)z9?cAk{b0{4YMd>`@CMQraUCD8BA5?`Nn_CwfnS&%7iBbM}@8>0kb)e+mjk2{q#E vU?7s$(4-sp(phZP{w$#n000000BGX_x4QNWy!xOn00000NkvXXu0mjfu8EbD literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanos/test_get_public_key_confirm_refused/00002.png b/tests/snapshots/nanos/test_get_public_key_confirm_refused/00002.png new file mode 100644 index 0000000000000000000000000000000000000000..3d84e93b34c43d7f330202a86805fafaa632644b GIT binary patch literal 491 zcmVm5A}hb2wnT2p^l4)(#g@KI8H=@kd;oA7K^wX3EgXgX zb?HGC?u^I)kZGW6*mTs)QO^eUm#`8KqnB5wsjoT!0Ko8!;w~lOgB`+A0nikFrT5Q- zadmosF&TrMWER@Ve<#0~$K>R$9KxQu$XW0yWVO{Tb#2O7)6!8ALUqtIYEwEYLdT(2 zDvYpgBneSsEc3c5#`X%cQY`AIBUw5cGK!}b^UrDJxMzO5zqXEFD`o z-vLr7Z5iwgjrOq3%8dG|r=(-o%8+*en{aCC9M_##jF1tFor)P!GpSf>F+l3b4ho09 h|C1z1k|aqs@&|3UR`1ScHh=&C002ovPDHLkV1l4J+=c)E literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanos/test_get_public_key_confirm_refused/00003.png b/tests/snapshots/nanos/test_get_public_key_confirm_refused/00003.png new file mode 100644 index 0000000000000000000000000000000000000000..be3ff7dabeb9aa0b2c078514c8afa22ae46e9eee GIT binary patch literal 496 zcmVHmLlAKHg>Jd{mb&`ircc}QGPK#2m7BuSDafjsVQRYv=f(I5BMQymVM z%$>{zP6aeIRysf|5o;GZ;5Ssdiqr0;u;X6Ql?L(Qf}E!nB7d=u{gyxfB1V`Gs| zjBQg~wQy%dI)JEAOe2P)YK+1S{6Ash58TFS<<(*8qYeN7FsxDZnK*E;i*P9iSOP!N z`qxA-by|Nh>4TkQ6xzwVkq@ETxT=uD@=M11A&vHeb|+^5TJ&{B3mwNz*tpr- zlW^jZQw>3!65s4lCXO|(kz2w*DuRd6)>v_-CA60ISoY{R(?Bvsb}tQ*)}6OaYYy<| z2#vMrRC16$$>L8{)Yo}LY|N_G9Iz=zxD7*J(G%PzjTY+-K|I2CglT6RK9(5Yr}WY$ mX{2>${R@*MNs=TxDVB?;`BR8w*B;Fvtir*`@6n`p8)ZDgOIq%6I7mps`F}^ zgSd@T4e;4e05RLjb|1gwZ2OlbXx=);r=Y;?L!5<~2V)E!J|!o0R&2%x0GBc7ARjv# zXCarT^dJ*Y#>fDWWuR-sbX3hzE008J-(de3Z;A9u!QUS0O z{-yV?iQww={$w%+E6FUhl5Zz(!fjF!zXwV}U}ZiZCcXz4g`@Ele^9i+p0uP~tYMxZ z(X{y`UPx0{yvzG4&bFe_=V|NJXd}s(YFo4_(X@f&0g0ww5Raipaw%e8uR63j-h_E> zX{N1X+}URq^OC5_$Y8dl!#R!sbT+xTDneEB*`@LpNV9oj`wtw|3TXrDHZ1x>1_|%9 zR29Z{Jq>NXlCmiPQC^$xeTeRQ8rpo3s0DzhyyHwoWpg6ImZw(ribA_?_M2LL)~QNs h11Cw6BuSDaA6_ldZi)V?{_X$(002ovPDHLkV1heO<*NVy literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanos/test_get_public_key_confirm_refused/00005.png b/tests/snapshots/nanos/test_get_public_key_confirm_refused/00005.png new file mode 100644 index 0000000000000000000000000000000000000000..cbe4902f79849b821535151be8ea35e80d02ad41 GIT binary patch literal 444 zcmV;t0YmpLbUnkT#{2z;KZq9Dw(H@u|PGewWwNpY@$gXfYO1aCA_b# z5~aFTTOxgBJvPy#4M5d_B8{4k%p7$z@V|t?c&Ls1(kzCDy#4~hO39EFZUY& zc>G<2yC$bHk{MjXhgN~Ch^urCU$Y=fcx?O;r(5fc_)Rmy@E;V< zr662|3(YEA?r{!$`nckUOcFg2&FOjRiS&a8piLLIS6`HE=mcQnC~@0R;J+1dYkn*C m_Ku?)Q(#62A%qY@+`Iu8OI{>6ow?Zn0000E5v>P literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanos/test_get_public_key_confirm_refused/00006.png b/tests/snapshots/nanos/test_get_public_key_confirm_refused/00006.png new file mode 100644 index 0000000000000000000000000000000000000000..66c411c2ebc833c701039f213ad4ff68cc881146 GIT binary patch literal 341 zcmV-b0jmCqP)_wxG+Yry2qARt#sf<#$}=)VJ~ zBlvESR-Jq3=$jydfC?r!$iuAw9oGJ!U-M%YMJ+y&Ch%TCM^JUq5BGkf8O_{y`#mQ} nq4{V^xv44i3V1v$0C_ea3_go|-rj`700000NkvXXu0mjfd&QW1 literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanos/test_get_public_key_confirm_refused/00007.png b/tests/snapshots/nanos/test_get_public_key_confirm_refused/00007.png new file mode 100644 index 0000000000000000000000000000000000000000..9c7e7049cb3e9bcfb1601ec510ee465d38229d4d GIT binary patch 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!tP{{Ii&hxNhEIZ=euB@oYbT~S*K@+uU9<2a7vtmHgakKmt)-tWf1Xpr8k z2T&vT^|oJ@_?%nP+p5JO0W+Zbn)L-eycYldd3+b_womY&!WamUpjlo^(xgg)h64cI z$DKbE@eyJs>50KMbammfBqPN6Lr+Bu+=K(zW6f^D^ksM+w?|?B%^1|tnHtyot!oEk zU^oB)nH_7|RqwY>id<|5AlxRnT_%=vLiLAs-CF!G6^C;(09o(j+kkB*s1Wo%vL!e< zch7)hC{c^>lVV}V@AI5e2`mU^4k_u3Sp5+)43v3=SY98|gPc}GtBk_yuWlm3!dPHh z3{jM0+(p;zWfB{oc+*sH$8@+CG;uXi)~30wUO+cALhNP2PoWm6V)g$41ylYNXx&z% z`isc`N-r}H4|4WZn+>Ls8Wmv@0fhdEP);X?a z0de~=yk>HjK6hmD2E_AklvVW+oNFx&=(6=+WpaQd|YZbwnuFqAP4RRg%|`$U)uhLCPG8^ zOXBrf4-Ln{Pe6(Ev6_h8n-1$B=jL#K4c%4%TOC>to9$P zF%dgE8H}05I{Q2zkoZNMPtXGc_6Q+KL1delFhs7OTvvBPvzM^72e}|27+iKDU+jm0 zVw{ZromodV&kA{f-&7SL8n0G}7%NPGo<52GP|SxQr;8`@=IOYiDXrZuURVVH00013 Zhz}pE4%P)$Gt-S z1|;41yNKiSCp_&XkNzxc)VJ;V;w4Fw(>nBW3sKT3Ny*96YTIQ=gom3$c4$g<=-q7L zX{#C$xv&(a)K*s3Eg**#K&ekI`ygK&i#(ktAmnxxq0TV}HLa#&vGY9i5@sa3?c6jp zhpQI+S3u2}$}i6l&kbE1bc}c%L%6b6xGOw^)2TUDm?$^iz72j8AgN*WL)dqJUT7Z0 zJqD1$9Lxl}&`jb%W^Sn8`Ip-)zbwk9PgnR^)|*kE7rDS89$&$wsWfd&QksqbhnN*~ z3X_kZ4$n1F;}!Vje`CG^^qy;z3F^j>6>w~Pr}llferqO59Xm#CLD{|;F6} z9Z&QQsOf~09%p+|a&-S2CF7RWKygKg<35NsKyf$UHSgm%AKwt92{@WII3m!tN&?3?v8(M}lDCn>!P7AGu}(P**` zoIQU~>w~7m?YklU9U?zDA&E)BRxQ}(QvCMtU zE04r>oSs&*`yarDeb~p;Q4-YQQuL)RS-;MJJl2|0wA&rynv5o*iIN=wPW=v$gP><) zv23vmTf{CD@fW9?zLU*hkrAe`AiAjoqUmHa{$qF4JT)4s0XYC4Om_hN3txLDIe8?~ zY>ql%lq+{qP-d&c`6z4>ncizCUF=DcBuSE-;saVcF~$TtxTPdXk|fD^zQ6uHK|OIx>T9hK zx5N!t!+qv(jJ{t8V@&VQGXC>A)h@?;wwK+ae{Qee?^=l`ER@%njoQ3@xVOiAh`ICC_|Dm@VcC_Di(&0S_}-b#`rNs=Ua3O^I!T&b=hUB&6P)Nkl#QLf-(r(yI{!IOwaV{$jt3r*zaEe0_gsl4TqtjF?=<)Fzz>n}gJ06G4UTBO zdAu6UJGQRVEaSFtLm1~PgmLiOWR$ee?dT~ z8U4j@4|c*Vw3GiqKER)~ri%Tnm2WPitcFiBIoEi>!3Tk?7ok7J+%_2_KK6>j6|K=- z2{m4#?H4&>cYdIiHs?JprjSCNkE+CLv$fCT!F&nJW3G*)TBg#JSG7TUdJ@{)YI5-S z)*KC&VL1}*1{P|o_^ZICm zG>bAcH}Dj3l%ZNF2J1rk55LYbRI>tgN}n|ia9z=&6FN@_A%qa}_WS@*gN@cCE(@8LXY^Ll1HfAym|4mOAvURvvb~#_x=dYR_b;&gAmXLEWcKMy1E8^8HTx$7lWJstGB5@! zfmLWFev`a0x66`Cs>4cshB$?XE?a47q%PT)Dy);$%XIxH<>hP1?W zAvd}-6=S7wcIzelO%|QM5|8PC|HA2vxdf@DjXVP+X|Pc;?DclA`*Sb!)gIK4vMr}w!?4^g%FqyzvkX;=u68p{$2`xg09Q0RR910000YB64`Fam#tlik=o#iT*1}4#&7T=aA7bGGeZRIe(oC z+!FVO_(y8H=RAU$A*j@NJDQr!=xS$(D5sA1`D;L>QM0LCT67s#(ah8xu?b~n2fSJC zG0k}Uk%48onuw+!#3q#a9k8W{D4(WQCEB3N+n$Z%3RF2SOl57q@`zd|LTLE;J@w^c z9pJh8N%gOZAvM)chJA1*j6!GfE%IXA9^Y^2!|8qX|6ke&@C-z1)d@gwfBxS=0(s^J72uvS4#>i``$&F?cv zcy*$@BTBhdWh06=rzDYS9RN1Q%tsy*LO&RLe4W!hxyiU>%z1V(&R7GwFtgCeSDmeW mi9*P7GM@J)gb+dqAuV1Wr!b`+z5?w40000T8RjeyqC3K{mDh&qY0Ymq_(0002k^L| zZABDK%}V1Q9L(+oiOCVV>&!MFYE#nzTE$XvqCQnAr7G2tw&s5$000000HB{8*G$-S TB{*F&00000NkvXXu0mjfEZm9s literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanos/test_sign_tx_refused/00009.png b/tests/snapshots/nanos/test_sign_tx_refused/00009.png new file mode 100644 index 0000000000000000000000000000000000000000..282f54f1be58e2a2a716d3517ff70885e364b4c0 GIT binary patch literal 341 zcmV-b0jmCqP)3-+g8F)!A&LX0gEEJ>jcCNE>!%tyMh<)UoWHg3MfYJTz6A?PXKq$0hhy_B7~Wc nKM6-EdYUq{000000DyXahnnJBV5tls00000NkvXXu0mjfw(O3F literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanos/test_sign_tx_refused/00010.png b/tests/snapshots/nanos/test_sign_tx_refused/00010.png new file mode 100644 index 0000000000000000000000000000000000000000..66c411c2ebc833c701039f213ad4ff68cc881146 GIT binary patch literal 341 zcmV-b0jmCqP)_wxG+Yry2qARt#sf<#$}=)VJ~ zBlvESR-Jq3=$jydfC?r!$iuAw9oGJ!U-M%YMJ+y&Ch%TCM^JUq5BGkf8O_{y`#mQ} nq4{V^xv44i3V1v$0C_ea3_go|-rj`700000NkvXXu0mjfd&QW1 literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanos/test_sign_tx_refused/00011.png b/tests/snapshots/nanos/test_sign_tx_refused/00011.png new file mode 100644 index 0000000000000000000000000000000000000000..9c7e7049cb3e9bcfb1601ec510ee465d38229d4d GIT binary patch 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!tP{{Ii&hxNhEIZ=euB@oYbT~S*K@+uU9<2a7vtmHgakKmt)-tWf1Xpr8k z2T&vT^|oJ@_?%nP+p5JO0W+Zbn)L-eycYldd3+b_womY&!WamUpjlo^(xgg)h64cI z$DKbE@eyJs>50KMbammfBqPN6Lr+Bu+=K(zW6f^D^ksM+w?|?B%^1|tnHtyot!oEk zU^oB)nH_7|RqwY>id<|5AlxRnT_%=vLiLAs-CF!G6^C;(09o(j+kkB*s1Wo%vL!e< zch7)hC{c^>lVV}V@AI5e2`mU^4k_u3Sp5+)43v3=SY98|gPc}GtBk_yuWlm3!dPHh z3{jM0+(p;zWfB{oc+*sH$8@+CG;uXi)~30wUO+cALhNP2PoWm6V)g$41ylYNXx&z% z`isc`N-r}H4|4WZn+>Ls8Wmv@&HnKs<1FD8!#&=}Xx$G!PoP zUqaXGeRw#IxPU|Sv6_gDO@(!!O><2D6soNNu}A>o{O-dA)lg0D+@hwFj#8uU=j;?z zkO%M#c2w0W!Xzp#MLaEfkXt0WVvBaw)CAQ^(G?BR1{ygWBMf3)`4hfRXiK?nTQ36Ogyjgi{)5vI|T7cXWVs4$fA8Zuby^A4|!srA!s04 i|1aoikS78FfX)u7xAbN92cC!k00000fhdEP)S|Nn#g&^|0NL{VWW<+gI3)UbwL6e>$82!bF8+&K1h?30!E^6_?Hb-vyX z2q>o^Z;C0q()-oY{In>Fuv2!xPTO_)qda)j37{)<=hCTAQvm5%(TeH#-8-2J;8v;d5JKyc22 zQiO3{knse^xkZQ=c(Pm;g5uUXEU$su_JG#Uzu(JL5auEV_g(xh8hQOLVv?(n_PV6H zlu^s+<<1QI0I)~6w9m##iRw7jqJ3tsNmtC;L1kl)eE_PqB|E+fkVLP+F9lg_F;%9b z#(tF#z8PnMN^axWI0Zn`kDS_6DZ91r^{7?NQAzm;q~P`D9{Y#PTgcuH+>Xb$W)K7c ZCMT&};Mim7|HJ?Q002ovPDHLkV1i_wxG+Yry2qARt#sf<#$}=)VJ~ zBlvESR-Jq3=$jydfC?r!$iuAw9oGJ!U-M%YMJ+y&Ch%TCM^JUq5BGkf8O_{y`#mQ} nq4{V^xv44i3V1v$0C_ea3_go|-rj`700000NkvXXu0mjfd&QW1 literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanos/test_sign_tx_short_msg/00003.png b/tests/snapshots/nanos/test_sign_tx_short_msg/00003.png new file mode 100644 index 0000000000000000000000000000000000000000..02d922befda7ad5494398ded74de6ab739697b06 GIT binary patch literal 408 zcmV;J0cZY+P)tP{{Ii&hxNhEIZ=euB@oYbT~S*K@+uU9<2a7vtmHgakKmt)-tWf1Xpr8k z2T&vT^|oJ@_?%nP+p5JO0W+Zbn)L-eycYldd3+b_womY&!WamUpjlo^(xgg)h64cI z$DKbE@eyJs>50KMbammfBqPN6Lr+Bu+=K(zW6f^D^ksM+w?|?B%^1|tnHtyot!oEk zU^oB)nH_7|RqwY>id<|5AlxRnT_%=vLiLAs-CF!G6^C;(09o(j+kkB*s1Wo%vL!e< zch7)hC{c^>lVV}V@AI5e2`mU^4k_u3Sp5+)43v3=SY98|gPc}GtBk_yuWlm3!dPHh z3{jM0+(p;zWfB{oc+*sH$8@+CG;uXi)~30wUO+cALhNP2PoWm6V)g$41ylYNXx&z% z`isc`N-r}H4|4WZn+>Ls8Wmv@0fhdEP);X?a z0de~=yk>HjK6hmD2E_AklvVW+oNFx&=(6=+WpaQd|YZbwnuFqAP4RRg%|`$U)uhLCPG8^ zOXBrf4-Ln{Pe6(Ev6_h8n-1$B=jL#K4c%4%TOC>to9$P zF%dgE8H}05I{Q2zkoZNMPtXGc_6Q+KL1delFhs7OTvvBPvzM^72e}|27+iKDU+jm0 zVw{ZromodV&kA{f-&7SL8n0G}7%NPGo<52GP|SxQr;8`@=IOYiDXrZuURVVH00013 Zhz}pEAe2F{dJesO|6%zmm@Y{ z5LFHN_BKGl4{vO9=klX1oF2N%DwT+dIc+ndk1ZdG?dss^iM{X505@Rn^Eki;%;$8@ zr?&yKGr$ed7~^tCwy{kt2^VBWr*~3%ITiQ9`whrC8QyP3!qxD8W3UH3K@{qVLmu9@ zx|o)+%(5)qmy2KFV1KR@Qer@P!pc5|9_x2)N67jt5#3$9hGYRCqCj#r6xbxGF-vCR%vB>BoEb`=uLS`YcCw~Q46c!A4Ua1uT d0001B6n+{2_N+?b4ekH{002ovPDHLkV1j1?s?z`f literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanos/test_sign_tx_short_tx/00002.png b/tests/snapshots/nanos/test_sign_tx_short_tx/00002.png new file mode 100644 index 0000000000000000000000000000000000000000..b516c615877af858a9cc9d28b31afb78308114a9 GIT binary patch literal 433 zcmV;i0Z#sjP)+HCga0 zp!ebeDHnt49U5DW!G+g}r_4&$Nw9oC`qUk=x8q?ew{1+23ZbOjF;EJcp-@F4)URf= z3)2h`*hoXE`Bauwif~~o1h~e)bQ3u2fT{RlvS^m~%==egfd41X`P4n^B|Q#dL`nJq z7ZQIL);pk1P5oLMVT%XU1?RW4bC(60f1rZxJKTQ6NIKzpH{Wa=Pj2p%N zG?=&|61WdWFF*;m*mv#|IG)%Pq)9j$o959i)F;BURpkYm`D!t6AFKMv}6T+ge;+mn} z2mKikT@(LCBeqy@ZX(xiu;Vo+X-~?U4@rmkRY9_^${+9WVCM0a7Qf}VHVATJ{$rxp z=Z}f^C(+xvUf==v7>s24RcLAoPVO@XZLJvfEo>^qG@?rD6Nh-{dhrDs&Z9$}Vv~wE zUtaKED5XMiDSu5R&*DL1nkE+O^lfjLD^go36qn}e7X`0pMjQGpz#tc7L5x1`B2%Mw z8|KM|YI&_wN=M2hGXMaV?f27CGyBR|h0P~Pyn{8QLdhmfq7_?`%5f9UeO1Snf$7`n txzkeK%;gzCyx{TjA|5dV9LI46@&)S>E|u)g-7o+E002ovPDHLkV1k7!%}W3P literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanos/test_sign_tx_short_tx/00004.png b/tests/snapshots/nanos/test_sign_tx_short_tx/00004.png new file mode 100644 index 0000000000000000000000000000000000000000..86db3977b70213e98b8a49fa4924895c6554d17f GIT binary patch literal 478 zcmV<40U`d0P)ax0A9TsSdi!Jo<3~j3K>0%J^qL)hu~F+fGaH?Y4ivOC?-mpuB_>V)KsS{vPrn5-#*D_1ZKN z*-lPLBRcN@@_DRI#xz_10i)R#-RQgkAS{%^YA@3eO#mmvkhK|d2H*(p(UY1w9q7-D z+8M(S;qrVtW(Xv>fk_+JhWu6O<)LBf4yQk2`iqEG)h)fBR$2f_+g-iCAcU*K`-6!! zm`OyTnfy9=BYp-cmnQYbZG>L9s&krCs}6BO&=KpA^;d@wrpD#LWb$gxXoVV!&_=Gz zIE%xYj{1@g+46#BQiCF*JgP0~rkMKT^}qa%Gqr}(ih*y!rroE18NLh`Hc4TYv@VC( z7eHx&^E}5Xgw>N7?|ycGl=05KO2e`jZiR zuo6*)R^mIz8}oB{VoSx`ro7qK?z*)R4bZ{nQsrEz5dss~D3M_2)A#w9s2NVQV6K8c zfK1YGlAqYIOtY}TXxqd|S57V(B{N1{Tb4{|<{Fi5!u``-LWPUTKy%m=lTmgAGRRf9 z0c^=@%{5gK6c_XUdp=0e3$bIO(VU0vH-NL^fN>TiHZBv|W-Q`-Ulcl}S4pcdg#m{yssSxF^6RwTZeU z?!X%M>4P`EV30;S|2=brvZ@Eo*MlPAwr$epG=Oy zN^%ui$vwyiQO%`j@cqD&G!qWjLQ=>p4r~M+i*iE*>RQ2##uF__=L)sBVPGayk+rUD zPq4~pEUXj$H0qaX0a=ykGl!w@4sWUl#?XdA#5;rkEW*EQ%EVlbAb%%%@{c(;GZJW)`aBS9sCq z)T?RqHMMPtN02!MZ8bjjrqgDa+8N@MOZ$8N8c_J?w5cXvm@*f$S=H~FJfUO;U}bs6 zG-K5v$Ff`u#Hx-aPbm2TII=mBzD+Gscm|VND~}+h^zyiAYSi{?98v2;2q!xC^FB=$ z07>eW-k+0-tKt2@AO=^0S?EfBoxD{3w(hrt?RlYgESn$Gj+b}TK0oUXTW3I7txrKo z{B~BphvAoQEptK8V`w$$OLvfV8(IzZRF~3okaH3?4K)4HH_C7`_r%p%`j?0Rc*bLE zw#_q)B4|*$1Hc_I{6evZX=;_Q2CR2#>qEwm0WI#kKW5udEAmvR--hyRena6?gitY! kLiaWl0000001y$;2TF%LWS@}qjsO4v07*qoM6N<$f<>0e-v9sr literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanos/test_sign_tx_short_tx/00008.png b/tests/snapshots/nanos/test_sign_tx_short_tx/00008.png new file mode 100644 index 0000000000000000000000000000000000000000..a76dbae2b9b89d53e8dbd9d14d97c32050357040 GIT binary patch literal 310 zcmV-60m=S}P)?WYmeyt`UPo0000$Jo^?sgUUSAck>{P+4txP zjNuwB>+5k@`wqNDmb>@RyVtVImSy4h%20066CfhCTKP(^L7FY7nC^`<2FRVg z1_=z{k&~Xg&}nQ`!!mv2U(z64Yyo<6A}`c;U??)wcSDgH>N^7uBEc>cNpKwAx8V@7 zXbgx;Ab5!zsTd>Mb9sResw(0rQ;u9v2%r4!&8MmXIn<}R1{nByQ__HT_n=-v z__Brj1Qp!cjGguq-P0wDkZ0C*~k_XHBYpIvoXyLNv%nS3r0 zJa~Igz#^43CiP}HlH=65sQZI3^LKNQJgJ>_F@tnx$S)wOljVEnz~-;=xv)OqPo|5R zvqzMjLH(Ea1kSRo1FCs~VYVPeP$~D#zi1jWI#bJV+#;>U#gG^3cR&;w>UV>Y8tQij zYv2iXAy4)qlh;t`l36rB8iC$U$t0K&)61~l#2zbY_jZ;duFGo=5cc{?Wm={7BhNcZ zQ-{K3ro9Q@1uTFwRi7fZ4KCjJdp^N8-&t@@$<0!ZhacFe4PRitBy tvJ!fea+IP~)~E!mXaN8K0002x`~U}%=uN<&2BiQ1002ovPDHLkV1jSzmP-Ht literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanos/test_sign_tx_short_tx/00010.png b/tests/snapshots/nanos/test_sign_tx_short_tx/00010.png new file mode 100644 index 0000000000000000000000000000000000000000..66c411c2ebc833c701039f213ad4ff68cc881146 GIT binary patch literal 341 zcmV-b0jmCqP)_wxG+Yry2qARt#sf<#$}=)VJ~ zBlvESR-Jq3=$jydfC?r!$iuAw9oGJ!U-M%YMJ+y&Ch%TCM^JUq5BGkf8O_{y`#mQ} nq4{V^xv44i3V1v$0C_ea3_go|-rj`700000NkvXXu0mjfd&QW1 literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanos/test_sign_tx_short_tx/00011.png b/tests/snapshots/nanos/test_sign_tx_short_tx/00011.png new file mode 100644 index 0000000000000000000000000000000000000000..02d922befda7ad5494398ded74de6ab739697b06 GIT binary patch literal 408 zcmV;J0cZY+P)tP{{Ii&hxNhEIZ=euB@oYbT~S*K@+uU9<2a7vtmHgakKmt)-tWf1Xpr8k z2T&vT^|oJ@_?%nP+p5JO0W+Zbn)L-eycYldd3+b_womY&!WamUpjlo^(xgg)h64cI z$DKbE@eyJs>50KMbammfBqPN6Lr+Bu+=K(zW6f^D^ksM+w?|?B%^1|tnHtyot!oEk zU^oB)nH_7|RqwY>id<|5AlxRnT_%=vLiLAs-CF!G6^C;(09o(j+kkB*s1Wo%vL!e< zch7)hC{c^>lVV}V@AI5e2`mU^4k_u3Sp5+)43v3=SY98|gPc}GtBk_yuWlm3!dPHh z3{jM0+(p;zWfB{oc+*sH$8@+CG;uXi)~30wUO+cALhNP2PoWm6V)g$41ylYNXx&z% z`isc`N-r}H4|4WZn+>Ls8Wmv@tc-6 zkr2X^mb~M4b^~5ijeZ(>8xnmk1JE3OzcFwo##oJV`LF#HgEdFLiovJb^ag(y;b#7+ zj(fZsyHO<>yC8h60DtW0cPn_I1;(|jr0yyrvuH_=C%uW}2P&#_esoeqW&8UwC2 zmHLJL{P$BQh$x%%|41^0Wk!1%@&p;uDxH39CfV%eXYHji$*57wsY#(|4D$Oi?CM;Q+PO+?**-d0001HyY&ud$=fGSlmoDzpYjoT z^L4au>TkHNyscI3??j3dDo%@+7b~6pDyd+JRAmK}uFOr>?}L`)0&uZ-X+L%P3mMU! z@J+?b^tDpiUv33lDPET0>AWEAZZ&)bwWx@uAS}q^uLl4C00013%^y+aLEWEV%_IN- N002ovPDHLkV1kVz*&zS` literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanosp/test_app_mainmenu/00001.png b/tests/snapshots/nanosp/test_app_mainmenu/00001.png new file mode 100644 index 0000000000000000000000000000000000000000..ab88bd3a6d7427c33b0466c09511a2947d76e558 GIT binary patch literal 379 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|@9eba4!+nDh3gW8Yx~0hd6v z@Q450AL&Ida9qK7USpcZsh|1cZxrraNGR|EYJ!4>l|f#bu6Mhl<6g1VXdJn_UApcH z?~fx|cPyWu)!ljChnD_ zFe+PK^Ut$g=g?IxQK!U+@Z+u(p%SlbQUvSv9ga`@ntfpU<@YV-GyEK3A;Iv2FaN0M URgr^|8BQQEPgg&ebxsLQ05_keY5)KL literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanosp/test_app_mainmenu/00002.png b/tests/snapshots/nanosp/test_app_mainmenu/00002.png new file mode 100644 index 0000000000000000000000000000000000000000..7e1a28c65f77030ad7ed3d1b28cd5e3f15ba7106 GIT binary patch literal 350 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|>}Bba4!+nDh2VAm1Sc0oOp2 zcP)SQGrv7@7dB#Ax;1NN`1_y2CW`q9TE3h>O%SkS)9p8`GKpz-KhF7lQv2tf+HXwv zwoUt2p|$2XQ2a_>+0ieP^B6B>Kk7Q0t{B5`_k!(1rUE9l%e;4m^%&F>jDP}rs}CH# zqJH3vO4+m*`~R8U`(0tR;2@W(*#2FmF5jmt^1HI6-YCmJI5uNh?}U{H{RQ>E8E($n zyhZuCz(=*1rhiF~5?`x-(_7IJ@h&D?`RS?0@9k2b98t~ZC}+BL?y-H?&7ThJ(tG}B zJ(tn?E3$#1`|Ofkx~gfDCAn`ki7d8JyT$Tg}e1&P( zg<|UtodolD7x+GLS#VfwY~I79_sp!SLEQG|Hc1JStDnm{r-UW|D(8I) literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanosp/test_blind_sign_tx_long_tx/part0/00000.png b/tests/snapshots/nanosp/test_blind_sign_tx_long_tx/part0/00000.png new file mode 100644 index 0000000000000000000000000000000000000000..976798ad378c22d7b931054754ffc65ea582e804 GIT binary patch literal 580 zcmV-K0=xZ*P)u7oS11BP2uU%PGkwUxkU?c3um>Lp0000000000000n?bIv*M zj>5$6?f|}>zzHaGKY9^F>XkDG(233v=46F|=QphXZe0Z-y*cL2-qGd-nr zStKsRu7H$MxI5kuECJJnKHN_5w>tn6;chno0002Mce3`_mfvY4;C!|v7Ga11JrW0F~EdXnu6OtxM`q$&WUgxxdE? z>Px;r7WgVIA}36!!v8jbH5Yffp=4pXILz)gwbvTZM>VMc^{9Nrquq&blA{)3*6U`I zpKikaCVzKaK6D88wM4K3ndfn@GvU!I#q}Zp002C(*jQ6Dga0r2MyePzHogh449fJm z{-$fJh~7jjO{68+UnCz+Mz1`h7P@)+k+@4A&=7?{fRSKF|MxIuN$a_GV1=zB000000000m!F%t$-<`#P z_wEE%vQ_%vISq)_ch2q2WQef_)Mgl?)faOO2(lj7t-hFRKrC@Ay6NhR$ZK~3Gs;=W zX!XV12ne!r+pWHB=HBuH005whH+GjgDX+rn*S38WrrN2Rxx$weQc4qhKm+7A`FA{J zcR}y}#Bb9}hsS$4=MIw5lV8*`0vcD#uSy(@0I9WQpExMBCH7C*Wb;X{g_o*lE_zbk z16Acc(K++<%=nrc`8j{c4%wa37@Fw>W#;Ar006+H{I7U2JLrki2tFEZ?(rtA+Q=-Q z@|g1NT!_WBRa(t-F*Q`>!)Q`$C8ht|*!byXkp4^*Dd!&<+|ewL)5zJGx%mB8uW+%Ln&!O$V!?brmm+X(S$vUI< zoB94AolJf{;7Lq=LZ+>@s<=N0000000LXm-^5SD-<|qUF00000NkvXXu0mjfQGncL literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanosp/test_blind_sign_tx_long_tx/part1/00000.png b/tests/snapshots/nanosp/test_blind_sign_tx_long_tx/part1/00000.png new file mode 100644 index 0000000000000000000000000000000000000000..3d6158d4c04fa1a2333673e69b658d4e67d20da6 GIT binary patch literal 430 zcmV;f0a5;mP)i<1-XiK}8D3vUw00000007`AUfu(EpNO<} zt<`ZPpGcVi9eOQe8uBHeMPG-z`(g@z-UE1(33R%+XC)$f{uw__A?ppgHKq=#s|v(UBg&(pt4v5pgf7jQ`_!>KkG*L0LvlZd2HeAYU_1qxo~Jr@+Yv0sUA(Q=Wouv982|tPUcR?0;*+)2g=2X7z3KPY zLD5!ThVw#9FPgUde7ZY-%sOk_M?W=%mhF1&5gUzWwiI^j3gcqKpu^#pj9trc zy|x=)v6*wOn_Gi*N$E?e&@|t|@4e>Uyna};lXI?TbkSzBIGR6eFDaM_&}y1Ld(Bx& zPns^3lJxHqBQ2zOh1&ASCMev#(j$)SfM(@Jb(&6=@ohGcyYRsZb;qumyt&O}-K}#l z1r0SB>Xog$J}B-BX8oW)w=7cE$my5Cr3qjTa3#Z*S4dqF zRZiR(;q(o1TJ8NpM*3!$qrqtl|2yjwuqzTFgb)I%q0FfZ3yN+DqnH9k0cb&PVN-&Y zA}p6;v51LzfadTE>bPPd^AOpOPJ5snn8LvW`?hx*V=fF_#B4uLTuC;sqXoabyOo%a z%h5xukA61=4f$m%FUCAD0alTZ;^S?u)AZ9y4z37sdOz`O-U0Zh6-<+J%NRxFX?7gl zH?3=by6uq7&{Oxp{c~?~P>vNe(tFo06D=RJrQHE#uE>NFIjetriVmht%?TQJ)))4E zKMQrXg2bi^goCWnzlJl^8vV;?4xU6==t(+*tT{M}9p3)8q3)p#oaC}6ST>c1j)wN= z=H7;^{ko8h#H|)Z%api1nuNK_xPoHTe8OO<%!`zZkqlk#$m?Fs&d*Y|3oM_b*qmch z3vzco_$V{c65gE7<6hdknQHE~Z&|r-vlEbeq9X{-TCfdCgN;&B52X#V8;N~rVu-BS ztZ40!J)$O{yBLSWKSnVH2Fdg~oxaE~`1nXL{Rv=t!u&un1TeU_|Bu7&fcL|MPzuf! zqq*45M5g~E!;OUTYwIxa?|QokA%qY@d@D<8D7bk?_eodUOz@D0h0LfX2m=J~HcaL; z*%dilFRL_CU!;0Qtw2L8ZMteGQxn&zAAn7!7mSyP88vj{tbWKn<-srpZo;E-W;(AY zlN#g&S$jI+P!qswjW`LoLME;}8rX$_CgoUCsyg^}bo9QRXt+0wb%WhH{4`wsJe?Gx z?`Py8rw_={jbk?^oCG5wlk^BqlZki-;85Qs_!KOm^;Gp=_XPXX(vgQvxDSZ>7AJTL^8j zI;U8GSnZ|<=dn}Pr~|7j(vyii8tgIhy-Z2K6i)yE003JJ^@SQ=kYU}VL|PS1RoPM+ z?DH)$sw$f9!+$`Qry@FmFD^18&Vz^ViP}<~+M03E^UwSjvB8xxU2reN-`9Msw>g$t z`ikegJ$Q1oB~HQy+#y#!G0zS_rkT2|YpZ%mf> zQ^v;cKvm0@|9;QzjobD?rhA(B)~5UVB9cqhlgLW7n12uGzFDzPF?Wf6K|b9@;5(qq z7b%YNGvV3NRD2^agOPGCeT!HQ&MpsV2j{bBC7n>3Hed!B(cgv=YD9lC$iXK;75XHV zAR`A$*&W_>^Z5b`2r(smchAAvpQT8>kV%OV$&fW#5%)z(CRMUy)x9TdG8vR=W86-4 zpqe@PZ`|P(T;-Q>sp~o;B4yCdrxyEF5^!p8tpZV1q>S6__(Aavh?gLFR^E!m{j@pWQrGSBZrKGIo=mBq v<+JMKzm%Rv^)f|&n|9lYaiH))0uRjM*&jJxJvQahERd+DtDnm{r-UW|Y!k9q literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanosp/test_blind_sign_tx_long_tx/part1/00004.png b/tests/snapshots/nanosp/test_blind_sign_tx_long_tx/part1/00004.png new file mode 100644 index 0000000000000000000000000000000000000000..53ae65195fbea5b281a1bc1a80351dbf1cd79ff8 GIT binary patch literal 364 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|=-%ba4!+nDh2#AYZeBfa}G~ z%X2sUSKTFSd4J{-YHcY(QO5;J{<~e9q=7F?O4)!WO}6UUdH! zS+Hz=(4})vCM2-VD4nt3W%LdvkyzeG%km#`1t_mu*zR}#jNB{EKZnW}g5-=Bym-_% z`=7%C>zxJL|9msNSMXnbQRayy^)nr>EU7olTHqoc^vG(B%bo(Id*|kR{84!`z2x6n zZ`;PkbrPvd6U}A>Y0chs_tyHmLi6kw6c{>JvYiQ=+MTFTx8d*9^V|R0+_75oZt9or zLetinU!`YMvFyLCb8XxElhO0{v2rTkNR$jMW7~4}*8a52+MC^J%KMbxPN-JRb2RNP zEsp0ebAPS3=e2G53#Z$XZAI6Yd=Ytc-6 zkr2X^mb~M4b^~5ijeZ(>8xnmk1JE3OzcFwo##oJV`LF#HgEdFLiovJb^ag(y;b#7+ zj(fZsyHO<>yC8h60DtW0cPn_I1;(|jr0yyrvuH_=C%uW}2P&#_esoeqW&8UwC2 zmHLJL{P$BQh$x%%|41^0Wk!1%@&p;uDxH39CfV%eXYHji$*57wsY#(|4D$Oi?CM;Q+PO+?**-d0001HyY&ud$=fGSlmoDzpYjoT z^L4au>TkHNyscI3??j3dDo%@+7b~6pDyd+JRAmK}uFOr>?}L`)0&uZ-X+L%P3mMU! z@J+?b^tDpiUv33lDPET0>AWEAZZ&)bwWx@uAS}q^uLl4C00013%^y+aLEWEV%_IN- N002ovPDHLkV1kVz*&zS` literal 0 HcmV?d00001 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 new file mode 100644 index 0000000000000000000000000000000000000000..19c9a3e18c72d20e0070be1ba192ab60f82fdea9 GIT binary patch literal 375 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|_WKba4!+nDh2#G+(oVKx^Xd z67_fWo|~uJO_;=~6n2E?_@Dd1N1Y1Vx~Hcy0(C(^!|gqbtS_8D^XYwQEOT{HYYJ1% z3)`b6FH{xW@3-%c(s(F)x6#ja!P7_UPM!Jl>$2UH1y;-gY56m>`To0>vx#gB46ynFTY``2@GtW@o_^!K$$ zR{veOb+4Ja&w+Fg?W@aozjdGVcJu1~aJ`SqgDL|*zIi^~{&Ad1^(%u*51)okpT5_0 z`QPVmuJIMC-py|{-}^7PRyt~Gy1!xOuIOy`S`WTsI*y+ub}R_rU-e7o_u;(cv;#Kg zLa)!)zI~tTQOkCw;Yw#x@T(hI`dVzsuN=INnYpz$-u_m9&sPE#2n-AcEA_9{iLuVp R|LhGC^mO%eS?83{1OQggqS*id literal 0 HcmV?d00001 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 new file mode 100644 index 0000000000000000000000000000000000000000..ee8e82f64e1932575a4c15b5163b1541ec48f760 GIT binary patch literal 390 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|{t1ba4!+nDh2#AYYRKPeY=~ zy_VndE6YC~+@Z6ywP|YLr+WXzH`&UP&sq8cH63^+$Vg(Ru$-c%3NM9>!CDOm&U!J$hSoLikb&Fsv%1G+uj-4mE?$S(zn}4KeHX_8v?FtmY@)pR=})O~-vmp!QoafAy#CPY z`qSK#d-;=>72UknUD5hrZ=Yz;pQr6JI%cpZp02o7d2`cz50y*jH(C|`On3bFX8o5B znk$-9uiD&uI5qZ>hSSoZxmw##JlicVIcbem(yKUUW_I4L5t!vK>cvdaC_iZW!eI&HtE0&k-#Xq5FrG gC&mFCiwqv*-&=d%W8Q?g`%)lbPgg&ebxsLQ0925(-~a#s literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanosp/test_get_public_key_confirm_accepted/00002.png b/tests/snapshots/nanosp/test_get_public_key_confirm_accepted/00002.png new file mode 100644 index 0000000000000000000000000000000000000000..3151d46e829827f0b0c84bbb821b861ff49cf92b GIT binary patch literal 903 zcmV;219<$2P)W6&HnGEdidnlRjS)42=*5oAym>gb+dqA%uJr*L7Xjg& z?~2FoZY;U}VKv{y?-QbJ2={1Cab&L5YQ6XS>iFAlwZfn6iazQX)YZ^?w-SMu)M9Yj zZs*7fux__8q0?14W_j!N-ql1;ZDq;Sg{*)eyWYaV6);5%-upF$F`?FsI;8H5y_|Xm zv;z;-KG341FLwRdqig>J+@X&v{k5md%E0`?G^HZJ*gb+gh7k)X{!WS>!jcM*#N!CocJ=U4a zF@-F*XF8+c7L(O5EQCPpOy><+6#<>aPpM;cZV{#$A}>yfgIG#;;^_GW6#vXK z)T$X*Ut+ePG{p+yi-A2BMq&acgWlIo1((%9a)AimIul6wZcyv8>k%GD8q@u<~Ce>;V2Si3Xk6)-KX7OiEu$CWo0kg3O4 zoK6^4HMv)S8FU(|ola4CUC?iO05i$V{$nVqX7(S3bMQ{M3%!#d$()0u$n<({sBG-} zeDbxm;D9eAuQR!czC9WK2z9`|YVkO&#!J&xHL#R|3Um_Q zd;0hJ1kVy5uT>3Kh`k_7YnKm-=!9F4L_NuaeXWlOSE!qDavRO=6{DBpuh#GbnY=pM z19vZBD=UDqZyFLzz_jr>eLMH&X?JKvS$(Lg<4sw9NXA|S6R_^~{VYOfzljAjE$qaqEXws46=S=vZgnbG6i(mI0N@f6|k)ij;g5dr$Q%YLFY+ zHYK!nXk0vMs{0b??}8;O$%!XGdWvPNVf)J2p;{hJAw0|H2{#tpJ$>ijhPDF+UnrP$ zE5q(AHPAh+Ou(+JJ)ixy+uzN)rxNIUz$mw30ft+u{~1e_vMQ%cS+FfAWx1z*?}QLS d2qA<#$6vV8GUIL~@YMhS002ovPDHLkV1hg2t`GnK 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..89621afb1031829c0428e25d5ca88ba749a3d749 GIT binary patch literal 492 zcmVi?cLLcwteP+AHA008hYT5GK}|0Sb-R6Ijp zb_}vkQh47PjrO;Z(f%%($69OA!t2Xros8T032)J$-het1Ypt^^_)Ao?OU{pni+=-# zgbr`RaBpg1nT%OA(ZgqD$*hZAvzO+gtT$i?*E#mjTIiGOO!rW2YjDI$Sp!PKqFOs; zm2|snPhhvLUcnFG9d|z!yykRS*)zE8*?c+w_**`X@S?BS=Il8^UFc@Z>1;$FEW*al zXISlJcScn33YibHzo~q<|p0=A+3-oH%taD7c<1L~<`x3BIdJ+1Bb_|)0a zNIgnZ|26*bR94%Uf7@ps#!hCp$EZzF)=>nU0uJNkTdcCbbG}b_mUa9+9!Kl!@k$tB zmXpTCDagKL7cMW^<(|fkHl1$$K_=BKiJqhB2Z!+IJODXe{QvA1xeYxC$k;fRxNWG> zzKpqbKWg?L-zu^1=xhO4q?hxi8%&c-_HU!4n(W_0000FSd4J{-YHcY(QO5;J{<~e9q=7F?O4)!WO}6UUdH! zS+Hz=(4})vCM2-VD4nt3W%LdvkyzeG%km#`1t_mu*zR}#jNB{EKZnW}g5-=Bym-_% z`=7%C>zxJL|9msNSMXnbQRayy^)nr>EU7olTHqoc^vG(B%bo(Id*|kR{84!`z2x6n zZ`;PkbrPvd6U}A>Y0chs_tyHmLi6kw6c{>JvYiQ=+MTFTx8d*9^V|R0+_75oZt9or zLetinU!`YMvFyLCb8XxElhO0{v2rTkNR$jMW7~4}*8a52+MC^J%KMbxPN-JRb2RNP zEsp0ebAPS3=e2G53#Z$XZAI6Yd=Ytc-6 zkr2X^mb~M4b^~5ijeZ(>8xnmk1JE3OzcFwo##oJV`LF#HgEdFLiovJb^ag(y;b#7+ zj(fZsyHO<>yC8h60DtW0cPn_I1;(|jr0yyrvuH_=C%uW}2P&#_esoeqW&8UwC2 zmHLJL{P$BQh$x%%|41^0Wk!1%@&p;uDxH39CfV%eXYHji$*57wsY#(|4D$Oi?CM;Q+PO+?**-d0001HyY&ud$=fGSlmoDzpYjoT z^L4au>TkHNyscI3??j3dDo%@+7b~6pDyd+JRAmK}uFOr>?}L`)0&uZ-X+L%P3mMU! z@J+?b^tDpiUv33lDPET0>AWEAZZ&)bwWx@uAS}q^uLl4C00013%^y+aLEWEV%_IN- N002ovPDHLkV1kVz*&zS` literal 0 HcmV?d00001 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 new file mode 100644 index 0000000000000000000000000000000000000000..19c9a3e18c72d20e0070be1ba192ab60f82fdea9 GIT binary patch literal 375 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|_WKba4!+nDh2#G+(oVKx^Xd z67_fWo|~uJO_;=~6n2E?_@Dd1N1Y1Vx~Hcy0(C(^!|gqbtS_8D^XYwQEOT{HYYJ1% z3)`b6FH{xW@3-%c(s(F)x6#ja!P7_UPM!Jl>$2UH1y;-gY56m>`To0>vx#gB46ynFTY``2@GtW@o_^!K$$ zR{veOb+4Ja&w+Fg?W@aozjdGVcJu1~aJ`SqgDL|*zIi^~{&Ad1^(%u*51)okpT5_0 z`QPVmuJIMC-py|{-}^7PRyt~Gy1!xOuIOy`S`WTsI*y+ub}R_rU-e7o_u;(cv;#Kg zLa)!)zI~tTQOkCw;Yw#x@T(hI`dVzsuN=INnYpz$-u_m9&sPE#2n-AcEA_9{iLuVp R|LhGC^mO%eS?83{1OQggqS*id literal 0 HcmV?d00001 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 new file mode 100644 index 0000000000000000000000000000000000000000..ee8e82f64e1932575a4c15b5163b1541ec48f760 GIT binary patch literal 390 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|{t1ba4!+nDh2#AYYRKPeY=~ zy_VndE6YC~+@Z6ywP|YLr+WXzH`&UP&sq8cH63^+$Vg(Ru$-c%3NM9>!CDOm&U!J$hSoLikb&Fsv%1G+uj-4mE?$S(zn}4KeHX_8v?FtmY@)pR=})O~-vmp!QoafAy#CPY z`qSK#d-;=>72UknUD5hrZ=Yz;pQr6JI%cpZp02o7d2`cz50y*jH(C|`On3bFX8o5B znk$-9uiD&uI5qZ>hSSoZxmw##JlicVIcbem(yKUUW_I4L5t!vK>cvdaC_iZW!eI&HtE0&k-#Xq5FrG gC&mFCiwqv*-&=d%W8Q?g`%)lbPgg&ebxsLQ0925(-~a#s literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanosp/test_get_public_key_confirm_refused/00002.png b/tests/snapshots/nanosp/test_get_public_key_confirm_refused/00002.png new file mode 100644 index 0000000000000000000000000000000000000000..3151d46e829827f0b0c84bbb821b861ff49cf92b GIT binary patch literal 903 zcmV;219<$2P)W6&HnGEdidnlRjS)42=*5oAym>gb+dqA%uJr*L7Xjg& z?~2FoZY;U}VKv{y?-QbJ2={1Cab&L5YQ6XS>iFAlwZfn6iazQX)YZ^?w-SMu)M9Yj zZs*7fux__8q0?14W_j!N-ql1;ZDq;Sg{*)eyWYaV6);5%-upF$F`?FsI;8H5y_|Xm zv;z;-KG341FLwRdqig>J+@X&v{k5md%E0`?G^HZJ*gb+gh7k)X{!WS>!jcM*#N!CocJ=U4a zF@-F*XF8+c7L(O5EQCPpOy><+6#<>aPpM;cZV{#$A}>yfgIG#;;^_GW6#vXK z)T$X*Ut+ePG{p+yi-A2BMq&acgWlIo1((%9a)AimIul6wZcyv8>k%GD8q@u<~Ce>;V2Si3Xk6)-KX7OiEu$CWo0kg3O4 zoK6^4HMv)S8FU(|ola4CUC?iO05i$V{$nVqX7(S3bMQ{M3%!#d$()0u$n<({sBG-} zeDbxm;D9eAuQR!czC9WK2z9`|YVkO&#!J&xHL#R|3Um_Q zd;0hJ1kVy5uT>3Kh`k_7YnKm-=!9F4L_NuaeXWlOSE!qDavRO=6{DBpuh#GbnY=pM z19vZBD=UDqZyFLzz_jr>eLMH&X?JKvS$(Lg<4sw9NXA|S6R_^~{VYOfzljAjE$qaqEXws46=S=vZgnbG6i(mI0N@f6|k)ij;g5dr$Q%YLFY+ zHYK!nXk0vMs{0b??}8;O$%!XGdWvPNVf)J2p;{hJAw0|H2{#tpJ$>ijhPDF+UnrP$ zE5q(AHPAh+Ou(+JJ)ixy+uzN)rxNIUz$mw30ft+u{~1e_vMQ%cS+FfAWx1z*?}QLS d2qA<#$6vV8GUIL~@YMhS002ovPDHLkV1hg2t`GnK 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..89621afb1031829c0428e25d5ca88ba749a3d749 GIT binary patch literal 492 zcmVi?cLLcwteP+AHA008hYT5GK}|0Sb-R6Ijp zb_}vkQh47PjrO;Z(f%%($69OA!t2Xros8T032)J$-het1Ypt^^_)Ao?OU{pni+=-# zgbr`RaBpg1nT%OA(ZgqD$*hZAvzO+gtT$i?*E#mjTIiGOO!rW2YjDI$Sp!PKqFOs; zm2|snPhhvLUcnFG9d|z!yykRS*)zE8*?c+w_**`X@S?BS=Il8^UFc@Z>1;$FEW*al zXISlJcScn33YibHzo~q<|p0=A+3-oH%taD7c<1L~<`x3BIdJ+1Bb_|)0a zNIgnZ|26*bR94%Uf7@ps#!hCp$EZzF)=>nU0uJNkTdcCbbG}b_mUa9+9!Kl!@k$tB zmXpTCDagKL7cMW^<(|fkHl1$$K_=BKiJqhB2Z!+IJODXe{QvA1xeYxC$k;fRxNWG> zzKpqbKWg?L-zu^1=xhO4q?hxi8%&c-_HU!4n(W_0000FSd4J{-YHcY(QO5;J{<~e9q=7F?O4)!WO}6UUdH! zS+Hz=(4})vCM2-VD4nt3W%LdvkyzeG%km#`1t_mu*zR}#jNB{EKZnW}g5-=Bym-_% z`=7%C>zxJL|9msNSMXnbQRayy^)nr>EU7olTHqoc^vG(B%bo(Id*|kR{84!`z2x6n zZ`;PkbrPvd6U}A>Y0chs_tyHmLi6kw6c{>JvYiQ=+MTFTx8d*9^V|R0+_75oZt9or zLetinU!`YMvFyLCb8XxElhO0{v2rTkNR$jMW7~4}*8a52+MC^J%KMbxPN-JRb2RNP zEsp0ebAPS3=e2G53#Z$XZAI6Yd=YMjqtrV%Nn6esuj!jIMi}Btw`sohxwi1&U@}K{{10Q-!s%eVxF#kF6*2U FngGM>p?d%T literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanosp/test_get_public_key_confirm_refused/00006.png b/tests/snapshots/nanosp/test_get_public_key_confirm_refused/00006.png new file mode 100644 index 0000000000000000000000000000000000000000..51264fc134d7afd8d68b7b8c14ae4f97980da6ab GIT binary patch literal 471 zcmV;|0Vw{7P)tc-6 zkr2X^mb~M4b^~5ijeZ(>8xnmk1JE3OzcFwo##oJV`LF#HgEdFLiovJb^ag(y;b#7+ zj(fZsyHO<>yC8h60DtW0cPn_I1;(|jr0yyrvuH_=C%uW}2P&#_esoeqW&8UwC2 zmHLJL{P$BQh$x%%|41^0Wk!1%@&p;uDxH39CfV%eXYHji$*57wsY#(|4D$Oi?CM;Q+PO+?**-d0001HyY&ud$=fGSlmoDzpYjoT z^L4au>TkHNyscI3??j3dDo%@+7b~6pDyd+JRAmK}uFOr>?}L`)0&uZ-X+L%P3mMU! z@J+?b^tDpiUv33lDPET0>AWEAZZ&)bwWx@uAS}q^uLl4C00013%^y+aLEWEV%_IN- N002ovPDHLkV1kVz*&zS` literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanosp/test_sign_tx_refused/00000.png b/tests/snapshots/nanosp/test_sign_tx_refused/00000.png new file mode 100644 index 0000000000000000000000000000000000000000..df51419d9880ff10f1f24cebe779f11ff7ce27e0 GIT binary patch literal 419 zcmV;U0bKrxP)D$(iko|UTF@u&Yag{)@)mN`1iGamjW z?-@|#I%DcL`R;-Wx1m8iV&w2DI!Y>*e7y)ffN(0IS^hR>UWBs}p1R_IuO&=RwhCUX{fYF*|8$ z-}7I$&Jfhf0$I4MAmWJn3INi&qfcFT$NR000000000U?jMqbF~2?)b|e4* N002ovPDHLkV1ho3w>JO) literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanosp/test_sign_tx_refused/00001.png b/tests/snapshots/nanosp/test_sign_tx_refused/00001.png new file mode 100644 index 0000000000000000000000000000000000000000..a585d6e354b0ea2c28df7e2ebba013284dc40a13 GIT binary patch literal 517 zcmV+g0{Z=lP)004mPenuOF5Jbs&o=(Bc zi&4!*^2`x6gb;Mx|2lxXM)Yy%C4_LEXIh5&NYZM`>!fmBv)J}1tZ`a-qM9MQrX@d?~#YRy?ZSpMqYF8&I|` zg8{&E44;Nh6K|xo^P;@T>J~%?mNIZovziiucE8%*&;i3K+67c=^3Z?)BTS|ar#I=KwX;F%H+f z;_0{PO<4Spa--36=GEj5aR2#2bSSdWL~loFsrJmNo$>mAu)Lx%_D3y^Z&jUSW`CQ) zR5SaVaS!f97P?bolDP*BoPzPvo#+Z`f-HF znpWc!EcyTd001zFPT`?wb5o%$97hn1XzDimgG&MeW^u6^dfd5;%U4xgE50QoYu8kT zIYTsk6s_59KU9nTU7S`Lolao!3edv+7``udW={WzTF@8+vUbbJ%yqCh0sC~DJmyno z`crN}moC7b4X39~_2@QUyhu~>RoeVR_$0icrr|#cJC>$nVLcur@^C7?MRs?L;3N8q z9E9atcA=P@1eqLM3gI0DIkvz>% literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanosp/test_sign_tx_refused/00003.png b/tests/snapshots/nanosp/test_sign_tx_refused/00003.png new file mode 100644 index 0000000000000000000000000000000000000000..1ccd507cd7908d7ddd1c6521106d748a922bebe1 GIT binary patch literal 888 zcmV-;1Bd*HP))7@Vw76^fb@yczDAP9mW2!bGv<6ohz$K%m| zU)NP=v&!1j;AlT7eZZu?kFP>oPfV`wTdR$}^XE8eGcw_5|=#RB>GL{k#?RJ3yibVvN@)oMNr+AywDWlJTALk=t9f`@7w-1Jql!t#+{! zxaC}yRy4lqjwyc#O{h=6bMMQCm3+`y>bXf1T1(WHdlk2rAT=~nh(u668_VMkdRvHF z5}@{Qj~`e?feg6M`TJ;;+MFLzgX=BnzdM zN+|ZhDz~GK@gEzVFsDeKL#b#jQ(LT2d@OH&?~VBGIMY%WOz+B z6lou&(CP~?sUe5bTCNj8~RkSGQH zS8?Lg#24cI-`G7WBFAguETbF->LPE>QQakNfcTbHk2R;f*=Uu69N6Fyw&rn94FYQwSg7zwR~ad^j~VJ5^HJdT962A^`I)JDCJRF z!n&kt!G?nO{@wWCx0nSRibr2%8F2cbGe1s)G}|BIO{e?v7gtzCxSJ_?QW>xT?+1 zC3ASyBWE)ch}$RH&{1L?nn&AEr0Gnwp{j>|yBuo734$O9f*=UuE$|Kdu$ahF3II?5 O0000a$b)!*J!=4orV?>DQWs%!WC+H#}cU0bbf(`BBlrz@rWWmV);2Zv0wQjX*3 zhJqEEnj(vItn?M**pWX1q#B4eUTtC*YxS*E%Q~gxOPV#CY$t|CI`MziyF|`H{K~WJIE;g1({XgMzkaAW zC*}=V&}oJ<;RIWiWmN~rc~kwO6q#O~S>6ds{p(s*~2EL=Gv{d$sxNEEHKzhTk&p7=-u9Z_39ogG}_dQ9@1h zH=_^UiCO5K20^9|mLj|W000000000000000006);|E=1oV;KqHKL7v#07*qoM6N<$ Ef?r(m7ytkO literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanosp/test_sign_tx_refused/00005.png b/tests/snapshots/nanosp/test_sign_tx_refused/00005.png new file mode 100644 index 0000000000000000000000000000000000000000..908007899b7edf73aff3c0856df19f34b33b3c42 GIT binary patch literal 376 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|_WOba4!+nDh2#E?=_(PebCi zH)?nOd+a@3H(^2>Q=Q_`A9ni#7=0(6ir@h1Igs7i(NSUF+PwZdbBllz-`_2U5$SvC z@9|$yQ8GLxvMk2qY0SbZx9wWLGY zt&ARgM-RExOspw7q^0>{r{JCwm25Ar#ao~!+C=94X|K@qk7*s+w*+*o97{?zg?L3KF3m|^;N8z$hzo9 z?KebU@9X((Q^znb?@3zBxqq4G_iiri&-sv-VQMM#z3(9NhI)75(&fz8qc)aUy@`LN zv()VWgpH-|tcy>$MaSLdoaLzY>vD*b?-%uC9-E1+HXmibxl}L$!vG01-2TJZ@=jat Sm%7Y1kg%t#pUXO@geCw8Ri`!p literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanosp/test_sign_tx_refused/00006.png b/tests/snapshots/nanosp/test_sign_tx_refused/00006.png new file mode 100644 index 0000000000000000000000000000000000000000..04dc0f95685125cbc8119d7d9f8d3fd5489f7588 GIT binary patch literal 388 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|{t2ba4!+nDh2#EZ-po0k?}6 zcL;ymuk!7YGq0j7TNhJv)%nSbTt9sb?otBkIZ$N&o~@(fh{WgZiY)8Bu2ol-_BS+bG7J9&R-CztEI4hf_~QyzE@HF1sF&+VdeP_jHa4^Cvrjt;?Qk z9ekM>w`OzD&m`$m2fzNy&i6bGk7+lX|L-$BDRXzP^ab6P3$v^DUYP#h)}co>W%Guj z)f(6KJolAgV0d8Pd%tboy#86zj+$>-XS?(LQg@sBqU_rGTc@vxWp}AufTh6& zdEWYqU!&*$-lzUhe)G%73Ea~sFPbPjA?*L-6F%#I{MMVRlqA!5#;k%(Bzk}4yM1is z4O`D249#axf2%a>|LO?&&}~6g=1(IoEiKeNT*hdeaw&e9fayzpH~ESr(N9NeZwP+` dg&{JyY{QsXZE^k7$9n=GVNX{-mvv4FO#o^Pr!oKl literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanosp/test_sign_tx_refused/00007.png b/tests/snapshots/nanosp/test_sign_tx_refused/00007.png new file mode 100644 index 0000000000000000000000000000000000000000..53ae65195fbea5b281a1bc1a80351dbf1cd79ff8 GIT binary patch literal 364 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|=-%ba4!+nDh2#AYZeBfa}G~ z%X2sUSKTFSd4J{-YHcY(QO5;J{<~e9q=7F?O4)!WO}6UUdH! zS+Hz=(4})vCM2-VD4nt3W%LdvkyzeG%km#`1t_mu*zR}#jNB{EKZnW}g5-=Bym-_% z`=7%C>zxJL|9msNSMXnbQRayy^)nr>EU7olTHqoc^vG(B%bo(Id*|kR{84!`z2x6n zZ`;PkbrPvd6U}A>Y0chs_tyHmLi6kw6c{>JvYiQ=+MTFTx8d*9^V|R0+_75oZt9or zLetinU!`YMvFyLCb8XxElhO0{v2rTkNR$jMW7~4}*8a52+MC^J%KMbxPN-JRb2RNP zEsp0ebAPS3=e2G53#Z$XZAI6Yd=YMjqtrV%Nn6esuj!jIMi}Btw`sohxwi1&U@}K{{10Q-!s%eVxF#kF6*2U FngGM>p?d%T literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanosp/test_sign_tx_refused/00009.png b/tests/snapshots/nanosp/test_sign_tx_refused/00009.png new file mode 100644 index 0000000000000000000000000000000000000000..51264fc134d7afd8d68b7b8c14ae4f97980da6ab GIT binary patch literal 471 zcmV;|0Vw{7P)tc-6 zkr2X^mb~M4b^~5ijeZ(>8xnmk1JE3OzcFwo##oJV`LF#HgEdFLiovJb^ag(y;b#7+ zj(fZsyHO<>yC8h60DtW0cPn_I1;(|jr0yyrvuH_=C%uW}2P&#_esoeqW&8UwC2 zmHLJL{P$BQh$x%%|41^0Wk!1%@&p;uDxH39CfV%eXYHji$*57wsY#(|4D$Oi?CM;Q+PO+?**-d0001HyY&ud$=fGSlmoDzpYjoT z^L4au>TkHNyscI3??j3dDo%@+7b~6pDyd+JRAmK}uFOr>?}L`)0&uZ-X+L%P3mMU! z@J+?b^tDpiUv33lDPET0>AWEAZZ&)bwWx@uAS}q^uLl4C00013%^y+aLEWEV%_IN- N002ovPDHLkV1kVz*&zS` literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanosp/test_sign_tx_short_msg/00000.png b/tests/snapshots/nanosp/test_sign_tx_short_msg/00000.png new file mode 100644 index 0000000000000000000000000000000000000000..76560b8c0f3bd5e50f8a56f6718ab7bb80ca024f GIT binary patch literal 420 zcmV;V0bBlwP)x`j)$#)l2xD5^B9vd+L007`}(Kn1u*nQ(gU3$CFT~(<~$DUkDezhFAAUQ3} zEKr}6Hrvhe=ha$+4lgrCZz=Szj${XZ9Q$FKKXKgpgqT`u@~eeA0k6)fAa3Q_A}8il z^uw7iLF&k@gUxaT;buTjUb6liK3fL^007{*`rK#IpIDufBN=yN2{vMCW3^Z{TSo7C zG?k$=t7gHh_U-E*`i$8N8(*}VU8g!6mXW3`F~dq*^#u^03HVb006MuSJZ=Z&gVr+snzlZ z-_ZkjyPxO*969Hd(l!0Xt?T-HE$+35#%|}8_I(4+(4>^AkrKfwThhm&;$HT#AF)jQ z8&Gw{!gw>v9F#4CakL+?OmG6q;!`a|dZw3wJ14IWWh)apbNbK4wkSc}xQkmx{jrHk zH91Tdo0g#CGue$vZM3wiiukqaBk(+t5+g(FZBc^WENmydSZh5B0PrFzud()+-IvZT zV{R{dyw^*tf`Wx@#74G1vs)zN8-wms_H1qU7A%(B6VN(M>mHn4eZ+OQzc?(?!??QX z3(;o*_XOxOOMU&6Z4132tOR*Xv8hT`b`IQ^?RyyKXDZy@xseGNskVP7J_FqAqrZ_= z4?B&2)ZO%ho()Ln*Y-IhbTYm#SvH1&8~?}-38+8!4bea4LhLXGn&9KrRVZ91$mGBk r;ROHy0000000000000000Nnfn*zh%{4hVGp00000NkvXXu0mjfbfC*7 literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanosp/test_sign_tx_short_msg/00002.png b/tests/snapshots/nanosp/test_sign_tx_short_msg/00002.png new file mode 100644 index 0000000000000000000000000000000000000000..53ae65195fbea5b281a1bc1a80351dbf1cd79ff8 GIT binary patch literal 364 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|=-%ba4!+nDh2#AYZeBfa}G~ z%X2sUSKTFSd4J{-YHcY(QO5;J{<~e9q=7F?O4)!WO}6UUdH! zS+Hz=(4})vCM2-VD4nt3W%LdvkyzeG%km#`1t_mu*zR}#jNB{EKZnW}g5-=Bym-_% z`=7%C>zxJL|9msNSMXnbQRayy^)nr>EU7olTHqoc^vG(B%bo(Id*|kR{84!`z2x6n zZ`;PkbrPvd6U}A>Y0chs_tyHmLi6kw6c{>JvYiQ=+MTFTx8d*9^V|R0+_75oZt9or zLetinU!`YMvFyLCb8XxElhO0{v2rTkNR$jMW7~4}*8a52+MC^J%KMbxPN-JRb2RNP zEsp0ebAPS3=e2G53#Z$XZAI6Yd=Ytc-6 zkr2X^mb~M4b^~5ijeZ(>8xnmk1JE3OzcFwo##oJV`LF#HgEdFLiovJb^ag(y;b#7+ zj(fZsyHO<>yC8h60DtW0cPn_I1;(|jr0yyrvuH_=C%uW}2P&#_esoeqW&8UwC2 zmHLJL{P$BQh$x%%|41^0Wk!1%@&p;uDxH39CfV%eXYHji$*57wsY#(|4D$Oi?CM;Q+PO+?**-d0001HyY&ud$=fGSlmoDzpYjoT z^L4au>TkHNyscI3??j3dDo%@+7b~6pDyd+JRAmK}uFOr>?}L`)0&uZ-X+L%P3mMU! z@J+?b^tDpiUv33lDPET0>AWEAZZ&)bwWx@uAS}q^uLl4C00013%^y+aLEWEV%_IN- N002ovPDHLkV1kVz*&zS` literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanosp/test_sign_tx_short_tx/00000.png b/tests/snapshots/nanosp/test_sign_tx_short_tx/00000.png new file mode 100644 index 0000000000000000000000000000000000000000..df51419d9880ff10f1f24cebe779f11ff7ce27e0 GIT binary patch literal 419 zcmV;U0bKrxP)D$(iko|UTF@u&Yag{)@)mN`1iGamjW z?-@|#I%DcL`R;-Wx1m8iV&w2DI!Y>*e7y)ffN(0IS^hR>UWBs}p1R_IuO&=RwhCUX{fYF*|8$ z-}7I$&Jfhf0$I4MAmWJn3INi&qfcFT$NR000000000U?jMqbF~2?)b|e4* N002ovPDHLkV1ho3w>JO) literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanosp/test_sign_tx_short_tx/00001.png b/tests/snapshots/nanosp/test_sign_tx_short_tx/00001.png new file mode 100644 index 0000000000000000000000000000000000000000..bf3675325f5a1fd84129d442f1095c240a43bf90 GIT binary patch literal 439 zcmV;o0Z9IdP)HlG=lPMqB0;y?~2+*_PLDN-4KUaZy*pT^*t9T((q)UFUTuVyl}!puhg^?;SDW z4zR`d{f$S;uZz5&l=k`{vy#m`PM`7Ade?+v+_^rLSU<_5KTY2O-Ad$0!WrpfAHwQ6 z`HSy`&V#-6nXEgYvw(M2*qIN{X$G0-FH;FM(O--`h(s2O)Cn?s@F>Cy0000000000 h000000000y<_Cd%YewKv4(b2^002ovPDHLkV1ldF&nN%@ literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanosp/test_sign_tx_short_tx/00002.png b/tests/snapshots/nanosp/test_sign_tx_short_tx/00002.png new file mode 100644 index 0000000000000000000000000000000000000000..2ee258e0cf1cfcd9f50e4b100f169b7b9f58db97 GIT binary patch literal 571 zcmV-B0>u4^P)w0000001W4Aiq{w;y$&Jh z-INZ}TG1vrVvI6nZq4@QXLbO8Q2J>7raK_U7($SJ6jRa;n<3W0V!1irBb_O*TwnDu zW+$~H>liaa9dz%VaIpjAnC-c4<#$&3axnotkOimMzh5v4E=rIbe5-Wm_b4hm6PYjp zRBF?EOIm+>Cnb9nvv@!QWI`RL*hL9?GuuwUm}&+90H6ZPJ!Fa7%aTwMm2ApBsie~? z06$EYB1rR5#2?u%KPBbNtCpRGbcA@(v)$?BR-Qn7A=Q zEV0iQu_nseX=LO+m^=aJavMD6A|vDBC8+BLv=kgmpX||{{Z)r-vPL%R!w%s>dR;BU zhqxWfWngY2zK7@GWMcCi?me83=oNF|mbX+PpA?deIp~U)^xli3Q}i)my!T}=YNEAi znl5yA(SouMn;ieY?_6n??61XVr=_D>y))~gHfBdCDyA-ZS}H)5oN3WJvrb#ZY+(&C zj#gh2mBv*yU*_4+R#~$Yw~?%|1CEb;)+%f1PTK7dW-6oozbXiJ2(#6iwmjE6&pz44 zs+ix1t5SZOr#paU0qf;O?6Cs?0000000000000000002kn_oQH{fHIiONamf002ov JPDHLkV1l6R`#t~w literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanosp/test_sign_tx_short_tx/00003.png b/tests/snapshots/nanosp/test_sign_tx_short_tx/00003.png new file mode 100644 index 0000000000000000000000000000000000000000..ebcd22e7eb47dcdb668c9c3ccc26602185db2e0c GIT binary patch literal 889 zcmV-<1BU#GP)mwhHJH?&ntOSAeAjqK{W^9AfRRA-685W#c={$J*MeUEjx!72rOqN4APV z;L^6DTC?$WS4{a!XrO)qUTfdJtn7;}s=n6fLamhAbnmh~1-YTIMka#x-B=!XvbTk7 znE-bWcYPBX-C}%OX)T<-aaJ61-81j!AIQ|yZu0Qkxjz9_JrP0(@!QGOP-f$WHAP!E zI+WS-b1F-?6HD(S>{N#jVhr>UA(-ROq0+{Gwnf2rL{0D=HQ(u3%!#h$eM$# z*zh7Xl-cJ2OJ5Oh`*?M;8QooJYGjmGW{kM=N2eFq<|ddD1^W+-bP9Y9e{vPgW#dAl zvr=eeaoPB@l+W?=$&DsbM4>9lB$Ee3(1k`_{jsX6Xad}nx4hOE1t}ejD>U*(+_AJ# zS32#B0iRI^=EOK&OJP`3({N5_jGLC%+FjEYIeM#33AQ4P@zX#P03LH-Ilq4$-P_5G zIVGdIsTmkupUnNz)^~sqLI@$m?}SoAXYbHKU0i0_d8$@2wSb>A0`3@@lQ0EVIvKIB z8P~MQ*)lghc=zn$c4kS83{S8?Ew_b~y4dklzQSQ%7oE4=Z9-f*|8(c)d+EorrPd)hok)p-m2u z5db^Al*LQ=-U#+;(Iw2){W}@gIoKNV7Tf5oA2I@VXka)(2qA_K&Xf+Is3`#e005W!3(U1`Tlt)G4$K*q zZBJOTl@2%g>mQZJ)EVY|q7oHNzvr{XR=@dd^|o%8$3*?Rl+u4xBA>cAWTVxRb8eP` zRhrTwLmF25igoOWUjb4nL|w1Cv8lB>E7e#hN>0+KvsvsCk6!`mR82=q*eTrMZ&^`2 zwRRSkbxf@I0od2Ryi(O)ohpz0&#|bU!45p#tCpXF)Y8bto(jqfW5}#@Cd#Sqjfvle z$}%P6%694^+=N)`NsV%PSO>}|=Q?!3_4$SNbK?_|{H~Az2;PDgo$Id;Jb^r?S4&<=)~{JQpF;ayeD~jO zL(fhP|5Vt&4V8z@2U?p*zhgZahPR;y<$du)dk(Y6RR1zcsj2?O7=t@;7P`|xkr{)f rC@%m20000000000000000Ivc9>?oEq$Tl-t|*Oy!8EPuP% zyLvbjYKhezX}&UWX$#skVHW^yh z-nQmvU`WuPJU9OS)^{E6vfA!eCR8!hD z#wdJj=S@S#rAMx_Cj8)UnW?dUvF=NO*B$LEyjPnuoISSqKC2(w{|_fpn7qpu<*%!G zu3I3{?x^-FjcuXYuVW_~)mKeWzn19VA`bL5GKhG_x=}%oX^YD20Fbb!tDnm{r-UW| DfRC5b literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanosp/test_sign_tx_short_tx/00006.png b/tests/snapshots/nanosp/test_sign_tx_short_tx/00006.png new file mode 100644 index 0000000000000000000000000000000000000000..f9a909e9cbc5a9f314ac31ab796bd55e03ad0c38 GIT binary patch literal 390 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|{t1ba4!+nDh2#Y|&u_9=E`) zm*;Nyuex!%-HyWsZbD^D9LvAk9JNrK$NxE52c%8syJ#(=l9J`~Uj|D>LQhuNUlji! zerLs=d6TLI?=wvM)u*>{RqJN$nOb!mTDA+G6mczmr{q_jnH*YQv2k0f*(=6UX%FLN z*XKOAbvtJ5<&`xXd!-g!ySKc3*TkZ8;d%FdS%;}}f03?fi9`H%}MVUh6xgS)Ofw;HJTj z(yW8+-)-M}{y2Pr;h= z)gC>4F!J=Ich#b=r)-{*#edal`JqPD?Im@)&sQ(vPiyn}by_2E^1q}ljw)^oJmdKI;Vst07Sg2g8%>k literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanosp/test_sign_tx_short_tx/00007.png b/tests/snapshots/nanosp/test_sign_tx_short_tx/00007.png new file mode 100644 index 0000000000000000000000000000000000000000..53ae65195fbea5b281a1bc1a80351dbf1cd79ff8 GIT binary patch literal 364 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|=-%ba4!+nDh2#AYZeBfa}G~ z%X2sUSKTFSd4J{-YHcY(QO5;J{<~e9q=7F?O4)!WO}6UUdH! zS+Hz=(4})vCM2-VD4nt3W%LdvkyzeG%km#`1t_mu*zR}#jNB{EKZnW}g5-=Bym-_% z`=7%C>zxJL|9msNSMXnbQRayy^)nr>EU7olTHqoc^vG(B%bo(Id*|kR{84!`z2x6n zZ`;PkbrPvd6U}A>Y0chs_tyHmLi6kw6c{>JvYiQ=+MTFTx8d*9^V|R0+_75oZt9or zLetinU!`YMvFyLCb8XxElhO0{v2rTkNR$jMW7~4}*8a52+MC^J%KMbxPN-JRb2RNP zEsp0ebAPS3=e2G53#Z$XZAI6Yd=Ytc-6 zkr2X^mb~M4b^~5ijeZ(>8xnmk1JE3OzcFwo##oJV`LF#HgEdFLiovJb^ag(y;b#7+ zj(fZsyHO<>yC8h60DtW0cPn_I1;(|jr0yyrvuH_=C%uW}2P&#_esoeqW&8UwC2 zmHLJL{P$BQh$x%%|41^0Wk!1%@&p;uDxH39CfV%eXYHji$*57wsY#(|4D$Oi?CM;Q+PO+?**-d0001HyY&ud$=fGSlmoDzpYjoT z^L4au>TkHNyscI3??j3dDo%@+7b~6pDyd+JRAmK}uFOr>?}L`)0&uZ-X+L%P3mMU! z@J+?b^tDpiUv33lDPET0>AWEAZZ&)bwWx@uAS}q^uLl4C00013%^y+aLEWEV%_IN- N002ovPDHLkV1kVz*&zS` literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanox/test_app_mainmenu/00000.png b/tests/snapshots/nanox/test_app_mainmenu/00000.png new file mode 100644 index 0000000000000000000000000000000000000000..79857a0267ee414b6d04cca997d48106d64ba911 GIT binary patch literal 471 zcmV;|0Vw{7P)#bpS7_dOvl2n-YDN3F!8|Zw}1F7^_|`|7^d-WZmAca`5Sx-r#o;?yf)8 zamTB%jcSo;Cxq7w@YDAG;F6%vdkN~UKMPCH+44GbgZ0O61|;n~NJs3(zH0)OyObgT z0C=#wjq|e8y=uL$7S9x$jZ$lEcdNB^nwK)>H6PNyiQd|Lm0PfUPFtnWXfpPxEGL>bcmBgvGOE8^+M17u26I_+AT#bzzP>rah~%<8qgG%2*J4WoW2uMlMt z9%lVFg?Z36N3j^!4wH0b{3O8WBJ4_G2v2AEUeKM8006+%PQAmq$BV*J0ebACz0uB~0+iy*OAtRT7 z96rVI*8>0m0002o%^$0xJh2#?r-}do N002ovPDHLkV1fi5-8TRL literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanox/test_app_mainmenu/00001.png b/tests/snapshots/nanox/test_app_mainmenu/00001.png new file mode 100644 index 0000000000000000000000000000000000000000..d885fe67b493f41a049111c376b0642375e01aed GIT binary patch literal 381 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|@9dba4!+nDh2#VBTQ`0oTA= zYd8E?-8j8&fs#o>@KLS)=XXAfTRT=HusH{TbU}g7)F3a-S8;bft$lZ3w$q*3_J`hg z8_U-mnp=GD&g9=Z#tBjx$6u%)=XtTbp7&S9(T-F$o6dN)kjF*|=HInX^UTmYv`^n@ zTGo!+b`LBsey(4R!K}J!g3#*?LJw{G{%Jh=7Z{a$ z@Qa4in||w+A53@uz0O+5=A)i}qVsjccKt1jU;a~nT={iNWa2lOLJ9G-axcy2ci6Yw zJGK8;|K)4z{%?Hwex1}!Hyehx4-e10wM|KRecCS`j^qn^Z9nVcHOgyGA2Pha@9;i; z^+Ag{pMFi|i)>jPs@2k+7%MCO@aoYE&lI~qe3t#kRUO9p%i-7D4{Vo(SYScXaQ*{x W@T*I;C2r!^L1Lb+elF{r5}E)u39PmN literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanox/test_app_mainmenu/00002.png b/tests/snapshots/nanox/test_app_mainmenu/00002.png new file mode 100644 index 0000000000000000000000000000000000000000..7e1a28c65f77030ad7ed3d1b28cd5e3f15ba7106 GIT binary patch literal 350 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|>}Bba4!+nDh2VAm1Sc0oOp2 zcP)SQGrv7@7dB#Ax;1NN`1_y2CW`q9TE3h>O%SkS)9p8`GKpz-KhF7lQv2tf+HXwv zwoUt2p|$2XQ2a_>+0ieP^B6B>Kk7Q0t{B5`_k!(1rUE9l%e;4m^%&F>jDP}rs}CH# zqJH3vO4+m*`~R8U`(0tR;2@W(*#2FmF5jmt^1HI6-YCmJI5uNh?}U{H{RQ>E8E($n zyhZuCz(=*1rhiF~5?`x-(_7IJ@h&D?`RS?0@9k2b98t~ZC}+BL?y-H?&7ThJ(tG}B zJ(tn?E3$#1`|Ofkx~gfDCAn`ki7d8JyT$Tg}e1&P( zg<|UtodolD7x+GLS#VfwY~I79_sp!SLEQG|Hc1JStDnm{r-UW|D(8I) literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanox/test_blind_sign_tx_long_tx/part0/00000.png b/tests/snapshots/nanox/test_blind_sign_tx_long_tx/part0/00000.png new file mode 100644 index 0000000000000000000000000000000000000000..2d20155f3589238276c8e24b49401b23d82327ec GIT binary patch literal 580 zcmV-K0=xZ*P)`z`V0000000000001B&=bUps z9fgVS(*b-sffG>Ye)J-U$}WFjXL?HM zvPfKrT>&Yja8JA=SOS&{eYlS(HdTdDsp^TZB9jEMy%UkVgGfiU{3oj_WabHFPtxM`q$vP_nRG9A-D%l z^WDZx{_eQ^(IL>*QV4b+^E~c#COrG3xLyPR0DvbJ8*6E1@b{8mq>4dfpiH0Z zAG*eh7)`|5L|T&LMe^l@{N!O`;JsL3{H?*+wzh_)&~v@$vrA|qGW~fG7uoiT+<9FF zDGykVsRE3B?6)jwr?8~3j3_)iO#*~tkY_A*Sp~C$9V1;{b-pRA2tB0dy6c;6SAcxC zkvNNttcwFIG%4G;EI&(_y^O&B_;*~4+X9xL!`#aa4Fo(_0000000000K*KLZfh4pN SdPXk*0000P@)+k+@4A&=7?{fRSKF|MxIuN$a_GV1=zB000000000m!F%t$-<`#P z_wEE%vQ_%vISq)_ch2q2WQef_)Mgl?)faOO2(lj7t-hFRKrC@Ay6NhR$ZK~3Gs;=W zX!XV12ne!r+pWHB=HBuH005whH+GjgDX+rn*S38WrrN2Rxx$weQc4qhKm+7A`FA{J zcR}y}#Bb9}hsS$4=MIw5lV8*`0vcD#uSy(@0I9WQpExMBCH7C*Wb;X{g_o*lE_zbk z16Acc(K++<%=nrc`8j{c4%wa37@Fw>W#;Ar006+H{I7U2JLrki2tFEZ?(rtA+Q=-Q z@|g1NT!_WBRa(t-F*Q`>!)Q`$C8ht|*!byXkp4^*Dd!&<+|ewL)5zJGx%mB8uW+%Ln&!O$V!?brmm+X(S$vUI< zoB94AolJf{;7Lq=LZ+>@s<=N0000000LXm-^5SD-<|qUF00000NkvXXu0mjfQGncL literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanox/test_blind_sign_tx_long_tx/part1/00000.png b/tests/snapshots/nanox/test_blind_sign_tx_long_tx/part1/00000.png new file mode 100644 index 0000000000000000000000000000000000000000..3d6158d4c04fa1a2333673e69b658d4e67d20da6 GIT binary patch literal 430 zcmV;f0a5;mP)i<1-XiK}8D3vUw00000007`AUfu(EpNO<} zt<`ZPpGcVi9eOQe8uBHeMPG-z`(g@z-UE1(33R%+XC)$f{uw__A?ppgHKq=#s|v(UBg&(pt4v5pgf7jQ`_!>KkG*L0LvlZd2HeAYU_1qxo~Jr@+Yv0sUA(Q=Wouv982|tPUcR?0;*+)2g=2X7z3KPY zLD5!ThVw#9FPgUde7ZY-%sOk_M?W=%mhF1&5gUzWwiI^j3gcqKpu^#pj9trc zy|x=)v6*wOn_Gi*N$E?e&@|t|@4e>Uyna};lXI?TbkSzBIGR6eFDaM_&}y1Ld(Bx& zPns^3lJxHqBQ2zOh1&ASCMev#(j$)SfM(@Jb(&6=@ohGcyYRsZb;qumyt&O}-K}#l z1r0SB>Xog$J}B-BX8oW)w=7cE$my5Cr3qjTa3#Z*S4dqF zRZiR(;q(o1TJ8NpM*3!$qrqtl|2yjwuqzTFgb)I%q0FfZ3yN+DqnH9k0cb&PVN-&Y zA}p6;v51LzfadTE>bPPd^AOpOPJ5snn8LvW`?hx*V=fF_#B4uLTuC;sqXoabyOo%a z%h5xukA61=4f$m%FUCAD0alTZ;^S?u)AZ9y4z37sdOz`O-U0Zh6-<+J%NRxFX?7gl zH?3=by6uq7&{Oxp{c~?~P>vNe(tFo06D=RJrQHE#uE>NFIjetriVmht%?TQJ)))4E zKMQrXg2bi^goCWnzlJl^8vV;?4xU6==t(+*tT{M}9p3)8q3)p#oaC}6ST>c1j)wN= z=H7;^{ko8h#H|)Z%api1nuNK_xPoHTe8OO<%!`zZkqlk#$m?Fs&d*Y|3oM_b*qmch z3vzco_$V{c65gE7<6hdknQHE~Z&|r-vlEbeq9X{-TCfdCgN;&B52X#V8;N~rVu-BS ztZ40!J)$O{yBLSWKSnVH2Fdg~oxaE~`1nXL{Rv=t!u&un1TeU_|Bu7&fcL|MPzuf! zqq*45M5g~E!;OUTYwIxa?|QokA%qY@d@D<8D7bk?_eodUOz@D0h0LfX2m=J~HcaL; z*%dilFRL_CU!;0Qtw2L8ZMteGQxn&zAAn7!7mSyP88vj{tbWKn<-srpZo;E-W;(AY zlN#g&S$jI+P!qswjW`LoLME;}8rX$_CgoUCsyg^}bo9QRXt+0wb%WhH{4`wsJe?Gx z?`Py8rw_={jbk?^oCG5wlk^BqlZki-;85Qs_!KOm^;Gp=_XPXX(vgQvxDSZ>7AJTL^8j zI;U8GSnZ|<=dn}Pr~|7j(vyii8tgIhy-Z2K6i)yE003JJ^@SQ=kYU}VL|PS1RoPM+ z?DH)$sw$f9!+$`Qry@FmFD^18&Vz^ViP}<~+M03E^UwSjvB8xxU2reN-`9Msw>g$t z`ikegJ$Q1oB~HQy+#y#!G0zS_rkT2|YpZ%mf> zQ^v;cKvm0@|9;QzjobD?rhA(B)~5UVB9cqhlgLW7n12uGzFDzPF?Wf6K|b9@;5(qq z7b%YNGvV3NRD2^agOPGCeT!HQ&MpsV2j{bBC7n>3Hed!B(cgv=YD9lC$iXK;75XHV zAR`A$*&W_>^Z5b`2r(smchAAvpQT8>kV%OV$&fW#5%)z(CRMUy)x9TdG8vR=W86-4 zpqe@PZ`|P(T;-Q>sp~o;B4yCdrxyEF5^!p8tpZV1q>S6__(Aavh?gLFRlX o000000000000000004Xye~dBMuZ`*r;{X5v07*qoM6N<$f?QTUWdHyG literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanox/test_blind_sign_tx_long_tx/part1/00003.png b/tests/snapshots/nanox/test_blind_sign_tx_long_tx/part1/00003.png new file mode 100644 index 0000000000000000000000000000000000000000..2c8ac7e6eb3b7baac0e31a5c3239e1969c98cab9 GIT binary patch literal 404 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|@{)ba4!+nDh2Vv{17GkHf_+ zm*;NyubQg=_d=q?VP{E|8}~k6y(MKhvAqMRhvD+xJ<5!EuDu?o7i{YA%~X=`hj%CFSd4J{-YHcY(QO5;J{<~e9q=7F?O4)!WO}6UUdH! zS+Hz=(4})vCM2-VD4nt3W%LdvkyzeG%km#`1t_mu*zR}#jNB{EKZnW}g5-=Bym-_% z`=7%C>zxJL|9msNSMXnbQRayy^)nr>EU7olTHqoc^vG(B%bo(Id*|kR{84!`z2x6n zZ`;PkbrPvd6U}A>Y0chs_tyHmLi6kw6c{>JvYiQ=+MTFTx8d*9^V|R0+_75oZt9or zLetinU!`YMvFyLCb8XxElhO0{v2rTkNR$jMW7~4}*8a52+MC^J%KMbxPN-JRb2RNP zEsp0ebAPS3=e2G53#Z$XZAI6Yd=Y#bpS7_dOvl2n-YDN3F!8|Zw}1F7^_|`|7^d-WZmAca`5Sx-r#o;?yf)8 zamTB%jcSo;Cxq7w@YDAG;F6%vdkN~UKMPCH+44GbgZ0O61|;n~NJs3(zH0)OyObgT z0C=#wjq|e8y=uL$7S9x$jZ$lEcdNB^nwK)>H6PNyiQd|Lm0PfUPFtnWXfpPxEGL>bcmBgvGOE8^+M17u26I_+AT#bzzP>rah~%<8qgG%2*J4WoW2uMlMt z9%lVFg?Z36N3j^!4wH0b{3O8WBJ4_G2v2AEUeKM8006+%PQAmq$BV*J0ebACz0uB~0+iy*OAtRT7 z96rVI*8>0m0002o%^$0xJh2#?r-}do N002ovPDHLkV1fi5-8TRL literal 0 HcmV?d00001 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 new file mode 100644 index 0000000000000000000000000000000000000000..19c9a3e18c72d20e0070be1ba192ab60f82fdea9 GIT binary patch literal 375 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|_WKba4!+nDh2#G+(oVKx^Xd z67_fWo|~uJO_;=~6n2E?_@Dd1N1Y1Vx~Hcy0(C(^!|gqbtS_8D^XYwQEOT{HYYJ1% z3)`b6FH{xW@3-%c(s(F)x6#ja!P7_UPM!Jl>$2UH1y;-gY56m>`To0>vx#gB46ynFTY``2@GtW@o_^!K$$ zR{veOb+4Ja&w+Fg?W@aozjdGVcJu1~aJ`SqgDL|*zIi^~{&Ad1^(%u*51)okpT5_0 z`QPVmuJIMC-py|{-}^7PRyt~Gy1!xOuIOy`S`WTsI*y+ub}R_rU-e7o_u;(cv;#Kg zLa)!)zI~tTQOkCw;Yw#x@T(hI`dVzsuN=INnYpz$-u_m9&sPE#2n-AcEA_9{iLuVp R|LhGC^mO%eS?83{1OQggqS*id literal 0 HcmV?d00001 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 new file mode 100644 index 0000000000000000000000000000000000000000..ee8e82f64e1932575a4c15b5163b1541ec48f760 GIT binary patch literal 390 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|{t1ba4!+nDh2#AYYRKPeY=~ zy_VndE6YC~+@Z6ywP|YLr+WXzH`&UP&sq8cH63^+$Vg(Ru$-c%3NM9>!CDOm&U!J$hSoLikb&Fsv%1G+uj-4mE?$S(zn}4KeHX_8v?FtmY@)pR=})O~-vmp!QoafAy#CPY z`qSK#d-;=>72UknUD5hrZ=Yz;pQr6JI%cpZp02o7d2`cz50y*jH(C|`On3bFX8o5B znk$-9uiD&uI5qZ>hSSoZxmw##JlicVIcbem(yKUUW_I4L5t!vK>cvdaC_iZW!eI&HtE0&k-#Xq5FrG gC&mFCiwqv*-&=d%W8Q?g`%)lbPgg&ebxsLQ0925(-~a#s literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanox/test_get_public_key_confirm_accepted/00002.png b/tests/snapshots/nanox/test_get_public_key_confirm_accepted/00002.png new file mode 100644 index 0000000000000000000000000000000000000000..2d42b36293afecb457d12fe51c3cca967614aa28 GIT binary patch literal 903 zcmV;219<$2P)cX9)q3x*tK)CK)e1k`6@An(sCPr}-AV*rQj5W9 zyPYFo4 z5U#u0O0=*xaU=|+VMy*7u-Eb}ppFoXN3GU>$wnd@)>g)R2TV6ti|%E)$CWo0kg3Nz zPA3ejn%pbE3_1*4M;?&k!SwX7yr)9(vLI@#*kdVL)Ro}5v7N&C?bHp73)hbj4aktVx zW?LnenpIL~Jlf$Frf*cJ;?@tVP*rvu(6P?C=W3}nEdwf*|D-2p6)E{B_MYlj)F3ys zZAxhE(71TiRQDy&-vvunk`qsW^c2fj!}gW4L$y4dLU@+X6K*WHd-~454Q&SuzECjh zR)*bKYM^^snSfncdp`SZx4)ZpPbJXzfKhJ60t~lQ|1*{>T1%{+HQ|e z?H!HOtu*zk@xfDBZC`%2_dJZ1%x;fSi=ve6X!r%}1?D0w% zVV0A|#VN=>WEU400000 k0000000000007eb0(8dr*=g`t=>Px#07*qoM6N<$f?xyaIsgCw literal 0 HcmV?d00001 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 new file mode 100644 index 0000000000000000000000000000000000000000..53ae65195fbea5b281a1bc1a80351dbf1cd79ff8 GIT binary patch literal 364 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|=-%ba4!+nDh2#AYZeBfa}G~ z%X2sUSKTFSd4J{-YHcY(QO5;J{<~e9q=7F?O4)!WO}6UUdH! zS+Hz=(4})vCM2-VD4nt3W%LdvkyzeG%km#`1t_mu*zR}#jNB{EKZnW}g5-=Bym-_% z`=7%C>zxJL|9msNSMXnbQRayy^)nr>EU7olTHqoc^vG(B%bo(Id*|kR{84!`z2x6n zZ`;PkbrPvd6U}A>Y0chs_tyHmLi6kw6c{>JvYiQ=+MTFTx8d*9^V|R0+_75oZt9or zLetinU!`YMvFyLCb8XxElhO0{v2rTkNR$jMW7~4}*8a52+MC^J%KMbxPN-JRb2RNP zEsp0ebAPS3=e2G53#Z$XZAI6Yd=Y#bpS7_dOvl2n-YDN3F!8|Zw}1F7^_|`|7^d-WZmAca`5Sx-r#o;?yf)8 zamTB%jcSo;Cxq7w@YDAG;F6%vdkN~UKMPCH+44GbgZ0O61|;n~NJs3(zH0)OyObgT z0C=#wjq|e8y=uL$7S9x$jZ$lEcdNB^nwK)>H6PNyiQd|Lm0PfUPFtnWXfpPxEGL>bcmBgvGOE8^+M17u26I_+AT#bzzP>rah~%<8qgG%2*J4WoW2uMlMt z9%lVFg?Z36N3j^!4wH0b{3O8WBJ4_G2v2AEUeKM8006+%PQAmq$BV*J0ebACz0uB~0+iy*OAtRT7 z96rVI*8>0m0002o%^$0xJh2#?r-}do N002ovPDHLkV1fi5-8TRL literal 0 HcmV?d00001 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 new file mode 100644 index 0000000000000000000000000000000000000000..19c9a3e18c72d20e0070be1ba192ab60f82fdea9 GIT binary patch literal 375 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|_WKba4!+nDh2#G+(oVKx^Xd z67_fWo|~uJO_;=~6n2E?_@Dd1N1Y1Vx~Hcy0(C(^!|gqbtS_8D^XYwQEOT{HYYJ1% z3)`b6FH{xW@3-%c(s(F)x6#ja!P7_UPM!Jl>$2UH1y;-gY56m>`To0>vx#gB46ynFTY``2@GtW@o_^!K$$ zR{veOb+4Ja&w+Fg?W@aozjdGVcJu1~aJ`SqgDL|*zIi^~{&Ad1^(%u*51)okpT5_0 z`QPVmuJIMC-py|{-}^7PRyt~Gy1!xOuIOy`S`WTsI*y+ub}R_rU-e7o_u;(cv;#Kg zLa)!)zI~tTQOkCw;Yw#x@T(hI`dVzsuN=INnYpz$-u_m9&sPE#2n-AcEA_9{iLuVp R|LhGC^mO%eS?83{1OQggqS*id literal 0 HcmV?d00001 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 new file mode 100644 index 0000000000000000000000000000000000000000..ee8e82f64e1932575a4c15b5163b1541ec48f760 GIT binary patch literal 390 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|{t1ba4!+nDh2#AYYRKPeY=~ zy_VndE6YC~+@Z6ywP|YLr+WXzH`&UP&sq8cH63^+$Vg(Ru$-c%3NM9>!CDOm&U!J$hSoLikb&Fsv%1G+uj-4mE?$S(zn}4KeHX_8v?FtmY@)pR=})O~-vmp!QoafAy#CPY z`qSK#d-;=>72UknUD5hrZ=Yz;pQr6JI%cpZp02o7d2`cz50y*jH(C|`On3bFX8o5B znk$-9uiD&uI5qZ>hSSoZxmw##JlicVIcbem(yKUUW_I4L5t!vK>cvdaC_iZW!eI&HtE0&k-#Xq5FrG gC&mFCiwqv*-&=d%W8Q?g`%)lbPgg&ebxsLQ0925(-~a#s literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanox/test_get_public_key_confirm_refused/00002.png b/tests/snapshots/nanox/test_get_public_key_confirm_refused/00002.png new file mode 100644 index 0000000000000000000000000000000000000000..2d42b36293afecb457d12fe51c3cca967614aa28 GIT binary patch literal 903 zcmV;219<$2P)cX9)q3x*tK)CK)e1k`6@An(sCPr}-AV*rQj5W9 zyPYFo4 z5U#u0O0=*xaU=|+VMy*7u-Eb}ppFoXN3GU>$wnd@)>g)R2TV6ti|%E)$CWo0kg3Nz zPA3ejn%pbE3_1*4M;?&k!SwX7yr)9(vLI@#*kdVL)Ro}5v7N&C?bHp73)hbj4aktVx zW?LnenpIL~Jlf$Frf*cJ;?@tVP*rvu(6P?C=W3}nEdwf*|D-2p6)E{B_MYlj)F3ys zZAxhE(71TiRQDy&-vvunk`qsW^c2fj!}gW4L$y4dLU@+X6K*WHd-~454Q&SuzECjh zR)*bKYM^^snSfncdp`SZx4)ZpPbJXzfKhJ60t~lQ|1*{>T1%{+HQ|e z?H!HOtu*zk@xfDBZC`%2_dJZ1%x;fSi=ve6X!r%}1?D0w% zVV0A|#VN=>WEU400000 k0000000000007eb0(8dr*=g`t=>Px#07*qoM6N<$f?xyaIsgCw literal 0 HcmV?d00001 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..53ae65195fbea5b281a1bc1a80351dbf1cd79ff8 GIT binary patch literal 364 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|=-%ba4!+nDh2#AYZeBfa}G~ z%X2sUSKTFSd4J{-YHcY(QO5;J{<~e9q=7F?O4)!WO}6UUdH! zS+Hz=(4})vCM2-VD4nt3W%LdvkyzeG%km#`1t_mu*zR}#jNB{EKZnW}g5-=Bym-_% z`=7%C>zxJL|9msNSMXnbQRayy^)nr>EU7olTHqoc^vG(B%bo(Id*|kR{84!`z2x6n zZ`;PkbrPvd6U}A>Y0chs_tyHmLi6kw6c{>JvYiQ=+MTFTx8d*9^V|R0+_75oZt9or zLetinU!`YMvFyLCb8XxElhO0{v2rTkNR$jMW7~4}*8a52+MC^J%KMbxPN-JRb2RNP zEsp0ebAPS3=e2G53#Z$XZAI6Yd=Yj&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#bpS7_dOvl2n-YDN3F!8|Zw}1F7^_|`|7^d-WZmAca`5Sx-r#o;?yf)8 zamTB%jcSo;Cxq7w@YDAG;F6%vdkN~UKMPCH+44GbgZ0O61|;n~NJs3(zH0)OyObgT z0C=#wjq|e8y=uL$7S9x$jZ$lEcdNB^nwK)>H6PNyiQd|Lm0PfUPFtnWXfpPxEGL>bcmBgvGOE8^+M17u26I_+AT#bzzP>rah~%<8qgG%2*J4WoW2uMlMt z9%lVFg?Z36N3j^!4wH0b{3O8WBJ4_G2v2AEUeKM8006+%PQAmq$BV*J0ebACz0uB~0+iy*OAtRT7 z96rVI*8>0m0002o%^$0xJh2#?r-}do N002ovPDHLkV1fi5-8TRL literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanox/test_sign_tx_refused/00000.png b/tests/snapshots/nanox/test_sign_tx_refused/00000.png new file mode 100644 index 0000000000000000000000000000000000000000..df51419d9880ff10f1f24cebe779f11ff7ce27e0 GIT binary patch literal 419 zcmV;U0bKrxP)D$(iko|UTF@u&Yag{)@)mN`1iGamjW z?-@|#I%DcL`R;-Wx1m8iV&w2DI!Y>*e7y)ffN(0IS^hR>UWBs}p1R_IuO&=RwhCUX{fYF*|8$ z-}7I$&Jfhf0$I4MAmWJn3INi&qfcFT$NR000000000U?jMqbF~2?)b|e4* N002ovPDHLkV1ho3w>JO) literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanox/test_sign_tx_refused/00001.png b/tests/snapshots/nanox/test_sign_tx_refused/00001.png new file mode 100644 index 0000000000000000000000000000000000000000..a585d6e354b0ea2c28df7e2ebba013284dc40a13 GIT binary patch literal 517 zcmV+g0{Z=lP)004mPenuOF5Jbs&o=(Bc zi&4!*^2`x6gb;Mx|2lxXM)Yy%C4_LEXIh5&NYZM`>!fmBv)J}1tZ`a-qM9MQrX@d?~#YRy?ZSpMqYF8&I|` zg8{&E44;Nh6K|xo^P;@T>J~%?mNIZovziiucE8%*&;i3K+67c=^3Z?)BTS|ar#I=KwX;F%H+f z;_0{PO<4Spa--36=GEj5aR2#2bSSdWL~loFsrJmNo$>mAu)Lx%_D3y^Z&jUSW`CQ) zR5SaVaS!f97P?bolDP*BoPzPvo#+Z`f-HF znpWc!EcyTd001zFPT`?wb5o%$97hn1XzDimgG&MeW^u6^dfd5;%U4xgE50QoYu8kT zIYTsk6s_59KU9nTU7S`Lolao!3edv+7``udW={WzTF@8+vUbbJ%yqCh0sC~DJmyno z`crN}moC7b4X39~_2@QUyhu~>RoeVR_$0icrr|#cJC>$nVLcur@^C7?MRs?L;3N8q z9E9atcA=P@1eqLM3gI0DIkv)7@Vw76^fb@yczDAP9mW2!bGv<6ohz$K%m| zU)NP=v&!1j;AlT7eZZu?kFP>oPfV`wTdR$}^XE8eGcw_5|=#RB>GL{k#?RJ3yibVvN@)oMNr+AywDWlJTALk=t9f`@7w-1Jql!t#+{! zxaC}yRy4lqjwyc#O{h=6bMMQCm3+`y>bXf1T1(WHdlk2rAT=~nh(u668_VMkdRvHF z5}@{Qj~`e?feg6M`TJ;;+MFLzgX=BnzdM zN+|ZhDz~GK@gEzVFsDeKL#b#jQ(LT2d@OH&?~VBGIMY%WOz+B z6lou&(CP~?sUe5bTCNj8~RkSGQH zS8?Lg#24cI-`G7WBFAguETbF->LPE>QQakNfcTbHk2R;f*=Uu69N6Fyw&rn94FYQwSg7zwR~ad^j~VJ5^HJdT962A^`I)JDCJRF z!n&kt!G?nO{@wWCx0nSRibr2%8F2cbGe1s)G}|BIO{e?v7gtzCxSJ_?QW>xT?+1 zC3ASyBWE)ch}$RH&{1L?nn&AEr0Gnwp{j>|yBuo734$O9f*=UuE$|Kdu$ahF3II?5 O0000a$b)!*J!=4orV?>DQWs%!WC+H#}cU0bbf(`BBlrz@rWWmV);2Zv0wQjX*3 zhJqEEnj(vItn?M**pWX1q#B4eUTtC*YxS*E%Q~gxOPV#CY$t|CI`MziyF|`H{K~WJIE;g1({XgMzkaAW zC*}=V&}oJ<;RIWiWmN~rc~kwO6q#O~S>6ds{p(s*~2EL=Gv{d$sxNEEHKzhTk&p7=-u9Z_39ogG}_dQ9@1h zH=_^UiCO5K20^9|mLj|W000000000000000006);|E=1oV;KqHKL7v#07*qoM6N<$ Ef?r(m7ytkO literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanox/test_sign_tx_refused/00005.png b/tests/snapshots/nanox/test_sign_tx_refused/00005.png new file mode 100644 index 0000000000000000000000000000000000000000..908007899b7edf73aff3c0856df19f34b33b3c42 GIT binary patch literal 376 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|_WOba4!+nDh2#E?=_(PebCi zH)?nOd+a@3H(^2>Q=Q_`A9ni#7=0(6ir@h1Igs7i(NSUF+PwZdbBllz-`_2U5$SvC z@9|$yQ8GLxvMk2qY0SbZx9wWLGY zt&ARgM-RExOspw7q^0>{r{JCwm25Ar#ao~!+C=94X|K@qk7*s+w*+*o97{?zg?L3KF3m|^;N8z$hzo9 z?KebU@9X((Q^znb?@3zBxqq4G_iiri&-sv-VQMM#z3(9NhI)75(&fz8qc)aUy@`LN zv()VWgpH-|tcy>$MaSLdoaLzY>vD*b?-%uC9-E1+HXmibxl}L$!vG01-2TJZ@=jat Sm%7Y1kg%t#pUXO@geCw8Ri`!p literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanox/test_sign_tx_refused/00006.png b/tests/snapshots/nanox/test_sign_tx_refused/00006.png new file mode 100644 index 0000000000000000000000000000000000000000..b74a015bf5bc6633ac83c00a2108c7396a18926d GIT binary patch literal 388 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|{t2ba4!+nDh2#EZ-po0k?}6 zcL;ymuk!7YGq0j7+X|-Us`HbRyiOkX*X#o7VK{wvkFz6PVC8$f8GJJ7&WH{Yy1>h=_4+i{qfMbThnf4usx|&$nrfO z+I0Ewo{03NpN^WnYM3LpyggX`>xthdXQlMLyT`jjr{#ihd~MyE!~Z1}j`3}ZjHnC| z$-ehlk%xid!~A3U&dEJT%jFHtnu2a|oAt|l(RG{pqU_rGTc@vxW%pOVXiI|& z_PqZKUdGM;z0dri{N|UD6S${OUNlj5LfHSuCw$ib_^mfrDM_aBj9CSnNc8^7cl+4N z8@8TzT)(|}bD7}T|DkKQm4oO literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanox/test_sign_tx_refused/00007.png b/tests/snapshots/nanox/test_sign_tx_refused/00007.png new file mode 100644 index 0000000000000000000000000000000000000000..53ae65195fbea5b281a1bc1a80351dbf1cd79ff8 GIT binary patch literal 364 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|=-%ba4!+nDh2#AYZeBfa}G~ z%X2sUSKTFSd4J{-YHcY(QO5;J{<~e9q=7F?O4)!WO}6UUdH! zS+Hz=(4})vCM2-VD4nt3W%LdvkyzeG%km#`1t_mu*zR}#jNB{EKZnW}g5-=Bym-_% z`=7%C>zxJL|9msNSMXnbQRayy^)nr>EU7olTHqoc^vG(B%bo(Id*|kR{84!`z2x6n zZ`;PkbrPvd6U}A>Y0chs_tyHmLi6kw6c{>JvYiQ=+MTFTx8d*9^V|R0+_75oZt9or zLetinU!`YMvFyLCb8XxElhO0{v2rTkNR$jMW7~4}*8a52+MC^J%KMbxPN-JRb2RNP zEsp0ebAPS3=e2G53#Z$XZAI6Yd=Yj&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#bpS7_dOvl2n-YDN3F!8|Zw}1F7^_|`|7^d-WZmAca`5Sx-r#o;?yf)8 zamTB%jcSo;Cxq7w@YDAG;F6%vdkN~UKMPCH+44GbgZ0O61|;n~NJs3(zH0)OyObgT z0C=#wjq|e8y=uL$7S9x$jZ$lEcdNB^nwK)>H6PNyiQd|Lm0PfUPFtnWXfpPxEGL>bcmBgvGOE8^+M17u26I_+AT#bzzP>rah~%<8qgG%2*J4WoW2uMlMt z9%lVFg?Z36N3j^!4wH0b{3O8WBJ4_G2v2AEUeKM8006+%PQAmq$BV*J0ebACz0uB~0+iy*OAtRT7 z96rVI*8>0m0002o%^$0xJh2#?r-}do N002ovPDHLkV1fi5-8TRL literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanox/test_sign_tx_short_msg/00000.png b/tests/snapshots/nanox/test_sign_tx_short_msg/00000.png new file mode 100644 index 0000000000000000000000000000000000000000..76560b8c0f3bd5e50f8a56f6718ab7bb80ca024f GIT binary patch literal 420 zcmV;V0bBlwP)x`j)$#)l2xD5^B9vd+L007`}(Kn1u*nQ(gU3$CFT~(<~$DUkDezhFAAUQ3} zEKr}6Hrvhe=ha$+4lgrCZz=Szj${XZ9Q$FKKXKgpgqT`u@~eeA0k6)fAa3Q_A}8il z^uw7iLF&k@gUxaT;buTjUb6liK3fL^007{*`rK#IpIDufBN=yN2{vMCW3^Z{TSo7C zG?k$=t7gHh_U-E*`i$8N8(*}VU8g!6mXW3`F~dq*^#u^03HVb006MuSJZ=Z&gVr+snzlZ z-_ZkjyPxO*969Hd(l!0Xt?T-HE$+35#%|}8_I(4+(4>^AkrKfwThhm&;$HT#AF)jQ z8&Gw{!gw>v9F#4CakL+?OmG6q;!`a|dZw3wJ14IWWh)apbNbK4wkSc}xQkmx{jrHk zH91Tdo0g#CGue$vZM3wiiukqaBk(+t5+g(FZBc^WENmydSZh5B0PrFzud()+-IvZT zV{R{dyw^*tf`Wx@#74G1vs)zN8-wms_H1qU7A%(B6VN(M>mHn4eZ+OQzc?(?!??QX z3(;o*_XOxOOMU&6Z4132tOR*Xv8hT`b`IQ^?RyyKXDZy@xseGNskVP7J_FqAqrZ_= z4?B&2)ZO%ho()Ln*Y-IhbTYm#SvH1&8~?}-38+8!4bea4LhLXGn&9KrRVZ91$mGBk r;ROHy0000000000000000Nnfn*zh%{4hVGp00000NkvXXu0mjfbfC*7 literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanox/test_sign_tx_short_msg/00002.png b/tests/snapshots/nanox/test_sign_tx_short_msg/00002.png new file mode 100644 index 0000000000000000000000000000000000000000..53ae65195fbea5b281a1bc1a80351dbf1cd79ff8 GIT binary patch literal 364 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|=-%ba4!+nDh2#AYZeBfa}G~ z%X2sUSKTFSd4J{-YHcY(QO5;J{<~e9q=7F?O4)!WO}6UUdH! zS+Hz=(4})vCM2-VD4nt3W%LdvkyzeG%km#`1t_mu*zR}#jNB{EKZnW}g5-=Bym-_% z`=7%C>zxJL|9msNSMXnbQRayy^)nr>EU7olTHqoc^vG(B%bo(Id*|kR{84!`z2x6n zZ`;PkbrPvd6U}A>Y0chs_tyHmLi6kw6c{>JvYiQ=+MTFTx8d*9^V|R0+_75oZt9or zLetinU!`YMvFyLCb8XxElhO0{v2rTkNR$jMW7~4}*8a52+MC^J%KMbxPN-JRb2RNP zEsp0ebAPS3=e2G53#Z$XZAI6Yd=Y#bpS7_dOvl2n-YDN3F!8|Zw}1F7^_|`|7^d-WZmAca`5Sx-r#o;?yf)8 zamTB%jcSo;Cxq7w@YDAG;F6%vdkN~UKMPCH+44GbgZ0O61|;n~NJs3(zH0)OyObgT z0C=#wjq|e8y=uL$7S9x$jZ$lEcdNB^nwK)>H6PNyiQd|Lm0PfUPFtnWXfpPxEGL>bcmBgvGOE8^+M17u26I_+AT#bzzP>rah~%<8qgG%2*J4WoW2uMlMt z9%lVFg?Z36N3j^!4wH0b{3O8WBJ4_G2v2AEUeKM8006+%PQAmq$BV*J0ebACz0uB~0+iy*OAtRT7 z96rVI*8>0m0002o%^$0xJh2#?r-}do N002ovPDHLkV1fi5-8TRL literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanox/test_sign_tx_short_tx/00000.png b/tests/snapshots/nanox/test_sign_tx_short_tx/00000.png new file mode 100644 index 0000000000000000000000000000000000000000..df51419d9880ff10f1f24cebe779f11ff7ce27e0 GIT binary patch literal 419 zcmV;U0bKrxP)D$(iko|UTF@u&Yag{)@)mN`1iGamjW z?-@|#I%DcL`R;-Wx1m8iV&w2DI!Y>*e7y)ffN(0IS^hR>UWBs}p1R_IuO&=RwhCUX{fYF*|8$ z-}7I$&Jfhf0$I4MAmWJn3INi&qfcFT$NR000000000U?jMqbF~2?)b|e4* N002ovPDHLkV1ho3w>JO) literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanox/test_sign_tx_short_tx/00001.png b/tests/snapshots/nanox/test_sign_tx_short_tx/00001.png new file mode 100644 index 0000000000000000000000000000000000000000..bf3675325f5a1fd84129d442f1095c240a43bf90 GIT binary patch literal 439 zcmV;o0Z9IdP)HlG=lPMqB0;y?~2+*_PLDN-4KUaZy*pT^*t9T((q)UFUTuVyl}!puhg^?;SDW z4zR`d{f$S;uZz5&l=k`{vy#m`PM`7Ade?+v+_^rLSU<_5KTY2O-Ad$0!WrpfAHwQ6 z`HSy`&V#-6nXEgYvw(M2*qIN{X$G0-FH;FM(O--`h(s2O)Cn?s@F>Cy0000000000 h000000000y<_Cd%YewKv4(b2^002ovPDHLkV1ldF&nN%@ literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanox/test_sign_tx_short_tx/00002.png b/tests/snapshots/nanox/test_sign_tx_short_tx/00002.png new file mode 100644 index 0000000000000000000000000000000000000000..dba442abbd22e2b28247ecaf4fd74baeb0d06885 GIT binary patch literal 571 zcmV-B0>u4^P)w0000001W4Aiq{w;y$&Jh z-INZ}TG1vrVvI6nZq4@QXLbO8Q2J>7raK_U7($SJ6jRa;n<3W0V!1irBb_O*TwnDu zW+$~H>liaa9dz%VaIpjAnC-c4<#$&3axnotkOimMzh5v4E=rIbe5-Wm_b4hm6PYjp zRBF?EOIm+>Cnb9nvv@!QWI`RL*hL9?GuuwUm}&+90H6ZPJ!Fa7%aTwMm2ApBsie~? z06$EYB1rR5#2?u%KPBbNtCpRGbcA@(v)$?BR-Qn7A=Q zEV0iQu_nseX=LO+m^=aJavMD6A|vDBC8+BLv=kgmpX||{{Z)r-vPL%R!w%s>dR;BU zhqxWfWngY2zK7@GWMcCi?me83=oNF|mbX+PpA?deIp~U)^xli3Q}i)my!T}=YNEAi znl5yA(SouMn;ieY?_6n??61XVr=_D>y))~gHfBdCDyA-ZS}H)5oN3WJvrb#ZY+(&C zj#gh2mBv*yU*_4+R#~$Yw~?%|1CEb;)+%f1PTK7dW-6oozbXiJ2(#6iwmjE6&pz44 zs+ix1t5SZOM>~L}0E^{a?6Cs?0000000000000000002kn_orQ{fIe8&j0`b002ov JPDHLkV1kDC`e6V7 literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanox/test_sign_tx_short_tx/00003.png b/tests/snapshots/nanox/test_sign_tx_short_tx/00003.png new file mode 100644 index 0000000000000000000000000000000000000000..ebcd22e7eb47dcdb668c9c3ccc26602185db2e0c GIT binary patch literal 889 zcmV-<1BU#GP)mwhHJH?&ntOSAeAjqK{W^9AfRRA-685W#c={$J*MeUEjx!72rOqN4APV z;L^6DTC?$WS4{a!XrO)qUTfdJtn7;}s=n6fLamhAbnmh~1-YTIMka#x-B=!XvbTk7 znE-bWcYPBX-C}%OX)T<-aaJ61-81j!AIQ|yZu0Qkxjz9_JrP0(@!QGOP-f$WHAP!E zI+WS-b1F-?6HD(S>{N#jVhr>UA(-ROq0+{Gwnf2rL{0D=HQ(u3%!#h$eM$# z*zh7Xl-cJ2OJ5Oh`*?M;8QooJYGjmGW{kM=N2eFq<|ddD1^W+-bP9Y9e{vPgW#dAl zvr=eeaoPB@l+W?=$&DsbM4>9lB$Ee3(1k`_{jsX6Xad}nx4hOE1t}ejD>U*(+_AJ# zS32#B0iRI^=EOK&OJP`3({N5_jGLC%+FjEYIeM#33AQ4P@zX#P03LH-Ilq4$-P_5G zIVGdIsTmkupUnNz)^~sqLI@$m?}SoAXYbHKU0i0_d8$@2wSb>A0`3@@lQ0EVIvKIB z8P~MQ*)lghc=zn$c4kS83{S8?Ew_b~y4dklzQSQ%7oE4=Z9-f*|8(c)d+EorrPd)hok)p-m2u z5db^Al*LQ=-U#+;(Iw2){W}@gIoKNV7Tf5oA2I@VXka)(2qA_K&Xf+Is3`#e005W!3(U1`Tlt)G4$K*q zZBJOTl@2%g>mQZJ)EVY|q7oHNzvr{XR=@dd^|o%8$3*?Rl+u4xBA>cAWTVxRb8eP` zRhrTwLmF25igoOWUjb4nL|w1Cv8lB>E7e#hN>0+KvsvsCk6!`mR82=q*eTrMZ&^`2 zwRRSkbxf@I0od2Ryi(O)ohpz0&#|bU!45p#tCpXF)Y8bto(jqfW5}#@Cd#Sqjfvle z$}%P6%694^+=N)`NsV%PSO>}|=Q?!3_4$SNbK?_|{H~Az2;PDgo$Id;Jb^r?S4&<=)~{JQpF;ayeD~jO zL(fhP|5Vt&4V8z@2U?p*zhgZahPR;y<$du)dk(Y6RR1zcsj2?O7=t@;7P`|xkr{)f rC@%m20000000000000000Ivc9>?oEq$Tl-t|*Oy!8EPuP% zyLvbjYKhezX}&UWX$#skVHW^yh z-nQmvU`WuPJU9OS)^{E6vfA!eCR8!hD z#wdJj=S@S#rAMx_Cj8)UnW?dUvF=NO*B$LEyjPnuoISSqKC2(w{|_fpn7qpu<*%!G zu3I3{?x^-FjcuXYuVW_~)mKeWzn19VA`bL5GKhG_x=}%oX^YD20Fbb!tDnm{r-UW| DfRC5b literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanox/test_sign_tx_short_tx/00006.png b/tests/snapshots/nanox/test_sign_tx_short_tx/00006.png new file mode 100644 index 0000000000000000000000000000000000000000..180d8bb31402604a3b46ded62e2667d43732772f GIT binary patch literal 389 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|{s|ba4!+nDh2#Y+s9lfZN4c zC*QRE)$iPUrdil&$*L=P3l=<|w_Hp)*Y1hC2qRG2vfo|%7zHQJDXyIn)U_&Q-~1QS zKe*S0$L)R+cf`D5Y2704HCYc|c(rxOH+k`E?40AYa(Bn&*jo`-x%01?oprKZkjI>P z?8_|SnBOy2ms(Br-xk1p<<|2r1zAh1UzKgLid^vig>;3^(h_yM{q<{<>-YqcSt}!7 z_=skm&GtJ4wEutb|J00gk+t6ilNB{?MSUnby>RWSzn3jlvn}79zZGclG;i-^D`~cV zKi?l8_x-)sV$Z`Xu;zJMjO5>bUE}&0?_QgH%vtg|Z-tdbUtik&FH5VLBVNxb+~ybm zv8dqMrYE0vca@%s^xE2 e16_j*cs_G?>e(@0y)5Ys683cUb6Mw<&;$TxovKR! literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanox/test_sign_tx_short_tx/00007.png b/tests/snapshots/nanox/test_sign_tx_short_tx/00007.png new file mode 100644 index 0000000000000000000000000000000000000000..53ae65195fbea5b281a1bc1a80351dbf1cd79ff8 GIT binary patch literal 364 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|=-%ba4!+nDh2#AYZeBfa}G~ z%X2sUSKTFSd4J{-YHcY(QO5;J{<~e9q=7F?O4)!WO}6UUdH! zS+Hz=(4})vCM2-VD4nt3W%LdvkyzeG%km#`1t_mu*zR}#jNB{EKZnW}g5-=Bym-_% z`=7%C>zxJL|9msNSMXnbQRayy^)nr>EU7olTHqoc^vG(B%bo(Id*|kR{84!`z2x6n zZ`;PkbrPvd6U}A>Y0chs_tyHmLi6kw6c{>JvYiQ=+MTFTx8d*9^V|R0+_75oZt9or zLetinU!`YMvFyLCb8XxElhO0{v2rTkNR$jMW7~4}*8a52+MC^J%KMbxPN-JRb2RNP zEsp0ebAPS3=e2G53#Z$XZAI6Yd=Y#bpS7_dOvl2n-YDN3F!8|Zw}1F7^_|`|7^d-WZmAca`5Sx-r#o;?yf)8 zamTB%jcSo;Cxq7w@YDAG;F6%vdkN~UKMPCH+44GbgZ0O61|;n~NJs3(zH0)OyObgT z0C=#wjq|e8y=uL$7S9x$jZ$lEcdNB^nwK)>H6PNyiQd|Lm0PfUPFtnWXfpPxEGL>bcmBgvGOE8^+M17u26I_+AT#bzzP>rah~%<8qgG%2*J4WoW2uMlMt z9%lVFg?Z36N3j^!4wH0b{3O8WBJ4_G2v2AEUeKM8006+%PQAmq$BV*J0ebACz0uB~0+iy*OAtRT7 z96rVI*8>0m0002o%^$0xJh2#?r-}do N002ovPDHLkV1fi5-8TRL literal 0 HcmV?d00001 diff --git a/tests/snapshots/stax/test_app_mainmenu/00000.png b/tests/snapshots/stax/test_app_mainmenu/00000.png new file mode 100644 index 0000000000000000000000000000000000000000..733cacaca1da46faf0b7153db694fd102809715d GIT binary patch literal 10733 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 WS^Ub#9pHx`AX8(@YgJd>6aN>=kcxx= literal 0 HcmV?d00001 diff --git a/tests/snapshots/stax/test_app_mainmenu/00002.png b/tests/snapshots/stax/test_app_mainmenu/00002.png new file mode 100644 index 0000000000000000000000000000000000000000..bdf16f2765cbf08dee9ae04d489275c98f1fe965 GIT binary patch literal 8398 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 literal 0 HcmV?d00001 diff --git a/tests/snapshots/stax/test_app_mainmenu/00004.png b/tests/snapshots/stax/test_app_mainmenu/00004.png new file mode 100644 index 0000000000000000000000000000000000000000..bdf16f2765cbf08dee9ae04d489275c98f1fe965 GIT binary patch literal 8398 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 WS^Ub#9pHx`AX8(@YgJd>6aN>=kcxx= literal 0 HcmV?d00001 diff --git a/tests/snapshots/stax/test_app_mainmenu/00006.png b/tests/snapshots/stax/test_app_mainmenu/00006.png new file mode 100644 index 0000000000000000000000000000000000000000..733cacaca1da46faf0b7153db694fd102809715d GIT binary patch literal 10733 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 literal 0 HcmV?d00001 diff --git a/tests/snapshots/stax/test_blind_sign_tx_long_tx/part1/00000.png b/tests/snapshots/stax/test_blind_sign_tx_long_tx/part1/00000.png new file mode 100644 index 0000000000000000000000000000000000000000..0155f6224c599973b0cc7a7c7201af5a3d7ae14e GIT binary patch literal 14317 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 R_!=JtSVLdE`jOqs{{!JPvflsz literal 0 HcmV?d00001 diff --git a/tests/snapshots/stax/test_blind_sign_tx_long_tx/part1/00001.png b/tests/snapshots/stax/test_blind_sign_tx_long_tx/part1/00001.png new file mode 100644 index 0000000000000000000000000000000000000000..0af716f6f633f4acde0edf25e00178312990fcc0 GIT binary patch literal 8400 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 j3T)#X`G3&(=4RWk#$Q(R6s$hq7m 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 b|Ma_OFqU^_s~P~0&|&a&^>bP0l+XkKKRPvs literal 0 HcmV?d00001 diff --git a/tests/snapshots/stax/test_blind_sign_tx_long_tx/part1/00003.png b/tests/snapshots/stax/test_blind_sign_tx_long_tx/part1/00003.png new file mode 100644 index 0000000000000000000000000000000000000000..f4d08a644a2347b63d46de13d146ce98d9a7ca22 GIT binary patch literal 9157 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 ZsDDA9r0JdwP}k3LlN*yAI3Nu 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 pB>v2ijsKmU-~ZKAe!Ql78!~skXiv~Q(9Tx5@! literal 0 HcmV?d00001 diff --git a/tests/snapshots/stax/test_get_public_key_confirm_accepted/00005.png b/tests/snapshots/stax/test_get_public_key_confirm_accepted/00005.png new file mode 100644 index 0000000000000000000000000000000000000000..f59899e9aa967b23177d83aef0c8c2c9041eab91 GIT binary patch literal 4615 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 literal 0 HcmV?d00001 diff --git a/tests/snapshots/stax/test_get_public_key_confirm_refused/part0/00002.png b/tests/snapshots/stax/test_get_public_key_confirm_refused/part0/00002.png new file mode 100644 index 0000000000000000000000000000000000000000..733cacaca1da46faf0b7153db694fd102809715d GIT binary patch literal 10733 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 literal 0 HcmV?d00001 diff --git a/tests/snapshots/stax/test_get_public_key_confirm_refused/part1/00003.png b/tests/snapshots/stax/test_get_public_key_confirm_refused/part1/00003.png new file mode 100644 index 0000000000000000000000000000000000000000..733cacaca1da46faf0b7153db694fd102809715d GIT binary patch literal 10733 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 literal 0 HcmV?d00001 diff --git a/tests/snapshots/stax/test_sign_tx_refused/part0/00002.png b/tests/snapshots/stax/test_sign_tx_refused/part0/00002.png new file mode 100644 index 0000000000000000000000000000000000000000..cebc8beded3da2cc390e824ea38eac4f84cbf349 GIT binary patch literal 5076 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 EAIoqjr~m)} literal 0 HcmV?d00001 diff --git a/tests/snapshots/stax/test_sign_tx_refused/part1/00002.png b/tests/snapshots/stax/test_sign_tx_refused/part1/00002.png new file mode 100644 index 0000000000000000000000000000000000000000..babad9890872f63cb50017836f9fcc0163367cbd GIT binary patch literal 8273 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 literal 0 HcmV?d00001 diff --git a/tests/snapshots/stax/test_sign_tx_refused/part1/00003.png b/tests/snapshots/stax/test_sign_tx_refused/part1/00003.png new file mode 100644 index 0000000000000000000000000000000000000000..cebc8beded3da2cc390e824ea38eac4f84cbf349 GIT binary patch literal 5076 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 EAIoqjr~m)} literal 0 HcmV?d00001 diff --git a/tests/snapshots/stax/test_sign_tx_refused/part2/00002.png b/tests/snapshots/stax/test_sign_tx_refused/part2/00002.png new file mode 100644 index 0000000000000000000000000000000000000000..c461a424b71749cf80cd3d61254621d859649c23 GIT binary patch literal 20356 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 literal 0 HcmV?d00001 diff --git a/tests/snapshots/stax/test_sign_tx_refused/part2/00003.png b/tests/snapshots/stax/test_sign_tx_refused/part2/00003.png new file mode 100644 index 0000000000000000000000000000000000000000..babad9890872f63cb50017836f9fcc0163367cbd GIT binary patch literal 8273 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 literal 0 HcmV?d00001 diff --git a/tests/snapshots/stax/test_sign_tx_refused/part2/00004.png b/tests/snapshots/stax/test_sign_tx_refused/part2/00004.png new file mode 100644 index 0000000000000000000000000000000000000000..cebc8beded3da2cc390e824ea38eac4f84cbf349 GIT binary patch literal 5076 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 EAIoqjr~m)} literal 0 HcmV?d00001 diff --git a/tests/snapshots/stax/test_sign_tx_refused/part3/00002.png b/tests/snapshots/stax/test_sign_tx_refused/part3/00002.png new file mode 100644 index 0000000000000000000000000000000000000000..c461a424b71749cf80cd3d61254621d859649c23 GIT binary patch literal 20356 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 literal 0 HcmV?d00001 diff --git a/tests/snapshots/stax/test_sign_tx_refused/part3/00003.png b/tests/snapshots/stax/test_sign_tx_refused/part3/00003.png new file mode 100644 index 0000000000000000000000000000000000000000..90c9f759cc3f299650d7c361c63815b5e533e363 GIT binary patch literal 9157 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 RKF^VIc5pjMJP~r~KL9oT5tS_wqM|`*QK}?_ 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 literal 0 HcmV?d00001 diff --git a/tests/snapshots/stax/test_sign_tx_refused/part3/00005.png b/tests/snapshots/stax/test_sign_tx_refused/part3/00005.png new file mode 100644 index 0000000000000000000000000000000000000000..cebc8beded3da2cc390e824ea38eac4f84cbf349 GIT binary patch literal 5076 zcmeHL`(IM&*0;3V1vwh(dr`sNjXOJ?EXj;mi-M{rT+A{_JNz&-$+KUhBK| zvwyr8=x_9u)mM6YdPe8Yo(a~|+wee7Z)4fkjldmu=xef`o;mT{neQ%T6)S{_%M-G< zcO$2~VERh4m*-LcKHiwUG5~)U@W!mn;NXUU2WDBA$>I0UPMzL*a7>)NRupvBZfnF3 zxtgd(_=W0$9d8JW7>1qRDI|8&ucqLy@1i!GFxY-?FZ`5Y$HuE$Elho=w=KU6ePQEE zZv3~(VM#iq|KZr2xEp_8q+DEvT5rRg=(yUfJliA;erDT@4S`Y!GZHX zKQJFLqlr{o_E(7!?RKdTQQXQ37~ukpX6Z+bO+N|hgw<)G{`X{lwYfPwTTl&>>w=rhW^X)GZCk$u`=eZkg<<-dg-I=^A_l>7WT!X z1U?OHuez%5X}`?^GyOMGr=a*X|90!=*G8fO6jw4G*3ayQs*$9Z4}D!auHIYgn^)kE zn1MIT2Ea`dEe1H9TP86mlhzP?gxL7P92{1XGxL;#2YGMibF{l{4R8VK3qP5qxOGf? z71(vQzWJ+;33vC0&tVa`b!EfJT^HX3S)QUcV>eV!z0t$6D>oOf76V3cQX25)1xiLMdCBDn@z!iu1tv2hshX``5u5hnPy7@hgi~NHkd+yt_9rt0a(NO_nmtt z%&_boq?OQ(^$6}GRLW?zQ$YPRlb82?kucpa2n4(xBMo87#rvO;@U;)Gchv1amtd1F8JX2Hdjojwe z$rG2uirH2c(ivJU595Br0w6Zv<$(~xZ{UWZP-y1sGX-Q*aD&goB?IRc{l8QLcr~KP zXca1lDw>}qug$WmFiBpwxdMUUHi0b^UJ2R>I$?JnkHf==W>K_L_hi%)Wvf>-g*v!#fv- ze>W$QTxSS=W`IeRb6KNvWqt&&XNB8Jn?^HRg#hGe+IvL?K#Z_Iu0LOd!4`TTQqEnu zepZrID{&?EwNGa}r7&9)8{wDsjV3XKE)57M5N@k*NOXK)=2c#=R4S!2eob(eKTT!g zCa1SEPT*ST$9MU17s}q*Mph=q$gerp^phKPF)1t8Ugq-eA z-p{2U?r7|NN2!(1~*Vpo#G)})R&XN~E49y(eA*W+S8G>S(Eza| z(*6G0&V26#EQs;kVNbAEnWQ{|!snUQ=wQ?q!|g*aRv$eND;MJG=LB6x>QX4TezwBV ziaw0@0<&SsG_8-d^INTX`qIN%9lf!P+&n1So1WMq%Nkr>ZEufiOzG}`MiU{us~Qcn zrEmN^68)+${RtgqRQjR&XibMtE#{4l@!y#d_u~x6y&q8NxuF;g1_`$CPrld|ZbkV~ z`xtLrAv-I!9d3Kd5Gc4cMwXERJ!8=6DD&YDsFLC+FE4dB5L&`O3^Np@pBS!3PJck} z2dWh0xlaC_{7Yz|hjtHBm-cNXDt(Vd9bLNmT$}T8`Z2VfEO2+sI*ay$*Vh$}WR^Zg z8X23rf#F`#tj{43V9m5tCg1-L*emTmclWujDQcwoO7j7ytg~t-N~ii|ry%$LP^(7y zPM6+|>4M%tZ;#I!!+Ys7$Un>X=O=IzLko z{ZU>DA4t3J8}!)YpZLhD6l%2RPil@`>3&d~c9?aKbr^07C?^HUl5MXEM!1NlDGrSY z3aND6tVjTwWD12Mo@-9waHaTJ^V}M~_FO1Pu{(Du-$!Qr0wwfo+vFScTQm(28g&Ub z_VfIFD)1)N&maIu0OtRWBsfdH8SeFrC~2>5Mv?eIF=&1F zcr1zb{H|A*(hgk{R@i=yTKnjTE$Zc3gj4`sJ&8nZM`@)o7CiW)7?r(_oy}P zzSO`LCH7EgMc&$qM#a+EwRPM!8K&=mseYK>KiO$LDiV1^)(s)C6+9Jltsl4g2S}Bc zZ4L9oi}NCN5D!pNk~d~dBwEZiig4^O30qIqQY)d?{*IQy!={qG8w*9iD5-T|_IYYW zh^A6CP2phpcuywXlJ4mq@&?_8zNNh zpDrPp4JR=Qkyjkw&T9?wJ$~f;(NuW@LUM6n@pKm{^QX7_OW|v^(wh)}&58{==3O)m zkoC01y~h8~;NfF5uB+a4_mT``_7p4+;7pLTXZ4zd#5hRlUUJ*5Xh?o?nBqEuUJmes zvywH!U!+@mF^0p|#}n=|f=gwWlImvc6hIkpjzWOG)_%()3!9(0Qns!wk}N;ua({bn zE9yIt*B!R~vIBD4I9R<;oaA99GuXa1J3k*R>Q>>==tH83L7Qnx-n%MR;1Unsi4_A1 z6Dkn?=mcK!$u>yn_m+0sn}e4+LtQKGIk%f_{7ZeRec2>`*(CqBHpzbx=9e(Vo4zOS UGkp&N{?_T8^9?-Ha2kdE7cFCueEBpb)HrsHr^kNnM|wj4#re{AhK^Oy>RP^3Z(fl7Bu*Fd8%-7WNa^kFfvj`o3$} zh%Vb7LZxBzwOE5`y2I$w26jz|o~H6Mu-#hBa-rYRt*>69Md32zN_&aGyGkP|*zDq)rQdOklE7^j4pGlHu?3sYRzCb+O)?xS;R566{!~94Obb z;h)P{dw**LLZ^`lb+zyONlAH=H`PBco6(?y-Keb0lJ{>_norT?!;Y@R1KTus2}qaK z+4y2S)|4}tMkj2go1MEv5x5NQ=gDALFdYbS|FAS`*D2@=AYD}jNH(THw#$EsoFwvF z)edmvn1?na&5nx~Va+zl-5A8vWFy9@Weo)7pzR#ODB1SB)G;3wFke-n?Z|7##cdsL z#9`{kS(qwUTa*wWGX0-Rofs`AD@J8E9!NOBg4p+STdbTcyd?Fk41|MeZcFJr)fFkC z24v~s8hS=lJ7HGG#*?n#vdcBPd1$&m$i zN&ogAp-U(gcM5U;Z^4rPIvV{yFhkq#Hc^Tt9$jNnnMlMflGqj<75%36ptSDb%b`}6)n8tnA^l|uIP2LA?CPiS-GyjK>|0BRNF`8J<+Mv+K*0XdiGbrG zY9^rRafu0bc%^0W2ezMA&3JNsM0%s{R+LsBDZS6WM!OAU*zyJGh|wx3YJwggA3v>` zJWYr}apShWc-22DF*#H0&_wuse9VBm^-~>@)$3HfQf&=YgVKY4w%pGxUr}IrS3m9Y zzWPaLfmPNNh2s_V@1z4ir3^@{Y}3Rhd8pDr4UzR#{5iI3@z(G0buSxM3^(ovJAX;4 zJ45|+sqE`r(sy{$HI2G?WgA*w0#f2RmLFM$VSD`gk0sN+|F7oFihJj2Xt_4!G~06Y z&7>?A>~I7&z~?#`wA)(>%XQScOYh2q>*omjylC-v6uFcs2nw1+AH9lMV&d-ADLW z!;!-L`PsLHls3-$oC$sfzs%)5Y-MNIacItf{N-fD7HTziV6Dy7E*kTb2f0O;9tPN7 z%*%f@%J*e_rmmcA1{P?Z>NqBmT6#KuGJ`>Wov4j3FtJbVGQfG`iv%pb-%-=2EiU^A zT%nSIpKQk4_D6d!rH}2XM@)tBHv$e1*)Yr^z<@jnoOHsqM>lc!v^wJL3oyc)=0h*n zjNeP{rm7m8j(dy1$C2UGYKAtP-oxu3o~#sNnX@gZS~qQKfg50VtK2m4PQ0izfrix;MKLg=;7%5ga>~<_|>RrqBfyA zJvi>7)t4b)GWgsDt$znUcP|cI=T^4c7$$J z%FvIaapy4YvF$zPg{1f87bcF+$p$EL?pwyRe^^2&a4>;|J=6?6n+T6t`z}(e^jP*s z^Uoeb{5wgC1TtTdPDzoK%!pS#n7%x%kGSZOOg!+V=_2`+!yd-p)E#WKHbjG;)mobL z#M_Qrm%qiZ+r4HVSv$as5vqsc(|?zoiyuL!n_Ov=o{QzJC2W$9PTXY2L=^HdUbU8@ ziCyT%JC%=5Wrro|!R+mT6aqs=SBDFGB0)XKh|+4w%9XKK+y zBEM$Z1U)X~IbqrAm2mg-qKA6`^1c9V$iU)cZRO;8Dq*4rmj9AJK7y}_u(=~lAUm@4 zvgm$Embx)BAmFSd1I{EJ99QTP9~O3pwN^J6;%-Mo+_14?!>B#ea=`eu!coi3b%age ze5$;;CN9FH><`hY*kG@dpSJo55Sf&__p{gEmV&x;Hr|U)9ZWH)#i`{AGlm2eU?ixJ zy=$bY!q#7SS4k{B;30V9^8plF>h0UFI=tggkoo>ZY>FCy|If3W1*6MVy%@wBhrF28Z6X{A277{9*NF*JQ$z&qYz8rP|Ua5)b zF-a%p-QtPA7O=Fx$ls4nY~mUZ0G`4`-u;AOv0PvU4d_GabS=ykuK zDvr{T1D%y^GDC_3uJzNb$~uEX-8*d}?fjKR<{$R8dUkTzt1U&ZMyfAczHv;F)2Qo< zT^=l~Z8RHGon5C~)jOL!iGF#_STwcX9uW4s#Z|IQrw4@cHN(qtP1UQG`?5a1jjh|; zUX1U~_$K^<+kflLEV7_+&Rw>n>QcOx=BOTA?kzR-r##lP|;7>D&RQ$zQS+-q*SEp#=Z9A;}~g zuN^7S-OUyZR$UtMALqQB3zk&CrS}m}0=(aD%w8@94L_*Dxt2A998vK!iHM76s=Jq+!RuQ#b#Yvf4#aT107MzTC>C2jfXq!>-y zaOq}gVekLqTf-`o+)6&dq_EbDFz;H!&ivE3{KGotD|9ArXS?pcI&=3X&Y<*^NeyvX znvU|{9LxTvAf2_=(?=x9^^p?eTHV)<@I+Mm{CDIQ%lzc}{?XAYYUU(hGdt<_=+>&w zleu6YFuIlqTq59Gm{UZ74V-sOx*G`{nDLqlSW zvgO^ffk}&b*{C~53YTlm~E)lVujY)@j_yWwVOv)Y+l9&-4lp&44QeWW(c{@ zo=O=CjbG z4}17*!f7tir6%PMSig6vZdBb-OypW6H+Myeh&1~ymWefNcX*pByY^5TA3LpymCE{_ zY>1TpTrbPRKal^q(&CY-C(uU%{G5}LY38|yJ+Zunn1KY|@RQumjQUVp0GWFwF1MEt z`tz*D?iCD-06eume`WOxczR@7cMkJ(ZE&SUo`Y#Wx@1DC)inn) z+bTeq?m}TByqgGV$9L28?Cj+$WyTv@uT-Bnv9m%V%V_gz_V@P2B z=21rmrsa#3UeWD{SYETTQIAr2toSwF!Ibcx23LK{#ciLY*y2&ZYB_too-RQ$ImnI7 z%j(5`BNt?;Y9f=L2z-&DMVvMS)Rj}V zyB_WgI26K`j#qZFbbf$7eiF48o^W}(oOwy`9wsm2>S^5O#yaXTYgxhUhQIHOOoX&Q zsY&bCOzvB5+U(m}gPygP8h=6*j&|oV`{`4gz@ic8A?mVv`@Dp%u|k%)t|cgjh$50| zlZK2w9yVY{-JUc?G@}m${@(sfdd*UV{iI>=qh!Q8C7IvN=*dNoahIA{Do4x)*|(1r z%PaAS0vz2wAJ9~zZ~lyb7dB@nFQz&fRZ>{eP;4d*ItHXnfTZV^*-Ra|8-5@|r(8a{ z&Kc8w5}?e%w4>?RL?|=C9@Y*>Pd~k5mQXUf3WO#8=gCLYmagohvu-{Q-zt4JnHd|y zbdGjaVo|e%qm7w#Qz6ORl#zvvQ6(MRgA5)VJTCHQV%K6o(-Hph+7GvHKaN^vxxrp{cxmkG3NCM{Vmfx(Qx|cnFNdp(EH82okk1qL>wSIUg9p%R$Ceb}6EzX> zT@`CSit>SJA>0lF0zyq9>Arf2UMFQaQnzVCtj`n;fBiU+{`_W71_p&~C@;?yj$KAl z)%+huWI8~#0Drd%E&(0NW9~}V@!qMIvUENo;^q27Z z!mlL@PFfp*bq9x?z$5-$mq146?39_Xo}RJCwRa}r^10Fy-LHuQH+OP5W5RTrUZ(T$MXAJstP1TkLiWva_?| zoASZZ-u2T7UAAnYOTGB-y0{075=^VrH8G=!jX$DI?2m}d&sTZ#*K(^L{Sa7m{Zy*| zaXSh%C@lh)d3#z`UKhm=%hB&&X7YSeYguX{Oq5?*_lnc@_`o2V0Z0SDfd16rXy56j zC9PepHSG{qoH$B}+!Y*7+nDHxvtoz;K!PPS+-ogUy%Ls*c@NSu2X6$i@BWF}{@1jx zpcmk}M7CO&v(*`o>~XEZ&%v7TZb zJdnjj8CCg=zMZWBCexnq%pdSC7}L{$@S?li`jyDNUHmodgf^IYay8z+-9mtVLCr@g zL$O3f0>!d4mU~YQRiMolx)Vel#hiiRrqTTp`W%5WzE|GF-A6i%@JuJ#iK5;RyTDq) zYl}8wrp|FKbyZCttY)#DW?+@T>q;MNOyijJ>f!Z+;!Th{jShHE)RPzN!~=mgA& zKj~5yq+Iz}NK55-#Zk2D_=VukGvv)84 z09+RedK*@R6Wy7dLA?UH@m zhui1__MAh;r}#KP(<Amz!Dk(hA|@UCP~MYv)Hvo15t;(+@?|@ZaWA^!x}l!dgam z2xJ1R`k)_G{ib*#I?H6bBX@IDvdmrP)uvwy))SsCBo=dtXqtCa1~Vt-T1ncHTzmy9 z!|#ueVLl8&R0plyfYa9_nIkS1zn6#6Xnaw4d9%R^cDH_PV(o`<==>PiN5#c6~` zT(rm*&~41-0&u$F2K~!$FNp~0H+g<~wS)=w`DzhHY&oBuR#fd|8BZ83VKN)#lN+73iUxxhPu9ai zub%tIDoF>p(8-LozRAc~Vqv~xou%l9+p#h%qn6l!TBn1YNuu#+L!kjvr_BDnNyg23 z#ZAEz?9$u8Uw%qg#fBkrDep~0X<2>AfGc_6cgJ5t0}2CzS4B=h=iAI2$1!VveM*uu z0>I^y09P)nrAf4Ja$=Wl{dA|*`@BL9%wOTWjLCF+tqG$I`9lE+yEJQxehBBL^ z!~H#8`UDPN3l|`o?u=qdD>~S;<9$=Piz_KFbN^>6cFv=4v4wBbtG<2Sy@>$8z2YT(B8h&s|*PPbw#&-AbEpm zsq(cy9TXuC-2(#y0egDgxea5BDIaxC9CvFuC#)anq$SK)a5zprgdMaoZCUN z$LLZu9_XDeU{fQOnUUfzG_{n)8Zp9}Z=^69rOW8wH%hJBgjui7S*9l3NqYwQXi~k8xzx#VUGFnI+Ov$%Y@hOOBf~G=IFknln9A|W zUao?o?e3~lV$VJFxx!NvK{AOi zn$_FzT}5Yua6#j4RP?&tB%zx@Wb+tW=xYX0aMtPGGM`roA)r$4<&iCFnPh-vVX?UqYo% zx^6iB!XQz$@ZnXXq69=4c9saG`BqV!N74J<5wqe`Nq_iZE_tKCp7S-_59hr+Ul$o8 z5|jNcz@e@|t6T2vY1UH%&I(=rrRV`ZvknFU?<-g}c+uWfENf}t^vGMh&ZHAk7} zViJ?%hn=3+PtVCRh1`Qj)s8;}kaO^6-!s%Qz-W1dYA@QB!z{~8N$><-h)azHCJ(=< zU6*VRM8p8?Jt$p$6*=RWnpb#&Idd@8t65J`L2dTkqZZ_kAUjoeR;(?)XfVab7f&=i zWRy~4M4s(_5}#Vr`(VB80Jl5rYozS40y63oGJ!3;^6s^;=)P!cny2+RcXUPfRqKv& zmlJHL1Wz3dJ_p|X;%SsA^ddcw*l<$XUlhK0g7#v7qxh4Gsh{C6Lh$J&AAO!5ZzL9;q zqQ1sP#0xRpfYu-QI4nEdW5;6#G54pVTD{%@Ii>61Hj92^_x5GPJS+qh{p6s;I61b{ zbU5W|2)DS{FF&(TfWXrK4R|W+UR=&B(wUH7QGbKfajAd^*zsh%MA1=1>tX!a1YScZ zSWC(E6#kPJlB0}lB0NLR0t`An(lPR2m|aw>E_FaU9wE7oza5d|iyZ?1f4C%q(P&ew z1kn^ga+Nyx<=W=vCbg@tS`BUSrqN)fOLqQxc8)+7ZyN7VKvN%S>h#!_lJ^HZ zx<*JOJcsC1?W7>~-U`;jkfbu(`WO=5$+=-5&(!sXza|X)K03Q1S=^&-Fy#Z*Gu0pK z4$D2mtrZBB|D@8^KXILAn6_BX;R-CKUA01xHe?T-#vATfEhlJamzZ8Smu2mw+WSk4 zgmR~iHxA;3tWk|&9j?Rrh{miI939ZQ3l3_C9u;geI$>J-_PAl{2@vy2yRWGAHEn0N z3MIX{Dk2hN_O!*9&VnYPmS*5#A@85e4HS~urN2CF@r%Wd;d581OYL4+K2-z9jl=NJ z7rdEN^EkXYR@-Bq^@nrLaH?DU|D`nezqh2}Kc#{G{}TV2sQM2Oek$WdIRPmBldF_T z@v_nFqW9^InL#Y)f5tzH&{b^WXNN)Mz}t;<1@o!MrFO@3WE?%{5sKM?m}d6m;5fy7v zo>TPX`5_#C03X%8cZJSTuwnMBP<3-kbd<#~yFBiJ@V)wrQpo;hNibyKyg^TD>lynI zw_xxqZ3YT?X+Jy0%dng);@Uvxg<#-cQg>|Z_BdgRE|kAm&ZMrL0n-)2fzC0y8CS%2 zHfsD=amE(TGm%wP_)d!CR;g*qg72mX!$vB+0U;jb1mwei^5F{Ll#j8aTC8B8+{Tj& z_OL8SZ1gc-Bs)-GBhLgXGNovk5i%S4M-9%0uIB8!vc9Nvf=dmMt-NvQa7AxUz3Au2 zx)+en?W$1h^CvL3xHZB9@nh1ufH5GVR`(9wWc~2>GDWD6CKaGbmzvfl$CREW(tC+W z-N7Nhq(4kwI*~@@$I+=k*Ex7LGg8T=X41O6peUFtrky|_=qF_GLM~A6aFJ$#L>-XG zSoCNj1Xj3Z(orG#cNAq%m#IIy)YQYvfP{xf?UmnxEz z><&-_gVMk#NbE~1Hfoj2>iL5m(r1A&)0s%&K9XYJIu|m)qA3-~1J+L$<%yLRV8bPH zHjbwC^9L*G^9KvD>RBc2^H%tNfX$MRI%oj~aXKPu#bIpOJH~4^_A6hivsH5QWbu{EDKv3AtGrajL zF|gvJn9y5cUb41a39=APOw(bA0?<|5-Vtgp*A&|}9|oil6uvFA1M5F8+48DSUX$fu ziuuDBrLau{=V}J9M?lbhDqHXLar|k72;St9svs4TshdvFbh{{t;Kc&NZ)zIaBnZaW zW4`Vxia}U9ssW1kDBuD$;G$8LIz3pKb$fgIX%FpRYuUY`wW?dfAF4skdY0u6!Jv?) zx0hu{AJUA!wS0s>C{J<$-WoA*oM`YwZ*`N7{gk?(4WO=-4_}wl$;F}0?rr~A|BLwh z(p`+yAOnO9ujV)+9UV;;bu~e8lD((b`*~B(7}w(FfA}bhveHZKPvc`{J8K)qpXM+O zzyMxWaw!ugC29UVVX*R)vB0V)*fT(z#;J1rTYnBq{ltw(|Fkvx^l0bb0yF@gs7%(Ae0DC z@1!N-c8%;#NKO@?O0lg)luH1}&Hx*pbs6x{R`(_t!Y5p6B3tLk_GyZJ>y116VXcDei(}q2;YAkDv`l$pR%3ssOggMxi8qO63R86~gzLQtex6P@ zgtJqRW)}DeII!q`Ag2S*i92;2WZXPDopp17^KJY8MmJ7C42OR&7Jnl(h%-Fiw;zA8 z+yjEP0-Vaj>`<^N`RGx)IFB;MQanSJGe+~oziW>(5Uz)6gs+EOxq|foWC-1uAlfke zl?_HrZiapt_izIAto6;XP|1*=>`2zZnyY8rsmcmi~qquLNAKDCW zO=b|f_a*6*%0KIE&78q*ex(t=2*97}5YB;(O6rcz69a}JUf#+eGj_?6hMQsFw`R@V z45=nF&GR@NyNeb!pPjTpvjuesz zZ)Ry7+sUiS4|4tC+55MVptJW|{_4$@`3OqhmhP+Wph+lTKfFg!?8iDTy_fjjESWkD zRANnIeD2HTal)7$DO|l*GRaH`Lx3PfODj_qLIi|p z5h7EVgp>q~LInXahABb_DMEk{A&?LtK;UlAx#v0O{JZzZdG7tu{VPxQv%l}ln|G~u zt+jt~cCu61t+87{K|#g-(ghaB7e zUD0{kg1#emSIM4ByBv2t`TSUF-dTrRdmi0(-kJBc!_Svrx4b*E-V_$8_1z(K!!SZI z^zgxri}(GRwNjjAfuo`VdVHHpQ&33WW%!+P>KC^U)!jPv`Tnneda<+pYvft=ol0NX z`0Tj;)n7OND#Bl#@V|k>60=6>1yLeo*Lo%|3x&cOtHQ6J{X4i6xd|QVs<(NOw@5$# z%dJyCz1m2ceG2!RoW9rp=+3`k^3?3xixem*Tt}b#FHd|zsv@_g{EThil|ZufiGQLs z^Lo@3#V2dd9{-JH;;$h_HK}T4|FY_7LrV9py}Axc|0AeB-@Og9jM#&0ef;L0ZMoOd z+jGGeb;I$~VdVY`J&WDX>Vnq4hk31i|LV`n-+bCL<8b&mttDZ{S|M;0ue+H{-LgH1 zn6HsB-{>ak({BGiW|-=ePbfkfB?7g3jkeW--C^a7VyAaZ4AKz@mGlm#A&i=yp5E2f z_0s1QiFqL7RZYfcXx86ZH5`?xR_{?0(0FatD7X8D6)DHIl&RmZk40^7h!`@`$&)A1 z296UMYXVezUjQa9Zgp`nlH;qK-to|x&pRuC#_hU1x%B%|Pb|GJh5Y<|7}QrNh49O_ zzI!N!({9(+)^e4UWB&NFcY}p$7sSvw^I~f_RB5dN??7D4V+FY)5VQxs^F*){Zft2l zy3_lzlt?-XN4J^Me<1}!N-KW%*W9g_#t`t|yOUC1^ z5E-52(-N6b7y{)+Ym-Q%oaY?Siv+}5r!q$bf?SE|H0b4vUGsFgGu`1-D9sI`BJs?4 z_2Djb3i=Hal`0jB`zAYJEx0I`U!*LXdVU*7kG>i6rsNI^uZk)`Caev%L)s zO%Ixzy=&v>D5thk5rr*mc+67mldL2qq+*Q z(RZqpv4lJ9FbXA4<_VuV(Wm@_n&U(vQ9Dgz2S*TZHAB?y3&oo3?jn_}&B%xa0O%iWzjxAxA(R`^?%IEvHdF#&q$oIMVByvk0 zWE!kVxOrguqqbPSnfId7Lved(O@6Y=%SlBg@5IlYp5)OL?Wjm_9Z0{E#q7~^MBR_& z!d{K(lQlB!v!9e^^)2ivxypyv6sZPQ_t%8l^AGg$>fnK1EshEAz2cAI&sh6=*mR-Z zrTMLD65(1-HJ(=24xxSnnLa45sdcMr(7s1jT7FoaXn(pV=e=lE;0}S2kCFH0Qp!&xZ-p%asIKlSGTFbvR|_8PuWr7 zb7p%PMY{d%5dI)mXeG?o_>99p>D?mF=Hj2-!CpVDfl>9&P;@mwcz-94A--Bj=+=*z zm<`Q5jBLy+pE*xn^d-P=J#h@ zEL}|RxZXH2#^dq0+$K$Z5vq(Lq|@ovDO=TURh^y*Dq9}qLnW%q7Sd`#`qM^?Tvw!s^@n9z%?wO?Mv@Cq}}Hq0=m-23#S5K zu3Ei4J~32GotcrylB{6A{~*wk0#LNijdsT?Tv@zZzVETTgb-GhcTu-4qTL zABhO)OMp&!$_}C0SLptlWbR#1PNu}FP3!m-d2M!1q9seOwN+iVh^l2Lr01b=>wPfH z1&JtSJN(rU{Wj6PWnLz0vB-k;9Tqh@Tx%`mnBxWsAx$%SQ!on}Kj;0SD0v>}x~F;d zJG_otLS4RJzZ@X?BqO3}McYWo@8PGT5BAGL1R|sA0Uj0wG|93OX~7vf*+}^yHlUVi z-ip?W8w0OT8~Af7Ela~9e@vZX&;_{7`jPN>oOJ10XvE3iu#UdFJvuvZv~ETh3T5c#1hofZ8W0SrT#n27;)?mkZO7txqgr#%Fz zQV*>ZJ6NS@VkEiKIaf@LdN&d;z_-59dv%PNTdL-B3{Ic?1t+rEWozWEWE*ZFRI0()WMjo(gJl3xf3@F$!W=<1NUbhx zN+A%WZI2oRYHhbV%eQ9MWI&9f~xXYb2LijT-%Ar*Hau=z?8F#BP8_)I(Q(4k%Bp-~qO#Jq6wv<~s_BB; z=1oZ&doL@gDW=KsDK{rV&9w5d%@6!IKmbopP6jk4H16lmRfKj-obrb! zXfRgc{p|^9X)k@~+-W^t^`JhtD7n_P0=$TJGiZw+HxWF#gFOQb`r*go~YXN21I8396U@#O!p}1Ae$9fJIhp^gd1(lWgz5FDr2rsZ>LQISm zJKh462&)jDUW4MIOThaMO9?$}4D19dT!^$RJL@NvC6$aq^#hq}dA5pWDbw}jMpRT| zh0FZ!j`Ei@3Y9ajcd_h>57%YRPAgeBD;o&6 zR^n&G1j68s_Hkf`{w{1pi=Py5xFex%(}EF_xIp~C<8a9+aT8)dC}MgMfo;Z2^wDGC zRPEHEc+nWb6Vs=FYK#Jc6G|KVTMSbF0Tp=5?tnAqL6bv&ezABq;0vwu0 z6-5XjWFiuo-TG!m0^X)yy?>5j7Y8WO&N+eG%a*MSz);s+Nd7Jg6azX{fmrg**a zt$%$KG2(JrVh&e2M*N{K{Uc_J>JDogjCR@Llf>f=sP9z_^CgW=D#qmw0Pi%o1mlXk zE+*YZ3#FsR*&K+Ls_d9`)7b>*LINx#D0Fe~0n0t!qay)gfNcifAHo2Q#}j??3;Hf- zV!nyA$gVj&x}NgkV1$&_=%X9ukn)EKaIo!51UTs|@$0{5Z`JDKL#C;s9(6Yb!8tG$ z^u<`o{{LuJyB2s#9UyAY1E2jFwyms~)_o&d=&R6r4*(yyc>#T*9u2%t1|<;qHc4t3YBMe3m1nZT4t+1^U_{s6RAUW`PxIm%zp0pcCN z)p~7FVZ0r&T1b;KvsFy?o6-1VU0PYT?iJ@f05*<| zqa=cc8A@ZAv@E`~+WHS%8=mh==Yr;$m6fBS>Cf8gsc3KSBf0i6>=PCxx_}>DFka|* zM1)!$ypKSfAoi}T!wQ54W@%6}$v2^jXhfd_+0zph68mJ?`tN7}j*tmG3f@c|Q zOg%q(jcl-G3SctSlb?77^lFnSwPddO^!xc+o?)YoS6RIEl>SWGuK2 zN7)#K@HLKNCJ$?jD_09*M#C={0ys=40`Ga8vJWz9?7u4!IK3V)SvIa>e6{`+hEECV4mo1z`~N4 z5*7zj&kZ*vG2!16Gx+ys(0LE9kYiB?k@BjJJD(3@^Q^h#JUV21&Dz@9)P(RENZy!i zw2U^T;zn&QRa|r3FUWjx6I>|nB1AcxoMJx3gAfSB{2k66k@v^ESRXzOyl1f~=-G7J zCo$RhvblA+LQMw+?ai#ksl$bE@!8dK=cBl)SU)_)KYzHRQf!#T8b9(6%){wTcB0oDh0_*fqZG8`tO>6|_ zeEDH0)+QU2)V(P+W%tbt5iJqp)#o*GX$%GoYY(?EDeCL!=(u5Y4MfxjCxT4Wl@~;! zobd}-2WTENw%pUoy6^?90erS->n(K$K<@y7JhN=@u7x$h#~llRCBsrXCKjh}JT01q z%fZ-K1}}oj0iwsrBTe_kv+<-?K!%D-Hq&xClFLHJ#l?{u%1_&bId3XIbk_zQs7=-7{AIrGg|+hcuD;xI92L2nZ&^BuU^WT3XJ_3gao>H=_yM7laUPGODPv=-e_ zq>-^a8Z#-8*0uvb8bG~>$LP&>8eurqu6h|VJj)TZG$3bbT>xa1Yyk*Hz8u!$9T80$ zOdw+3bo5xaWQA~K$6ud`D=8`I5m*G*mlEG30zit;ahpt2OnaGRWeqWHE4@@JYH@ha z*llhm{=8~tW=8xf?nFM7RC_yL;-t7;e2o2I(yG`AV+U)mLa@wGczOAgF8&QAjT zF&-Ztfq@k36br_;H7EAaZtGIC5c;G7g5ob6cQqg&o>Xir<$P=b%>3wlter?N)It>? zG?PM2?b2SN@Y)^M$`xNgq040E#O4`aK&-aJ3etXABFa z6~`Bn3bSW+w95WqZ87)E#(UW4t1Tyu2FG%{PAy+EoWHvT`242?Yf0{X;{x2KwEo8{mH*7^(aG%{ aM-?p9tIK=81m65A*k5$IKsoR8<9`8h#`-t_ literal 0 HcmV?d00001 diff --git a/tests/snapshots/stax/test_sign_tx_short_msg/00001.png b/tests/snapshots/stax/test_sign_tx_short_msg/00001.png new file mode 100644 index 0000000000000000000000000000000000000000..650341df4e2fe954ffb2194c6e6558edb7efe967 GIT binary patch literal 8036 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 literal 0 HcmV?d00001 diff --git a/tests/snapshots/stax/test_sign_tx_short_msg/00002.png b/tests/snapshots/stax/test_sign_tx_short_msg/00002.png new file mode 100644 index 0000000000000000000000000000000000000000..78bbaaf73f8284e38b5e4bb9ff97e8af5b0e774b GIT binary patch literal 8440 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 N%+0JX)n9N={5R*mQaS(t literal 0 HcmV?d00001 diff --git a/tests/snapshots/stax/test_sign_tx_short_msg/00003.png b/tests/snapshots/stax/test_sign_tx_short_msg/00003.png new file mode 100644 index 0000000000000000000000000000000000000000..c1a8fd4eb09009370b79a8e7d92355e84bad3426 GIT binary patch literal 5084 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 V;oxWo&XzMUc)I$ztaD0e0sxoPy_Em} literal 0 HcmV?d00001 diff --git a/tests/snapshots/stax/test_sign_tx_short_tx/00003.png b/tests/snapshots/stax/test_sign_tx_short_tx/00003.png new file mode 100644 index 0000000000000000000000000000000000000000..90c9f759cc3f299650d7c361c63815b5e533e363 GIT binary patch literal 9157 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 :point_right: Every path on this document assumes you are at the root of the repository. - -These tests are implemented in Python with the `SpeculosClient` interface which -allows easy execution on the [Speculos](https://github.com/LedgerHQ/speculos) -emulator. - - -## Dependencies - -Python dependencies are listed in [requirements.txt](requirements.txt), install -them using [pip](https://pypi.org/project/pip/) - -``` -pip install --extra-index-url https://test.pypi.org/simple/ -r requirements.txt -``` - -The extra index allows to fetch the latest version of Speculos. - - -## Launch the tests - -Given the requirements are installed, just do: - -``` -pytest tests/speculos/ -``` \ No newline at end of file diff --git a/tests/speculos/aptos_client b/tests/speculos/aptos_client deleted file mode 120000 index 20b8dd6..0000000 --- a/tests/speculos/aptos_client +++ /dev/null @@ -1 +0,0 @@ -../aptos_client \ No newline at end of file diff --git a/tests/speculos/conftest.py b/tests/speculos/conftest.py deleted file mode 100644 index fda2939..0000000 --- a/tests/speculos/conftest.py +++ /dev/null @@ -1,53 +0,0 @@ -from collections import namedtuple -from pathlib import Path - -import pytest - -from speculos.client import SpeculosClient - -from aptos_client.aptos_speculos_cmd import AptosSpeculosCommand - - -SCRIPT_DIR = Path(__file__).absolute().parent -API_URL = "http://127.0.0.1:5000" - - -def pytest_addoption(parser): - parser.addoption("--model", - action="store", - default="nanos") - - -@pytest.fixture(scope="session") -def model(pytestconfig): - return pytestconfig.getoption("model") - - - -@pytest.fixture(scope="module") -def sw_h_path(): - # path with tests - conftest_folder_path: Path = Path(__file__).parent - # sw.h should be in ../../src/sw.h - sw_h_path = conftest_folder_path.parent.parent / "src" / "sw.h" - - if not sw_h_path.is_file(): - raise FileNotFoundError(f"Can't find sw.h: '{sw_h_path}'") - - return sw_h_path - - -@pytest.fixture -def client(model): - file_path = SCRIPT_DIR.parent.parent / "bin" / "app.elf" - args = ['--model', model] - with SpeculosClient(app=str(file_path), args=args) as client: - yield client - - -@pytest.fixture -def cmd(client): - yield AptosSpeculosCommand( - client=client, - debug=True - ) diff --git a/tests/speculos/requirements.txt b/tests/speculos/requirements.txt deleted file mode 100644 index f8ec13f..0000000 --- a/tests/speculos/requirements.txt +++ /dev/null @@ -1,6 +0,0 @@ -speculos -pytest==6.2.5 -ledgercomm==1.1.2 -ecdsa==0.16.1 -pysha3==1.0.2 -pynacl==1.3.0 diff --git a/tests/speculos/setup.cfg b/tests/speculos/setup.cfg deleted file mode 100644 index c79fd88..0000000 --- a/tests/speculos/setup.cfg +++ /dev/null @@ -1,20 +0,0 @@ -[tool:pytest] -addopts = --strict-markers - -[pylint] -disable = C0114, # missing-module-docstring - C0115, # missing-class-docstring - C0116, # missing-function-docstring - C0103, # invalid-name - R0801, # duplicate-code - R0913 # too-many-arguments -extension-pkg-whitelist=hid - -[pycodestyle] -max-line-length = 90 - -[mypy-hid.*] -ignore_missing_imports = True - -[mypy-pytest.*] -ignore_missing_imports = True diff --git a/tests/speculos/test_appname_cmd.py b/tests/speculos/test_appname_cmd.py deleted file mode 100644 index aa4c84d..0000000 --- a/tests/speculos/test_appname_cmd.py +++ /dev/null @@ -1,2 +0,0 @@ -def test_app_name(cmd): - assert cmd.get_app_name() == "Aptos" diff --git a/tests/speculos/test_error_cmd.py b/tests/speculos/test_error_cmd.py deleted file mode 100644 index ecb7b5a..0000000 --- a/tests/speculos/test_error_cmd.py +++ /dev/null @@ -1,42 +0,0 @@ -import pytest - -from speculos.client import ApduException - -from aptos_client.exception import * - - -@pytest.mark.xfail(raises=ClaNotSupportedError) -def test_bad_cla(client): - try: - client.apdu_exchange(cla=0xa0, # 0xa0 instead of 0x5b - ins=0x03) - except ApduException as error: - raise DeviceException(error_code=error.sw) - - -@pytest.mark.xfail(raises=InsNotSupportedError) -def test_bad_ins(client): - try: - client.apdu_exchange(cla=0x5b, - ins=0xff) # bad INS - except ApduException as error: - raise DeviceException(error_code=error.sw) - - -@pytest.mark.xfail(raises=WrongP1P2Error) -def test_wrong_p1p2(client): - try: - client.apdu_exchange(cla=0x5b, - ins=0x03, - p1=0x01) # 0x01 instead of 0x00 - except ApduException as error: - raise DeviceException(error_code=error.sw) - - -@pytest.mark.xfail(raises=WrongDataLengthError) -def test_wrong_data_length(client): - try: - # APDUs must be at least 5 bytes: CLA, INS, P1, P2, Lc. - client._apdu_exchange(b"5B030000") - except ApduException as error: - raise DeviceException(error_code=error.sw) diff --git a/tests/speculos/test_name_version.py b/tests/speculos/test_name_version.py deleted file mode 100644 index 1fd1407..0000000 --- a/tests/speculos/test_name_version.py +++ /dev/null @@ -1,5 +0,0 @@ -def test_get_app_and_version(cmd): - app_name, version = cmd.get_app_and_version() - - assert app_name == "Aptos" - assert version == "0.6.3" diff --git a/tests/speculos/test_pubkey_cmd.py b/tests/speculos/test_pubkey_cmd.py deleted file mode 100644 index 4d1e81b..0000000 --- a/tests/speculos/test_pubkey_cmd.py +++ /dev/null @@ -1,8 +0,0 @@ -def test_get_public_key(cmd): - pub_key, chain_code = cmd.get_public_key( - bip32_path="m/44'/637'/1'/0'/0'", - display=False - ) # type: bytes, bytes - - assert len(pub_key) == 33 - assert len(chain_code) == 32 diff --git a/tests/speculos/test_sign_raw_cmd.py b/tests/speculos/test_sign_raw_cmd.py deleted file mode 100644 index 1f111bf..0000000 --- a/tests/speculos/test_sign_raw_cmd.py +++ /dev/null @@ -1,25 +0,0 @@ -from nacl.signing import VerifyKey -from nacl.exceptions import BadSignatureError - -from aptos_client.exception import * - - -def test_sign_raw_tx(cmd, model): - message = bytes.fromhex("b5e97db07fa0bd0e5598aa3643a9bc6f6693bddc1a9fec9e674a461eaa00b193783135e8b00430253a22ba041d860c373d7a1501ccf7ac2d1ad37a8ed2775aee000000000000000002000000000000000000000000000000000000000000000000000000000000000104636f696e087472616e73666572010700000000000000000000000000000000000000000000000000000000000000010a6170746f735f636f696e094170746f73436f696e000220094c6fc0d3b382a599c37e1aaa7618eff2c96a3586876082c4594c50c50d7dde082a00000000000000204e0000000000006400000000000000565c51630000000022") - bip32_path: str = "m/44'/637'/1'/0'/0'" - - pub_key, chain_code = cmd.get_public_key( - bip32_path=bip32_path, - display=False - ) # type: bytes, bytes - - pk = VerifyKey(pub_key[1:]) - - der_sig = cmd.sign_raw(bip32_path=bip32_path, - data=message, - model=model) - - try: - pk.verify(signature=der_sig, smessage=message) - except BadSignatureError as exc: - assert False, exc diff --git a/tests/speculos/test_status_word.py b/tests/speculos/test_status_word.py deleted file mode 100644 index 2b929ba..0000000 --- a/tests/speculos/test_status_word.py +++ /dev/null @@ -1,39 +0,0 @@ -from pathlib import Path -from typing import List, Dict, Any, Tuple -import re - -from aptos_client.exception import DeviceException - - -SW_RE = re.compile(r"""(?x) - \# # character '#' - define # string 'define' - \s+ # spaces - (?PSW(?:_[A-Z0-9]+)*) # identifier (e.g. 'SW_OK') - \s+ # spaces - 0x(?P[a-fA-F0-9]{4}) # 4 bytes status word -""") - - -def parse_sw(path: Path) -> List[Tuple[str, int]]: - if not path.is_file(): - raise FileNotFoundError(f"Can't find file: '{path}'") - - sw_h: str = path.read_text() - - return [(identifier, int(sw, base=16)) - for identifier, sw in SW_RE.findall(sw_h) if sw != "9000"] - - -def test_status_word(sw_h_path): - expected_status_words: List[Tuple[str, int]] = parse_sw(sw_h_path) - status_words: Dict[int, Any] = DeviceException.exc - - assert len(expected_status_words) == len(status_words), ( - f"{expected_status_words} doesn't match {status_words}") - - # just keep status words - expected_status_words = [sw for (identifier, sw) in expected_status_words] - - for sw in status_words.keys(): - assert sw in expected_status_words, f"{status_words[sw]}({hex(sw)}) not found in sw.h!" diff --git a/tests/speculos/test_version_cmd.py b/tests/speculos/test_version_cmd.py deleted file mode 100644 index 11eeeb1..0000000 --- a/tests/speculos/test_version_cmd.py +++ /dev/null @@ -1,2 +0,0 @@ -def test_version(cmd): - assert cmd.get_version() == (0, 6, 3) diff --git a/tests/test_app_mainmenu.py b/tests/test_app_mainmenu.py new file mode 100644 index 0000000..4ef565d --- /dev/null +++ b/tests/test_app_mainmenu.py @@ -0,0 +1,25 @@ +from ragger.navigator import NavInsID, NavIns + +from utils import ROOT_SCREENSHOT_PATH + + +# In this test we check the behavior of the device main menu +def test_app_mainmenu(firmware, navigator, test_name): + # Navigate in the main menu + if firmware.device.startswith("nano"): + instructions = [ + NavInsID.RIGHT_CLICK, + NavInsID.RIGHT_CLICK, + NavInsID.RIGHT_CLICK + ] + else: + instructions = [ + NavInsID.USE_CASE_HOME_SETTINGS, + NavInsID.USE_CASE_SETTINGS_NEXT, + NavIns(NavInsID.TOUCH, (200, 113)), + NavIns(NavInsID.TOUCH, (200, 113)), + NavInsID.USE_CASE_CHOICE_REJECT, + NavInsID.USE_CASE_SETTINGS_MULTI_PAGE_EXIT + ] + navigator.navigate_and_compare(ROOT_SCREENSHOT_PATH, test_name, instructions, + screen_change_before_first_instruction=False) diff --git a/tests/test_appname_cmd.py b/tests/test_appname_cmd.py new file mode 100644 index 0000000..0f53315 --- /dev/null +++ b/tests/test_appname_cmd.py @@ -0,0 +1,12 @@ +from application_client.aptos_command_sender import AptosCommandSender +from application_client.aptos_response_unpacker import unpack_get_app_name_response + + +# In this test we check that the GET_APP_NAME replies the application name +def test_app_name(backend): + # Use the app interface instead of raw interface + client = AptosCommandSender(backend) + # Send the GET_APP_NAME instruction to the app + response = client.get_app_name() + # Assert that we have received the correct appname + assert unpack_get_app_name_response(response.data) == "Aptos" diff --git a/tests/test_error_cmd.py b/tests/test_error_cmd.py new file mode 100644 index 0000000..5ad45a5 --- /dev/null +++ b/tests/test_error_cmd.py @@ -0,0 +1,57 @@ +import pytest + +from ragger.error import ExceptionRAPDU +from application_client.aptos_command_sender import CLA, InsType, P1, P2, Errors + + +# Ensure the app returns an error when a bad CLA is used +def test_bad_cla(backend): + with pytest.raises(ExceptionRAPDU) as e: + backend.exchange(cla=CLA + 1, ins=InsType.GET_VERSION) + assert e.value.status == Errors.SW_CLA_NOT_SUPPORTED + + +# Ensure the app returns an error when a bad INS is used +def test_bad_ins(backend): + with pytest.raises(ExceptionRAPDU) as e: + backend.exchange(cla=CLA, ins=0xff) + assert e.value.status == Errors.SW_INS_NOT_SUPPORTED + + +# Ensure the app returns an error when a bad P1 or P2 is used +def test_wrong_p1p2(backend): + with pytest.raises(ExceptionRAPDU) as e: + backend.exchange(cla=CLA, ins=InsType.GET_VERSION, p1=P1.P1_START + 1, p2=P2.P2_LAST) + assert e.value.status == Errors.SW_WRONG_P1P2 + with pytest.raises(ExceptionRAPDU) as e: + backend.exchange(cla=CLA, ins=InsType.GET_VERSION, p1=P1.P1_START, p2=P2.P2_MORE) + assert e.value.status == Errors.SW_WRONG_P1P2 + with pytest.raises(ExceptionRAPDU) as e: + backend.exchange(cla=CLA, ins=InsType.GET_APP_NAME, p1=P1.P1_START + 1, p2=P2.P2_LAST) + assert e.value.status == Errors.SW_WRONG_P1P2 + with pytest.raises(ExceptionRAPDU) as e: + backend.exchange(cla=CLA, ins=InsType.GET_APP_NAME, p1=P1.P1_START, p2=P2.P2_MORE) + assert e.value.status == Errors.SW_WRONG_P1P2 + + +# Ensure the app returns an error when a bad data length is used +def test_wrong_data_length(backend): + # APDUs must be at least 5 bytes: CLA, INS, P1, P2, Lc. + with pytest.raises(ExceptionRAPDU) as e: + backend.exchange_raw(b"E0030000") + assert e.value.status == Errors.SW_WRONG_DATA_LENGTH + # APDUs advertises a too long length + with pytest.raises(ExceptionRAPDU) as e: + backend.exchange_raw(b"E003000005") + assert e.value.status == Errors.SW_WRONG_DATA_LENGTH + + +# Ensure there is no state confusion when trying wrong APDU sequences +def test_invalid_state(backend): + with pytest.raises(ExceptionRAPDU) as e: + backend.exchange(cla=CLA, + ins=InsType.SIGN_TX, + p1=P1.P1_START + 1, # Try to continue a flow instead of start a new one + p2=P2.P2_MORE, + data=b"abcde") # data is not parsed in this case + assert e.value.status == Errors.SW_BAD_STATE diff --git a/tests/test_name_version.py b/tests/test_name_version.py new file mode 100644 index 0000000..522a33e --- /dev/null +++ b/tests/test_name_version.py @@ -0,0 +1,15 @@ +from application_client.aptos_command_sender import AptosCommandSender +from application_client.aptos_response_unpacker import unpack_get_app_and_version_response + + +# Test a specific APDU asking BOLOS (and not the app) the name and version of the current app +def test_get_app_and_version(backend, backend_name): + # Use the app interface instead of raw interface + client = AptosCommandSender(backend) + # Send the special instruction to BOLOS + response = client.get_app_and_version() + # Use an helper to parse the response, assert the values + app_name, version = unpack_get_app_and_version_response(response.data) + + assert app_name == "Aptos" + assert version == "0.6.3" diff --git a/tests/test_pubkey_cmd.py b/tests/test_pubkey_cmd.py new file mode 100644 index 0000000..3626a71 --- /dev/null +++ b/tests/test_pubkey_cmd.py @@ -0,0 +1,101 @@ +import pytest + +from application_client.aptos_command_sender import AptosCommandSender, Errors +from application_client.aptos_response_unpacker import unpack_get_public_key_response +from ragger.bip import calculate_public_key_and_chaincode, CurveChoice +from ragger.error import ExceptionRAPDU +from ragger.navigator import NavInsID, NavIns +from utils import ROOT_SCREENSHOT_PATH + + +# In this test we check that the GET_PUBLIC_KEY works in non-confirmation mode +def test_get_public_key_no_confirm(backend): + for path in ["m/44'/637'/1'/0'/0'", "m/44'/637'/0'/0'/1'", "m/44'/637'/255'/255'/255'", "m/44'/637'/2147483647'/0'/0'/0'/0'/0'/0'/0'"]: + client = AptosCommandSender(backend) + response = client.get_public_key(path=path).data + _, public_key, _, chain_code = unpack_get_public_key_response(response) + + ref_public_key, ref_chain_code = calculate_public_key_and_chaincode(CurveChoice.Ed25519Slip, path=path) + ref_public_key_bytes = bytearray.fromhex(ref_public_key) + ref_public_key_bytes[0] = 0x04 # Set the first byte to 0x04 to indicate that it is uncompressed + + assert public_key.hex() == ref_public_key_bytes.hex() + assert chain_code.hex() == ref_chain_code + + +# In this test we check that the GET_PUBLIC_KEY works in confirmation mode +def test_get_public_key_confirm_accepted(firmware, backend, navigator, test_name): + client = AptosCommandSender(backend) + path = "m/44'/637'/1'/0'/0'" + with client.get_public_key_with_confirmation(path=path): + if firmware.device.startswith("nano"): + navigator.navigate_until_text_and_compare(NavInsID.RIGHT_CLICK, + [NavInsID.BOTH_CLICK], + "Approve", + ROOT_SCREENSHOT_PATH, + test_name) + else: + instructions = [ + NavInsID.USE_CASE_REVIEW_TAP, + NavIns(NavInsID.TOUCH, (200, 335)), + NavInsID.USE_CASE_ADDRESS_CONFIRMATION_EXIT_QR, + NavInsID.USE_CASE_ADDRESS_CONFIRMATION_CONFIRM, + NavInsID.USE_CASE_ADDRESS_CONFIRMATION_CONFIRM, + NavInsID.USE_CASE_STATUS_DISMISS + ] + navigator.navigate_and_compare(ROOT_SCREENSHOT_PATH, + test_name, + instructions) + response = client.get_async_response().data + _, public_key, _, chain_code = unpack_get_public_key_response(response) + + ref_public_key, ref_chain_code = calculate_public_key_and_chaincode(CurveChoice.Ed25519Slip, path=path) + ref_public_key_bytes = bytearray.fromhex(ref_public_key) + ref_public_key_bytes[0] = 0x04 # Set the first byte to 0x04 to indicate that it is uncompressed + print(f"MUTABLE DATA: {ref_public_key_bytes.hex()}") + + print(f"Public key: {public_key.hex()}") + print(f"Ref public key: {ref_public_key}") + print(f"Chain code: {chain_code.hex()}") + print(f"Ref chain code: {ref_chain_code}") + assert public_key.hex() == ref_public_key_bytes.hex() + assert chain_code.hex() == ref_chain_code + + +# In this test we check that the GET_PUBLIC_KEY in confirmation mode replies an error if the user refuses +def test_get_public_key_confirm_refused(firmware, backend, navigator, test_name): + client = AptosCommandSender(backend) + path = "m/44'/637'/1'/0'/0'" + + if firmware.device.startswith("nano"): + with pytest.raises(ExceptionRAPDU) as e: + with client.get_public_key_with_confirmation(path=path): + navigator.navigate_until_text_and_compare(NavInsID.RIGHT_CLICK, + [NavInsID.BOTH_CLICK], + "Reject", + ROOT_SCREENSHOT_PATH, + test_name) + # Assert that we have received a refusal + assert e.value.status == Errors.SW_DENY + assert len(e.value.data) == 0 + else: + instructions_set = [ + [ + NavInsID.USE_CASE_REVIEW_REJECT, + NavInsID.USE_CASE_STATUS_DISMISS + ], + [ + NavInsID.USE_CASE_REVIEW_TAP, + NavInsID.USE_CASE_ADDRESS_CONFIRMATION_CANCEL, + NavInsID.USE_CASE_STATUS_DISMISS + ] + ] + for i, instructions in enumerate(instructions_set): + with pytest.raises(ExceptionRAPDU) as e: + with client.get_public_key_with_confirmation(path=path): + navigator.navigate_and_compare(ROOT_SCREENSHOT_PATH, + test_name + f"/part{i}", + instructions) + # 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..5b4fc9c --- /dev/null +++ b/tests/test_sign_cmd.py @@ -0,0 +1,171 @@ +import pytest + +from application_client.aptos_command_sender import AptosCommandSender, Errors +from application_client.aptos_response_unpacker import unpack_get_public_key_response, unpack_sign_tx_response +from ragger.error import ExceptionRAPDU +from ragger.navigator import NavInsID +from utils import ROOT_SCREENSHOT_PATH, check_signature_validity + +# 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 +def test_sign_tx_short_tx(firmware, backend, navigator, test_name): + # Use the app interface instead of raw interface + client = AptosCommandSender(backend) + # The path used for this entire test + path: str = "m/44'/637'/1'/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 = bytes.fromhex("b5e97db07fa0bd0e5598aa3643a9bc6f6693bddc1a9fec9e674a461eaa00b193783135e8b00430253a22ba041d860c373d7a1501ccf7ac2d1ad37a8ed2775aee000000000000000002000000000000000000000000000000000000000000000000000000000000000104636f696e087472616e73666572010700000000000000000000000000000000000000000000000000000000000000010a6170746f735f636f696e094170746f73436f696e000220094c6fc0d3b382a599c37e1aaa7618eff2c96a3586876082c4594c50c50d7dde082a00000000000000204e0000000000006400000000000000565c51630000000022") + + # 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(path=path, transaction=transaction): + # Validate the on-screen request by performing the navigation appropriate for this device + if firmware.device.startswith("nano"): + navigator.navigate_until_text_and_compare(NavInsID.RIGHT_CLICK, + [NavInsID.BOTH_CLICK], + "Approve", + ROOT_SCREENSHOT_PATH, + test_name) + else: + navigator.navigate_until_text_and_compare(NavInsID.USE_CASE_REVIEW_TAP, + [NavInsID.USE_CASE_REVIEW_CONFIRM, + NavInsID.USE_CASE_STATUS_DISMISS], + "Hold to sign", + ROOT_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 + _, sig, _ = unpack_sign_tx_response(response) + assert check_signature_validity(public_key, sig, transaction) + + +# In this test we send to the device a transaction to sign and validate it on screen +# The transaction will be sent in multiple chunks +# Also, this transaction has a request for blind signing activation +def test_blind_sign_tx_long_tx(firmware, backend, navigator, test_name): + # Use the app interface instead of raw interface + client = AptosCommandSender(backend) + path: str = "m/44'/637'/1'/0'/0'" + + rapdu = client.get_public_key(path=path) + _, public_key, _, _ = unpack_get_public_key_response(rapdu.data) + + transaction = bytes.fromhex("b5e97db07fa0bd0e5598aa3643a9bc6f6693bddc1a9fec9e674a461eaa00b193094c6fc0d3b382a599c37e1aaa7618eff2c96a3586876082c4594c50c50d7dde1b0000000000000002190d44266241744264b964a37b8f09863167a12d3e70cda39376cfb4e3561e120a736372697074735f76320473776170030700000000000000000000000000000000000000000000000000000000000000010a6170746f735f636f696e094170746f73436f696e000743417434fd869edee76cca2a4d2301e528a1551b1d719b75c350c3c97d15b8b905636f696e7304555344540007190d44266241744264b964a37b8f09863167a12d3e70cda39376cfb4e3561e12066375727665730c556e636f7272656c6174656400020800e1f5050000000008decbb30000000000480000000000000064000000000000008a9ba4640000000002") + + with client.sign_tx(path=path, transaction=transaction): + if firmware.device.startswith("nano"): + navigator.navigate_until_text_and_compare(NavInsID.RIGHT_CLICK, + [NavInsID.BOTH_CLICK], + "Allow", + ROOT_SCREENSHOT_PATH, + test_name + "/part0", + screen_change_after_last_instruction=False) + navigator.navigate_until_text_and_compare(NavInsID.RIGHT_CLICK, + [NavInsID.BOTH_CLICK], + "Approve", + ROOT_SCREENSHOT_PATH, + test_name + "/part1") + else: + navigator.navigate_until_text_and_compare(NavInsID.USE_CASE_REVIEW_TAP, + [NavInsID.USE_CASE_CHOICE_CONFIRM, + NavInsID.USE_CASE_STATUS_DISMISS], + "Enable blind signing", + ROOT_SCREENSHOT_PATH, + test_name + "/part0", + screen_change_after_last_instruction=False) + navigator.navigate_until_text_and_compare(NavInsID.USE_CASE_REVIEW_TAP, + [NavInsID.USE_CASE_REVIEW_CONFIRM, + NavInsID.USE_CASE_STATUS_DISMISS], + "Hold to sign", + ROOT_SCREENSHOT_PATH, + test_name + "/part1") + response = client.get_async_response().data + _, sig, _ = unpack_sign_tx_response(response) + assert check_signature_validity(public_key, 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(firmware, backend, navigator, test_name): + # Use the app interface instead of raw interface + client = AptosCommandSender(backend) + path: str = "m/44'/637'/1'/0'/0'" + + transaction = bytes.fromhex("b5e97db07fa0bd0e5598aa3643a9bc6f6693bddc1a9fec9e674a461eaa00b193094c6fc0d3b382a599c37e1aaa7618eff2c96a3586876082c4594c50c50d7dde1b000000000000000200000000000000000000000000000000000000000000000000000000000000010d6170746f735f6163636f756e74087472616e736665720002203835075df1bf469c336eabed8ac87052ee4485f3ec93380a5382fbf76b7a33070840420f000000000006000000000000006400000000000000c39aa4640000000002") + + if firmware.device.startswith("nano"): + with pytest.raises(ExceptionRAPDU) as e: + with client.sign_tx(path=path, transaction=transaction): + navigator.navigate_until_text_and_compare(NavInsID.RIGHT_CLICK, + [NavInsID.BOTH_CLICK], + "Reject", + ROOT_SCREENSHOT_PATH, + test_name) + + # Assert that we have received a refusal + assert e.value.status == Errors.SW_DENY + assert len(e.value.data) == 0 + else: + for i in range(4): + instructions = [NavInsID.USE_CASE_REVIEW_TAP] * i + instructions += [NavInsID.USE_CASE_REVIEW_REJECT, + NavInsID.USE_CASE_CHOICE_CONFIRM, + NavInsID.USE_CASE_STATUS_DISMISS] + with pytest.raises(ExceptionRAPDU) as e: + with client.sign_tx(path=path, transaction=transaction): + navigator.navigate_and_compare(ROOT_SCREENSHOT_PATH, + test_name + f"/part{i}", + instructions) + # Assert that we have received a refusal + assert e.value.status == Errors.SW_DENY + assert len(e.value.data) == 0 + +# In this test we send to the device a message to sign and validate it on screen +# We will ensure that the displayed information is correct by using screenshots comparison +def test_sign_tx_short_msg(firmware, backend, navigator, test_name): + # Use the app interface instead of raw interface + client = AptosCommandSender(backend) + # The path used for this entire test + path: str = "m/44'/637'/1'/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 mes that will be sent to the device for signing + message = bytes("Hello Ledger!", 'utf-8') + + # 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(path=path, transaction=message): + # Validate the on-screen request by performing the navigation appropriate for this device + if firmware.device.startswith("nano"): + navigator.navigate_until_text_and_compare(NavInsID.RIGHT_CLICK, + [NavInsID.BOTH_CLICK], + "Approve", + ROOT_SCREENSHOT_PATH, + test_name) + else: + navigator.navigate_until_text_and_compare(NavInsID.USE_CASE_REVIEW_TAP, + [NavInsID.USE_CASE_REVIEW_CONFIRM, + NavInsID.USE_CASE_STATUS_DISMISS], + "Hold to sign", + ROOT_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 + _, sig, _ = unpack_sign_tx_response(response) + assert check_signature_validity(public_key, sig, message) diff --git a/tests/test_version_cmd.py b/tests/test_version_cmd.py new file mode 100644 index 0000000..f3e8ff3 --- /dev/null +++ b/tests/test_version_cmd.py @@ -0,0 +1,16 @@ +from application_client.aptos_command_sender import AptosCommandSender +from application_client.aptos_response_unpacker import unpack_get_version_response + +# Taken from the Makefile, to update every time the Makefile version is bumped +MAJOR = 0 +MINOR = 6 +PATCH = 3 + +# In this test we check the behavior of the device when asked to provide the app version +def test_version(backend): + # Use the app interface instead of raw interface + client = AptosCommandSender(backend) + # Send the GET_VERSION instruction + rapdu = client.get_version() + # Use an helper to parse the response, assert the values + assert unpack_get_version_response(rapdu.data) == (MAJOR, MINOR, PATCH) diff --git a/tests/utils.py b/tests/utils.py new file mode 100644 index 0000000..b75a6ba --- /dev/null +++ b/tests/utils.py @@ -0,0 +1,16 @@ +from pathlib import Path +from hashlib import sha256 + +from nacl.signing import VerifyKey +from nacl.exceptions import BadSignatureError + + +ROOT_SCREENSHOT_PATH = Path(__file__).parent.resolve() + + +# Check if a signature of a given message is valid +def check_signature_validity(public_key: bytes, signature: bytes, message: bytes) -> bool: + pk = VerifyKey(public_key[1:]) + + return pk.verify(signature=signature, smessage=message) + From d5d17b3b2744c8ffdc26688ea9204053a4baea97 Mon Sep 17 00:00:00 2001 From: vldmkr Date: Mon, 27 Nov 2023 12:52:15 +0200 Subject: [PATCH 15/32] Update workflows for misspellings checks, coding style checks, documentation generation, clang static analyzer, Python client checks, CodeQL checks, build and functional tests. --- .../workflows/build_and_functional_tests.yml | 32 +++ .github/workflows/ci-workflow.yml | 197 ------------------ .github/workflows/clang-scan.yml | 32 +++ ...{codeql-workflow.yml => codeql_checks.yml} | 4 +- .github/workflows/coding_style_checks.yml | 23 ++ .../workflows/documentation_generation.yml | 29 +++ .github/workflows/guidelines_enforcer.yml | 3 - .github/workflows/lint-workflow.yml | 42 ---- .github/workflows/misspellings_checks.yml | 26 +++ .github/workflows/python_client_checks.yml | 42 ++++ .github/workflows/unit_tests.yml | 57 +++++ 11 files changed, 242 insertions(+), 245 deletions(-) create mode 100644 .github/workflows/build_and_functional_tests.yml delete mode 100644 .github/workflows/ci-workflow.yml create mode 100644 .github/workflows/clang-scan.yml rename .github/workflows/{codeql-workflow.yml => codeql_checks.yml} (96%) create mode 100644 .github/workflows/coding_style_checks.yml create mode 100644 .github/workflows/documentation_generation.yml delete mode 100644 .github/workflows/lint-workflow.yml create mode 100644 .github/workflows/misspellings_checks.yml create mode 100644 .github/workflows/python_client_checks.yml create mode 100644 .github/workflows/unit_tests.yml diff --git a/.github/workflows/build_and_functional_tests.yml b/.github/workflows/build_and_functional_tests.yml new file mode 100644 index 0000000..c92fc21 --- /dev/null +++ b/.github/workflows/build_and_functional_tests.yml @@ -0,0 +1,32 @@ +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. +# +# While 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: + 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" diff --git a/.github/workflows/ci-workflow.yml b/.github/workflows/ci-workflow.yml deleted file mode 100644 index 41116f2..0000000 --- a/.github/workflows/ci-workflow.yml +++ /dev/null @@ -1,197 +0,0 @@ -name: Compilation & tests - -on: - workflow_dispatch: - push: - branches: - - main - - develop - pull_request: - branches: - - main - - develop - -jobs: - nano_build: - name: Build Aptos application for NanoS, X and S+ - strategy: - matrix: - include: - - SDK: "$NANOS_SDK" - artifact: aptos-app-nanos - - SDK: "$NANOX_SDK" - artifact: aptos-app-nanox - - SDK: "$NANOSP_SDK" - artifact: aptos-app-nanosp - runs-on: ubuntu-latest - container: - image: ghcr.io/ledgerhq/ledger-app-builder/ledger-app-builder - - steps: - - name: Clone - uses: actions/checkout@v2 - - - name: Build - run: | - git config --global --add safe.directory "$GITHUB_WORKSPACE" - make BOLOS_SDK=${{ matrix.SDK }} - - - name: Upload app binary - uses: actions/upload-artifact@v2 - with: - name: ${{ matrix.artifact }} - path: bin - - job_scan_build: - name: Clang Static Analyzer - runs-on: ubuntu-latest - container: - image: ghcr.io/ledgerhq/ledger-app-builder/ledger-app-builder - - steps: - - name: Clone - uses: actions/checkout@v2 - - - 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 - - - name: Upload scan result - uses: actions/upload-artifact@v2 - if: failure() - with: - name: scan-build - path: scan-build - - job_unit_test: - name: Unit test - runs-on: ubuntu-latest - container: - image: ghcr.io/ledgerhq/ledger-app-builder/ledger-app-builder - - steps: - - name: Install curl - run: apk add curl - - name: Clone - uses: actions/checkout@v2 - - name: Build unit tests - run: | - cd unit-tests/ - cmake -Bbuild -H. && make -C build && make -C build test - - name: Generate code coverage - run: | - cd unit-tests/ - lcov --directory . -b "$(realpath build/)" --capture --initial -o coverage.base && \ - lcov --rc lcov_branch_coverage=1 --directory . -b "$(realpath build/)" --capture -o coverage.capture && \ - lcov --directory . -b "$(realpath build/)" --add-tracefile coverage.base --add-tracefile coverage.capture -o coverage.info && \ - lcov --directory . -b "$(realpath build/)" --remove coverage.info '*/unit-tests/*' -o coverage.info && \ - genhtml coverage.info -o coverage - - - uses: actions/upload-artifact@v2 - with: - name: code-coverage - path: unit-tests/coverage - - - name: Upload to codecov.io - uses: codecov/codecov-action@v3 - with: - token: ${{ secrets.CODECOV_TOKEN }} - file: ./unit-tests/coverage.info - flags: unittests - name: codecov-app-aptos - fail_ci_if_error: true - verbose: true - - job_generate_doc: - name: Generate project documentation - runs-on: ubuntu-latest - - container: - image: ghcr.io/ledgerhq/ledger-app-builder/ledger-app-builder - - steps: - - name: Clone - uses: actions/checkout@v2 - - - name: HTML documentation - run: doxygen .doxygen/Doxyfile - - - uses: actions/upload-artifact@v2 - with: - name: documentation - path: doc/html - - job_functional_test_1: - name: Functional tests with LedgerComm (on Speculos) - strategy: - matrix: - include: - - model: nanos - - model: nanox - - model: nanosp - needs: - - nano_build - runs-on: ubuntu-latest - - container: - image: ghcr.io/ledgerhq/speculos:sha-45cb9a6 - options: --entrypoint /bin/bash - ports: - - 9999:9999 - - 42000:42000 - - 43000:43000 - - steps: - - name: Clone - uses: actions/checkout@v2 - - name: Download app binary - uses: actions/download-artifact@v2 - with: - name: aptos-app-${{matrix.model}} - path: bin - - name: Install dependencies - run: | - apt update && apt install -qy gcc netcat # /!\ needed when installing pysha3 - pip install -r tests/ledgercomm/requirements.txt - - name: Run test - run: | - nohup bash -c "python /speculos/speculos.py bin/app.elf --apdu-port 9999 --button-port 42000 --automation-port 43000 --display headless --model=${{ matrix.model }}" > speculos.log 2<&1 & - until `nc -w5 -z -v 127.0.0.1 9999`; do sleep 1; done; - pytest --headless tests/ledgercomm/ --model=${{ matrix.model }} - - - name: Upload Speculos log - if: ${{ always() }} - uses: actions/upload-artifact@v2 - with: - name: speculos-log - path: speculos.log - - job_functional_test_2: - name: Functional tests with Speculos only - strategy: - matrix: - include: - - model: nanos - - model: nanox - - model: nanosp - needs: - - nano_build - runs-on: ubuntu-latest - - steps: - - name: Clone - uses: actions/checkout@v2 - - name: Download app binary - uses: actions/download-artifact@v2 - with: - name: aptos-app-${{matrix.model}} - path: bin - - name: Install tests dependencies - run: | - sudo apt-get update && sudo apt-get install -y qemu-user-static tesseract-ocr - pip install --extra-index-url https://test.pypi.org/simple/ -r tests/speculos/requirements.txt - - name: Run test - env: - CTEST_OUTPUT_ON_FAILURE: 1 - run: pytest tests/speculos/ --model=${{ matrix.model }} diff --git a/.github/workflows/clang-scan.yml b/.github/workflows/clang-scan.yml new file mode 100644 index 0000000..aea467e --- /dev/null +++ b/.github/workflows/clang-scan.yml @@ -0,0 +1,32 @@ +name: Clang Static Analyzer + +on: + workflow_dispatch: + push: + branches: + - master + - main + - develop + pull_request: + +jobs: + job_scan_build: + runs-on: ubuntu-latest + container: + image: ghcr.io/ledgerhq/ledger-app-builder/ledger-app-builder:latest + + steps: + - name: Clone + uses: actions/checkout@v2 + + - 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 + + - name: Upload scan result + uses: actions/upload-artifact@v2 + if: failure() + with: + name: scan-build + path: scan-build diff --git a/.github/workflows/codeql-workflow.yml b/.github/workflows/codeql_checks.yml similarity index 96% rename from .github/workflows/codeql-workflow.yml rename to .github/workflows/codeql_checks.yml index 3e5b455..2494182 100644 --- a/.github/workflows/codeql-workflow.yml +++ b/.github/workflows/codeql_checks.yml @@ -4,12 +4,10 @@ on: workflow_dispatch: push: branches: + - master - main - develop pull_request: - branches: - - main - - develop # Excluded path: add the paths you want to ignore instead of deleting the workflow paths-ignore: - '.github/workflows/*.yml' diff --git a/.github/workflows/coding_style_checks.yml b/.github/workflows/coding_style_checks.yml new file mode 100644 index 0000000..85ddb84 --- /dev/null +++ b/.github/workflows/coding_style_checks.yml @@ -0,0 +1,23 @@ +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. + +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: 11 diff --git a/.github/workflows/documentation_generation.yml b/.github/workflows/documentation_generation.yml new file mode 100644 index 0000000..1d00c2e --- /dev/null +++ b/.github/workflows/documentation_generation.yml @@ -0,0 +1,29 @@ +name: Generate project documentation + +on: + workflow_dispatch: + push: + branches: + - master + - main + - develop + pull_request: + +jobs: + job_generate_doc: + name: Generate project documentation + 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: HTML documentation + run: doxygen .doxygen/Doxyfile + + - uses: actions/upload-artifact@v3 + with: + name: documentation + path: doc/html diff --git a/.github/workflows/guidelines_enforcer.yml b/.github/workflows/guidelines_enforcer.yml index f1c6db2..fdaf9f2 100644 --- a/.github/workflows/guidelines_enforcer.yml +++ b/.github/workflows/guidelines_enforcer.yml @@ -21,6 +21,3 @@ jobs: guidelines_enforcer: name: Call Ledger guidelines_enforcer uses: LedgerHQ/ledger-app-workflows/.github/workflows/reusable_guidelines_enforcer.yml@v1 - with: - run_for_devices: '["nanos", "nanox", "nanosp"]' - diff --git a/.github/workflows/lint-workflow.yml b/.github/workflows/lint-workflow.yml deleted file mode 100644 index 413d375..0000000 --- a/.github/workflows/lint-workflow.yml +++ /dev/null @@ -1,42 +0,0 @@ -name: Code style check - -on: - workflow_dispatch: - push: - branches: - - main - - develop - pull_request: - branches: - - main - - develop - -jobs: - job_lint: - name: Lint - runs-on: ubuntu-latest - - steps: - - name: Clone - uses: actions/checkout@v2 - - - name: Lint - uses: DoozyX/clang-format-lint-action@v0.11 - with: - source: './src' - extensions: 'h,c' - clangFormatVersion: 11 - - misspell: - name: Check misspellings - runs-on: ubuntu-latest - steps: - - name: Clone - uses: actions/checkout@v2 - with: - fetch-depth: 0 - - name: Check misspellings - uses: codespell-project/actions-codespell@2391250ab05295bddd51e36a8c6295edb6343b0e - with: - builtin: clear,rare - check_filenames: true diff --git a/.github/workflows/misspellings_checks.yml b/.github/workflows/misspellings_checks.yml new file mode 100644 index 0000000..cad279b --- /dev/null +++ b/.github/workflows/misspellings_checks.yml @@ -0,0 +1,26 @@ +name: Misspellings checks + +# This workflow performs some misspelling checks on the repository + +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@v3 + + - name: Check misspellings + uses: codespell-project/actions-codespell@v1 + 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..98da256 --- /dev/null +++ b/.github/workflows/python_client_checks.yml @@ -0,0 +1,42 @@ +name: Checks on the Python client + +# This workflow performs some checks on the Python client used by the Aptos tests + +on: + workflow_dispatch: + push: + branches: + - master + - main + - develop + pull_request: + +jobs: + + lint: + name: Aptos client linting + runs-on: ubuntu-latest + steps: + - name: Clone + uses: actions/checkout@v3 + - name: Installing PIP dependencies + run: | + pip install pylint + pip install --extra-index-url https://test.pypi.org/simple/ -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@v3 + - name: Installing PIP dependencies + run: | + pip install mypy + pip install --extra-index-url https://test.pypi.org/simple/ -r tests/requirements.txt + - name: Mypy type checking + run: | + mypy tests/application_client/ diff --git a/.github/workflows/unit_tests.yml b/.github/workflows/unit_tests.yml new file mode 100644 index 0000000..e779fef --- /dev/null +++ b/.github/workflows/unit_tests.yml @@ -0,0 +1,57 @@ +name: Unit testing with Codecov coverage checking + +on: + workflow_dispatch: + push: + branches: + - master + - main + - develop + pull_request: + +jobs: + job_unit_test: + name: Unit test + 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: Clone SDK + uses: actions/checkout@v3 + with: + repository: ledgerHQ/ledger-secure-sdk + path: sdk + + - name: Build unit tests + run: | + cd unit-tests/ + export BOLOS_SDK=../sdk + cmake -Bbuild -H. && make -C build && make -C build test + + - name: Generate code coverage + run: | + cd unit-tests/ + lcov --directory . -b "$(realpath build/)" --capture --initial -o coverage.base && \ + lcov --rc lcov_branch_coverage=1 --directory . -b "$(realpath build/)" --capture -o coverage.capture && \ + lcov --directory . -b "$(realpath build/)" --add-tracefile coverage.base --add-tracefile coverage.capture -o coverage.info && \ + lcov --directory . -b "$(realpath build/)" --remove coverage.info '*/unit-tests/*' -o coverage.info && \ + genhtml coverage.info -o coverage + + - uses: actions/upload-artifact@v3 + with: + name: code-coverage + path: unit-tests/coverage + + - name: Upload to codecov.io + uses: codecov/codecov-action@v3 + with: + token: ${{ secrets.CODECOV_TOKEN }} + files: ./unit-tests/coverage.info + flags: unittests + name: codecov-app-aptos + fail_ci_if_error: true + verbose: true From 31c6fe7220ef2deb0e30836a1446b5c5ec7bee78 Mon Sep 17 00:00:00 2001 From: vldmkr Date: Mon, 27 Nov 2023 13:01:07 +0200 Subject: [PATCH 16/32] Add ledger_app.toml configuration file --- ledger_app.toml | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 ledger_app.toml diff --git a/ledger_app.toml b/ledger_app.toml new file mode 100644 index 0000000..e557cc8 --- /dev/null +++ b/ledger_app.toml @@ -0,0 +1,8 @@ +[app] +build_directory = "./" +sdk = "C" +devices = ["nanos", "nanox", "nanos+", "stax"] + +[tests] +unit_directory = "./unit-tests/" +pytest_directory = "./tests/" From f895edd5d1258c060ff34900599999f3b60c3234 Mon Sep 17 00:00:00 2001 From: vldmkr Date: Mon, 27 Nov 2023 13:26:57 +0200 Subject: [PATCH 17/32] Temporary remove "stax" from devices list --- ledger_app.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ledger_app.toml b/ledger_app.toml index e557cc8..b223878 100644 --- a/ledger_app.toml +++ b/ledger_app.toml @@ -1,7 +1,7 @@ [app] build_directory = "./" sdk = "C" -devices = ["nanos", "nanox", "nanos+", "stax"] +devices = ["nanos", "nanox", "nanos+"] [tests] unit_directory = "./unit-tests/" From 0aefb161a008acf50775373922e026c119da0233 Mon Sep 17 00:00:00 2001 From: vldmkr Date: Mon, 27 Nov 2023 14:10:31 +0200 Subject: [PATCH 18/32] Version bump to 0.6.6. Update changelog. --- CHANGELOG.md | 100 +++++++++++++++++- Makefile | 2 +- .../stax/test_app_mainmenu/00001.png | Bin 12847 -> 12684 bytes .../stax/test_app_mainmenu/00005.png | Bin 12847 -> 12684 bytes tests/test_name_version.py | 2 +- tests/test_version_cmd.py | 2 +- 6 files changed, 102 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b8caf07..37056dd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,8 +5,106 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [Unreleased] + +## [0.6.6] - 2023-10-06 + +### Added + +- [Nano S/SP/X] Always inform about the blind signing, even if the option is activated in the settings. +- [Nano S/SP/X] Invite users to enable the blind signing setting during the signature request. +- Add MAX_TRANSACTION_PACKETS to Makefile for TARGET_STAX. +- Implement the UI for Ledger Stax. + - Separate the common UI code for BAGL and NBGL. + - Put general functions into utils. + - Refactor BAGL UI (display, menu, settings). + - Implement NBGL UI (display, menu, settings). + - Add Aptos icon for Ledger Stax. +- Add new tests. + +### Fixed + +- Fix typo on Blind Signing warning screen. +- Fix the tests, remove the obsolete ones after an upgrade. +- Use "no_throw" crypto functions instead of deprecated ones. + +### Changed + +- Upgrade to a newer version of the SDK. +- Rewrite existing tests using the Ragger framework. +- Update workflows for misspellings checks, coding style checks, documentation generation, clang static analyzer, Python client checks, CodeQL checks, build and functional tests. + +## [0.4.17] - 2023-04-18 + +### Fixed + +- Reduce the RAM allocated for large transactions. +- Remove the hard-set DEBUG=1 flag in the Makefile. + +## [0.4.15] - 2023-04-12 + +### Added + +- Implement blind signing functionality. +- Add the "Allow Blind Signing" option to the "Settings". +- Add status word for fail to display gas fee (0xB009). + +### Fixed + +- Make sure there is no THROW operator in the CATCH_OTHER block. +- Check for null characters in the middle of the message. +- Make sure the message is a null-terminated string. +- Use blind signing for shortened messages. +- Do not display leading zeros for module addresses, display only meaningful bytes for visual verification. +- Clearer work with the global state. +- Fix the operation of P1 as a sequence number of the chunks on SIGN_TX request. + +### Changed + +- Refactoring transaction displaying. Do not calculate gas fee when displaying a message. +- Get rid of the use of H as a format specifier using the snprintf function while working with the UI. + +### Removed + +- Remove unnecessary transaction hash calculations. + +## [0.3.4] - 2023-02-28 + +### Added + +- Use the maximum SRAM capacity to store transactions for each Ledger model. +- Create a "Settings" step in the menu. + - Create data types for the NVM storage. + - Add the "Show Full Message" option. + - Move the "Version" info to the "About" submenu. + +### Fixed + +- Fix a problem with signing short messages. +- Add a string length check defining well-known transaction types. +- CI: Explicitly specify the ledger-app-builder version. + +### Removed + +- Get rid of the "app-boilerplate" legacy. + +## [0.1.0] - 2023-02-10 + +### Added + +- Improve display for well-known transaction types. + +### Fixed + +- Fix the bug in the CodeQL workflow. +- Fix Fuzzing test. + +### Removed + +- Remove irrelevant code. + ## [0.0.1] - 2022-09-27 ### Added -- Initial commit +- Initial commit. diff --git a/Makefile b/Makefile index 3e22820..a2d848a 100644 --- a/Makefile +++ b/Makefile @@ -48,7 +48,7 @@ APPNAME = "Aptos" # Application version APPVERSION_M = 0 APPVERSION_N = 6 -APPVERSION_P = 3 +APPVERSION_P = 6 APPVERSION = "$(APPVERSION_M).$(APPVERSION_N).$(APPVERSION_P)" # Application source files diff --git a/tests/snapshots/stax/test_app_mainmenu/00001.png b/tests/snapshots/stax/test_app_mainmenu/00001.png index fd7ccf70878ce6175a1bf43724ea4f4af5dc698e..3e7cbfb44c85755d199cb996b81d4995a481488f 100644 GIT binary patch literal 12684 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 delta 10925 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 diff --git a/tests/snapshots/stax/test_app_mainmenu/00005.png b/tests/snapshots/stax/test_app_mainmenu/00005.png index fd7ccf70878ce6175a1bf43724ea4f4af5dc698e..3e7cbfb44c85755d199cb996b81d4995a481488f 100644 GIT binary patch literal 12684 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 delta 10925 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 diff --git a/tests/test_name_version.py b/tests/test_name_version.py index 522a33e..fef07f5 100644 --- a/tests/test_name_version.py +++ b/tests/test_name_version.py @@ -12,4 +12,4 @@ def test_get_app_and_version(backend, backend_name): app_name, version = unpack_get_app_and_version_response(response.data) assert app_name == "Aptos" - assert version == "0.6.3" + assert version == "0.6.6" diff --git a/tests/test_version_cmd.py b/tests/test_version_cmd.py index f3e8ff3..616709f 100644 --- a/tests/test_version_cmd.py +++ b/tests/test_version_cmd.py @@ -4,7 +4,7 @@ # Taken from the Makefile, to update every time the Makefile version is bumped MAJOR = 0 MINOR = 6 -PATCH = 3 +PATCH = 6 # In this test we check the behavior of the device when asked to provide the app version def test_version(backend): From 846999c63de8354e48cec96bfadf0e7005f38183 Mon Sep 17 00:00:00 2001 From: Sarah Gliner <105934250+sgliner-ledger@users.noreply.github.com> Date: Wed, 29 Nov 2023 11:45:35 +0100 Subject: [PATCH 19/32] [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 7721e418254be3f9f747fd35d000bca5b4396cb9 Mon Sep 17 00:00:00 2001 From: vldmkr Date: Thu, 30 Nov 2023 19:47:40 +0200 Subject: [PATCH 20/32] Revert "Temporary remove "stax" from devices list" This reverts commit f895edd5d1258c060ff34900599999f3b60c3234. --- ledger_app.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ledger_app.toml b/ledger_app.toml index b223878..e557cc8 100644 --- a/ledger_app.toml +++ b/ledger_app.toml @@ -1,7 +1,7 @@ [app] build_directory = "./" sdk = "C" -devices = ["nanos", "nanox", "nanos+"] +devices = ["nanos", "nanox", "nanos+", "stax"] [tests] unit_directory = "./unit-tests/" From 12f221b786d22d6e282ee900190ac18370eadfdc Mon Sep 17 00:00:00 2001 From: vldmkr Date: Tue, 23 Jan 2024 15:30:27 +0200 Subject: [PATCH 21/32] Clean warnings: handle error in address_from_pubkey() and in crypto_sign_message() --- src/address.c | 15 ++++++++++++--- src/crypto.c | 6 +++++- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/src/address.c b/src/address.c index 0a0c498..4d0c98e 100644 --- a/src/address.c +++ b/src/address.c @@ -40,9 +40,18 @@ bool address_from_pubkey(const uint8_t public_key[static 32], uint8_t *out, size if (error != CX_OK) { return false; } - cx_hash_update((cx_hash_t *) &sha3, public_key, 32); - cx_hash_update((cx_hash_t *) &sha3, &signature_scheme_id, 1); - cx_hash_final((cx_hash_t *) &sha3, address); + error = cx_hash_update((cx_hash_t *) &sha3, public_key, 32); + if (error != CX_OK) { + return false; + } + error = cx_hash_update((cx_hash_t *) &sha3, &signature_scheme_id, 1); + if (error != CX_OK) { + return false; + } + error = cx_hash_final((cx_hash_t *) &sha3, address); + if (error != CX_OK) { + return false; + } memmove(out, address, ADDRESS_LEN); diff --git a/src/crypto.c b/src/crypto.c index cf2e139..de2e606 100644 --- a/src/crypto.c +++ b/src/crypto.c @@ -98,7 +98,11 @@ cx_err_t crypto_sign_message() { } size_t size; - cx_ecdomain_parameters_length(private_key.curve, &size); + error = cx_ecdomain_parameters_length(private_key.curve, &size); + if (error != CX_OK) { + explicit_bzero(&private_key, sizeof(private_key)); + return error; + } G_context.tx_info.signature_len = 2 * size; PRINTF("Signature: %.*H\n", G_context.tx_info.signature_len, G_context.tx_info.signature); From 0c940c3b010965839ef36977f525f694df6b88f8 Mon Sep 17 00:00:00 2001 From: vldmkr Date: Tue, 23 Jan 2024 15:38:26 +0200 Subject: [PATCH 22/32] Fix tests: Update gloden snapshots --- .../nanosp/test_app_mainmenu/00000.png | Bin 471 -> 471 bytes .../nanosp/test_app_mainmenu/00001.png | Bin 379 -> 381 bytes .../test_blind_sign_tx_long_tx/part0/00000.png | Bin 580 -> 580 bytes .../test_blind_sign_tx_long_tx/part1/00002.png | Bin 706 -> 706 bytes .../test_blind_sign_tx_long_tx/part1/00003.png | Bin 404 -> 404 bytes .../test_blind_sign_tx_long_tx/part1/00005.png | Bin 471 -> 471 bytes .../00002.png | Bin 903 -> 903 bytes .../00003.png | Bin 492 -> 494 bytes .../00005.png | Bin 471 -> 471 bytes .../00002.png | Bin 903 -> 903 bytes .../00003.png | Bin 492 -> 494 bytes .../00005.png | Bin 365 -> 366 bytes .../00006.png | Bin 471 -> 471 bytes .../nanosp/test_sign_tx_refused/00002.png | Bin 538 -> 538 bytes .../nanosp/test_sign_tx_refused/00006.png | Bin 388 -> 388 bytes .../nanosp/test_sign_tx_refused/00008.png | Bin 365 -> 366 bytes .../nanosp/test_sign_tx_refused/00009.png | Bin 471 -> 471 bytes .../nanosp/test_sign_tx_short_msg/00003.png | Bin 471 -> 471 bytes .../nanosp/test_sign_tx_short_tx/00002.png | Bin 571 -> 571 bytes .../nanosp/test_sign_tx_short_tx/00006.png | Bin 390 -> 389 bytes .../nanosp/test_sign_tx_short_tx/00008.png | Bin 471 -> 471 bytes 21 files changed, 0 insertions(+), 0 deletions(-) diff --git a/tests/snapshots/nanosp/test_app_mainmenu/00000.png b/tests/snapshots/nanosp/test_app_mainmenu/00000.png index 51264fc134d7afd8d68b7b8c14ae4f97980da6ab..79857a0267ee414b6d04cca997d48106d64ba911 100644 GIT binary patch delta 436 zcmV;l0ZabZ1J?tPEq_sRgCG=zVcT&h?0-q@r4LLf1BfQUc#iqMr_?x|3l~tXW?29L z00000@GX9>4&Ze$#_C82;gU$+@q2XuFRFS!b$y!>eU=I6_P%cp%)}V0UM~M^zr|$T z-mh}->6qT&cMVK|33ro=1@;Y;a^~Y}p zB<(y%N9@MFYXX+Llp+8Cc(A*T^Rm;uYQ3)(&lH=DQfqB@tF?8SmonxxAJV^x-r9VX zTd;giTcyxxUb1NyDYUB%qkn!VuMlMt9%lVFg?Z36N3j^!4wH0b{3O8WBJ4_G2v2AEUeKM8006+% zPQAmq$BV*J0 zebACz0uB~0+iy*OAtRT7W zN56`}r`z-fe;46q{;7_8yc)YvB^kRQe60X~?C5tc3Hp4epnqom*+@Zm%Xwyj{Nry0 zBz7I7BktzD*8ps*lp+8CcyMENHT?GMtd6a1R2sQoqla5+3e+K?WHlv zs8P$QNugi18GrRdd4*Oc;bGLbDXatA9mQgtohIo>|4D$Oi?CM;Q+PO+?**-d0001H zyY&ud$=fGSlmoDzpYjoT^L4au>TkHNyscI3??j3dDo%@+7b~6pDyd+JRAmK}uFOr> z?}L`)0&uZ-X+L%P3mMU!@J+?b^tDpiUv33lDPET0=`FkU2omwuokG=NjZDv#&f^A|fo zcwh!YQUU+~0000000000OqEhfDe7L_@~!T`n?l@uhv7@zfp@IJopavYllv?)U>a!0 z=qJYv=%;@T`gp~NWd=NnUj|g;GGI6NE6WU+F2cSqLY8W{+kZabInnoe61$Dqi{5%Y zjHzXiiT*Z|P!s*l7y~7$kP_>#65&0L{wU)9QCe-m^e95?k2|UGHM{-S1#t#UCvV7! z>sYrhw4>?%C*yhbv{_;H9B~*IW_L;{=iCRh-parFkJHw!|FP-st{T}!JOJ(C!w0cYVvkG0+b{?_aCIIGpnOlMY#gt5qt5i(y?I7va^#(B>hF z@bex13VT)w`at@f@CMTo1ONa4000000D#Z%15@hKeRM__*8l(j07*qoM6N<$f}|Fz A_5c6? delta 352 zcmey%^qXmdO1+b(i(^Q|oVPa}`wlAzxCE+&Km6zZNH21M;|j*}8q+jR{md7Cqj2X! zLV*_p95k#9^3rs@+Z7%6imgWD$ldMIbys+Q9MQUC`TVTz&htjh%Nomi>Wa=Z)cv@= zpkLKZ$M}KgAEO0Q(;0VfjE_t^P$KxPR&Z0u;k)1J8P9j_yFU3w?vZ~PYp)-k5ydw1 zMZPho>Baj!b^%FZK}oV`lgdcaU2$gtc wlOkBR?{IwL*X#q+FTZawpW){S4~!pt`A0>siX4>8Z~}>Wy85}Sb4q9e0Ho}sr~m)} diff --git a/tests/snapshots/nanosp/test_blind_sign_tx_long_tx/part0/00000.png b/tests/snapshots/nanosp/test_blind_sign_tx_long_tx/part0/00000.png index 976798ad378c22d7b931054754ffc65ea582e804..2d20155f3589238276c8e24b49401b23d82327ec 100644 GIT binary patch delta 545 zcmV++0^a?^1jGc8E`M^vAPhy*PH)2fkHlTNV8T!kLP)Byoc|VC82r<%T@F8}}l z000000000WBIlfQJ{^UL@6!Q%I)M{V=YI4eh{`h(5VZojhaNWvQ4{bOLMDKm??H9R;%h+P3GrEpKYBUl2K3w^kq;OBGzCV#>`ZU6uP0D#YA@3k%e zrIV0rxxc*M?d@|bo{i3JSBv?6x94TS#RqKr>p#SD&cz03(7fSg=L|PnV21??25}QKo)ZGUug|BM$jmVAXQ@LgO)3QVZNd%M88iznSsvannnW_O#~YYiBqT2z2~ zR6gR_?!-6AQHwC^^|(Lt-NsG+?zsHXA<))R2zDUzJnnTSJo}`$UIYLDfF~9kYiVZi z_mW?via}%Jn*ht8OrPr?y2gqaO~l$nT9V^M^5um5QKp#Hh-GAzsC#eOTIuB_$n?UCrqfq|2Ba&7k9d$WMR2D%ku-HC6KqZVP->t>UmZo>U0e|KCybO`sgM6d&y=W(wy;n6F_^&$WO06ekSSW`2D z|1bGQsu(mjz6r1l%JjMZrfaN--b5@-q$Sy3Bp*&juYWwF7)6FKHd%36E`YfPsw}aUx1SIiH>Q_9=toqt^9|e*aKo-4oOM7NTs{j zv}R8{8Eu+{dO%tOF=KkFk~sUAXJb}^Pqt72QuaCB9Ex;CT7RcfCv)`nZop+Bgfr=@ z_m6e>&jC_cK{gLoriyIjH78*J0D%8Aei^E&*>@i)ECeOD7Hn=g*h^eGQrfrZh`g4q zeWe|RL*7g8w3Q75`%~YCN*ns(bbH>L@Q?ZH0vtw57b7?0;{9w}W_G}JzuTtyB^kUM znjIY1%)8CCOJ|1|T!7L#XMHOSM|(R)ooH7?=dY!zm8FzjP4ykIf3VkW#<`?%?&BWY zCn_eH>`#+PHQAqx8hBz9^29vsiSz;h000000000000000006i70+V(=)kjBBV*mgE M07*qoM6N<$f`fFXD*ylh delta 366 zcmV-!0g?Wc1C#@hFMq-y3_#K7xD)ojr0m6yb{MAN(K3`!z2{5OrWhW@hyVZp0Mos^ zJ0K#Ws_EMhf>)6FKHeSJ6E`YfPsw}aKL91^jE-r|Hr^fNR{mR1TmdmJhoq!Sq_SLW zTC*3Pj5f_eDvtYC2U~h4$rBt`*h`g4q zf2E4TA@8MnK&4<{Kk9o?=|f+fZqNHC{A2!l08UnuZZ)zP7k|%IGP4`5`>$=9KO}>z zq1nxG&Ai)OyJswj!2?h_=d5pq?P%}Es0;0h=={A@wQ`iQr>VXc`vrU7W}HhJ*FJ9A zK2b5rWPh4Ws>%LjjDaV1Ax}JqJ&|4j000000000000000007`NUkBnr)y94&Ze$#_C82;gU$+@q2XuFRFS!b$y!>eU=I6_P%cp%)}V0UM~M^zr|$T z-mh}->6qT&cMVK|33ro=1@;Y;a^~Y}p zB<(y%N9@MFYXX+Llp+8Cc(A*T^Rm;uYQ3)(&lH=DQfqB@tF?8SmonxxAJV^x-r9VX zTd;giTcyxxUb1NyDYUB%qkn!VuMlMt9%lVFg?Z36N3j^!4wH0b{3O8WBJ4_G2v2AEUeKM8006+% zPQAmq$BV*J0 zebACz0uB~0+iy*OAtRT7W zN56`}r`z-fe;46q{;7_8yc)YvB^kRQe60X~?C5tc3Hp4epnqom*+@Zm%Xwyj{Nry0 zBz7I7BktzD*8ps*lp+8CcyMENHT?GMtd6a1R2sQoqla5+3e+K?WHlv zs8P$QNugi18GrRdd4*Oc;bGLbDXatA9mQgtohIo>|4D$Oi?CM;Q+PO+?**-d0001H zyY&ud$=fGSlmoDzpYjoT^L4au>TkHNyscI3??j3dDo%@+7b~6pDyd+JRAmK}uFOr> z?}L`)0&uZ-X+L%P3mMU!@J+?b^tDpiUv33lDPET0=`Fk2S>lQY>#L6Srl?i`yHH;N#xBOfC!fz>#rh%R^fBf8S)YJikq|-%A+5Fc z$GH~1c=>KjbAJ!0vS!Ndk;;BUtFVbP3T`o34Z}hR#Ljfypj8pjSqx<-Ww5^EWZ)KI zsv+{?lsJg3ILt@SFQE8mo}pH~p!zLl3rbV0AifybV__sFU^3`^-BfT{9V8cs;7jKo z8XkkwaQbIxv^@PmW<>o45U#u0O0=*xaU=|+VMy*7uz%O`EufANj7P23f5}E78`f6F zd(`mwMBknae}p<< zU$uCgR)6EA>8cu7NlS$;^y zZh{F|cl-V?LTA5;8)(W&He+Tj+aZ&aw_)(@*tRdyWEvCg{ZYN<6X z11gpOq$g(;DfuY&p6XZBAUCvaN@(rSxOmi5_a)HZ1xr?v6HkEj6w6q{_LZ|kwLF|c zcwm;#6K*WHd-~454Q&SuzECjhR)*bKYM^^snSfncdp`SZx4)ZpPbJXzfKhJ60t~lQ x|1*{2Y@ zLI@#*d=uAoUDt(Qa_aAj$M0?|x&C1_-^K3}qHPHGXijltuGMP2_xtMj+i$hPpY4i1 z>KN43(0jKMftS=`aN2I?$O^D-w=tp9RXJvP>-FB%L{DvH$$!*^tbic9-on8ZFhvaB z`!$6zq1KE#r0$HpoO%Yd0}s_c(4wR-cKz6+YySk?p^q#5wWrI<$o=KiLG~Yza(IiJ zS^?vRI~7hh7qYkBb*wi-*v9W6JmQQ=STh5JLVJemU2| z7cbw9Y3^A`)_+X7J=U4aF@-F*XF8+c7L(O5EQCPpOy><+6#<>aPpM;cZV{#$ zA}>yfgIG#;;^_GW6#vXK)T$X*Ut+ePG{p+yi-A2BMq&acgWlIo1((%9a)AimIul6wZcynn_w9?I1bg7K);Mt?hnY*@Q9 z<`pn4t`@CjxyO|^7LcjOSDa25RyDa-fEjces+~?zd0o(NdH^%Y%>H92sb=;chI8;v zxC_0LAjzDAqsa7nZm4YR`+V}Xwcvm{I;vFoq2JMQyjwY5tHf%q)~_?UiM~A<{s?uz zzH0F}t$)T#(^WOFl!6L$65f0I_xS|R5+AQs4OfW0AWLhP4~po7TaZLO$%B2Zj|f+& zn{jd*&F&SWm*TJ1@B^8=I@$wwFJUVyfU<8I5=_9f@i~1v_vUGLXhm6lsH)>lS$;^y zUIY`c?)LpGLTA5;1vKR(o3Y{+r22eTpsCFr>3<7xYHO{mAXWR*GGYlKgb+eVNZ^L5 z?^r1d(>abg;*No86{>=`Tj?LOtrAPkDycIb?QjdzH!4(d>xWgSDmxD7SZCdHwbYuH z0hP*s(v!1_lzbF>PxUKmkQ>@ICA4;ETs&&3`x5Byf+Z`-i6=mMie;=}`^wp&S{_az zJYdV`2{#tpJ$>ijhPDF+UnrP$E5q(AHPAh+Ou(+JJ)ixy+uzN)rxNIUz$mw30ft+u x{~1e_vMQ%cS+FfAWx1z*?}QLS2qA<#$6vV8GUIL~@YMhS002ovPDHLkV1j^_scZlM 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 89621afb1031829c0428e25d5ca88ba749a3d749..ccb5e27c47a222a48a00a6787780caa055bded1d 100644 GIT binary patch delta 468 zcmV;_0W1FO1MUNmB!9I@L_t(|obB0Ba)clZfMMF{O}PJ&xJw`0=`bXOpow;z|9jd+ z7Ggw1wiEyW0N^!RYppf^A)|g&JVRf046;sAc;6X~_NS52{w|rvT5Hk5>&s=GjMMoE zZ_%KhfI1Rut+OonOH{K%&Yy>izXOJZ4tK+FZfaqfj9E3&!+&pO$*hZAvzz9ktUF)` z*E#mjwa_QmneL(5*5HVhbpgUhiX7?vwK)d9vr|vC+n!#*Q_x@B{Zw!yNLKa?E_*g# z&OiQ^Pe*vsS8Q|koS;7FW{*?Zh^%9mEMq9$oiyvthzedIFB#cyDlZpu0YV}H0N^8F z8QQP?%VZ7L*MBq?pq@H*`|4`a)7oy2PwgFz)U7o2tMS28S#4i_w)Z@YmCSCBQH!FK z?P&M~>;=iYSY^L+9)+Gd{vJ<9>+JDL7-5!^#>FYfK4cdz5836O#*H?eZv8_h)hvmg zt?37c@Ov(RoG$)<_KRGGo(RZTIF`6&sL{TRxpjYP_Dw(EDzVS#+yh{dUiO=AFikSq zzm1Y=vVSwK!IPMUp0r3Z*B}+?1poj5000000000000000()L_t(|obB0BZo?o9fMGW6Cfxr>++`1)Duj(O#7?H_|DHBN z!Ep#sS_%LF0PrzdYppf^C8K^+JVRf046;sAc;6X~_P3GI{w|rvT5Hk5>&s=GjNADM zZ_%LMfI1Rut+OonOH{K<&X0$Se*=bu4sXM7Z)#zgj9E3&!+&RG$*hZAvzO+gtT$i? z*E#mjTIiGOO!rW2YjDI$Sp!PKqFOs;m2|snPhhvLUcnFG9d|z!yykRS*)zE8*?c+w z_**`X@S?BS=Il8^UFc@Z>1;$FEW*alXISlJcScn33YibHzo~q<|p0=A+3 z-oH%taD7c<1ApqNW4EvFCOxg~_W0D<(MUZ?Q~x#o@KjdYmw(%59>z{)x5ubWQPxoe zoB|Hx^`sg)iKb^rhX07*qo IM6N<$f-xuLP5=M^ 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 index 51264fc134d7afd8d68b7b8c14ae4f97980da6ab..79857a0267ee414b6d04cca997d48106d64ba911 100644 GIT binary patch delta 436 zcmV;l0ZabZ1J?tPEq_sRgCG=zVcT&h?0-q@r4LLf1BfQUc#iqMr_?x|3l~tXW?29L z00000@GX9>4&Ze$#_C82;gU$+@q2XuFRFS!b$y!>eU=I6_P%cp%)}V0UM~M^zr|$T z-mh}->6qT&cMVK|33ro=1@;Y;a^~Y}p zB<(y%N9@MFYXX+Llp+8Cc(A*T^Rm;uYQ3)(&lH=DQfqB@tF?8SmonxxAJV^x-r9VX zTd;giTcyxxUb1NyDYUB%qkn!VuMlMt9%lVFg?Z36N3j^!4wH0b{3O8WBJ4_G2v2AEUeKM8006+% zPQAmq$BV*J0 zebACz0uB~0+iy*OAtRT7W zN56`}r`z-fe;46q{;7_8yc)YvB^kRQe60X~?C5tc3Hp4epnqom*+@Zm%Xwyj{Nry0 zBz7I7BktzD*8ps*lp+8CcyMENHT?GMtd6a1R2sQoqla5+3e+K?WHlv zs8P$QNugi18GrRdd4*Oc;bGLbDXatA9mQgtohIo>|4D$Oi?CM;Q+PO+?**-d0001H zyY&ud$=fGSlmoDzpYjoT^L4au>TkHNyscI3??j3dDo%@+7b~6pDyd+JRAmK}uFOr> z?}L`)0&uZ-X+L%P3mMU!@J+?b^tDpiUv33lDPET0=`Fk2S>lQY>#L6Srl?i`yHH;N#xBOfC!fz>#rh%R^fBf8S)YJikq|-%A+5Fc z$GH~1c=>KjbAJ!0vS!Ndk;;BUtFVbP3T`o34Z}hR#Ljfypj8pjSqx<-Ww5^EWZ)KI zsv+{?lsJg3ILt@SFQE8mo}pH~p!zLl3rbV0AifybV__sFU^3`^-BfT{9V8cs;7jKo z8XkkwaQbIxv^@PmW<>o45U#u0O0=*xaU=|+VMy*7uz%O`EufANj7P23f5}E78`f6F zd(`mwMBknae}p<< zU$uCgR)6EA>8cu7NlS$;^y zZh{F|cl-V?LTA5;8)(W&He+Tj+aZ&aw_)(@*tRdyWEvCg{ZYN<6X z11gpOq$g(;DfuY&p6XZBAUCvaN@(rSxOmi5_a)HZ1xr?v6HkEj6w6q{_LZ|kwLF|c zcwm;#6K*WHd-~454Q&SuzECjhR)*bKYM^^snSfncdp`SZx4)ZpPbJXzfKhJ60t~lQ x|1*{2Y@ zLI@#*d=uAoUDt(Qa_aAj$M0?|x&C1_-^K3}qHPHGXijltuGMP2_xtMj+i$hPpY4i1 z>KN43(0jKMftS=`aN2I?$O^D-w=tp9RXJvP>-FB%L{DvH$$!*^tbic9-on8ZFhvaB z`!$6zq1KE#r0$HpoO%Yd0}s_c(4wR-cKz6+YySk?p^q#5wWrI<$o=KiLG~Yza(IiJ zS^?vRI~7hh7qYkBb*wi-*v9W6JmQQ=STh5JLVJemU2| z7cbw9Y3^A`)_+X7J=U4aF@-F*XF8+c7L(O5EQCPpOy><+6#<>aPpM;cZV{#$ zA}>yfgIG#;;^_GW6#vXK)T$X*Ut+ePG{p+yi-A2BMq&acgWlIo1((%9a)AimIul6wZcynn_w9?I1bg7K);Mt?hnY*@Q9 z<`pn4t`@CjxyO|^7LcjOSDa25RyDa-fEjces+~?zd0o(NdH^%Y%>H92sb=;chI8;v zxC_0LAjzDAqsa7nZm4YR`+V}Xwcvm{I;vFoq2JMQyjwY5tHf%q)~_?UiM~A<{s?uz zzH0F}t$)T#(^WOFl!6L$65f0I_xS|R5+AQs4OfW0AWLhP4~po7TaZLO$%B2Zj|f+& zn{jd*&F&SWm*TJ1@B^8=I@$wwFJUVyfU<8I5=_9f@i~1v_vUGLXhm6lsH)>lS$;^y zUIY`c?)LpGLTA5;1vKR(o3Y{+r22eTpsCFr>3<7xYHO{mAXWR*GGYlKgb+eVNZ^L5 z?^r1d(>abg;*No86{>=`Tj?LOtrAPkDycIb?QjdzH!4(d>xWgSDmxD7SZCdHwbYuH z0hP*s(v!1_lzbF>PxUKmkQ>@ICA4;ETs&&3`x5Byf+Z`-i6=mMie;=}`^wp&S{_az zJYdV`2{#tpJ$>ijhPDF+UnrP$E5q(AHPAh+Ou(+JJ)ixy+uzN)rxNIUz$mw30ft+u x{~1e_vMQ%cS+FfAWx1z*?}QLS2qA<#$6vV8GUIL~@YMhS002ovPDHLkV1j^_scZlM 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 89621afb1031829c0428e25d5ca88ba749a3d749..ccb5e27c47a222a48a00a6787780caa055bded1d 100644 GIT binary patch delta 468 zcmV;_0W1FO1MUNmB!9I@L_t(|obB0Ba)clZfMMF{O}PJ&xJw`0=`bXOpow;z|9jd+ z7Ggw1wiEyW0N^!RYppf^A)|g&JVRf046;sAc;6X~_NS52{w|rvT5Hk5>&s=GjMMoE zZ_%KhfI1Rut+OonOH{K%&Yy>izXOJZ4tK+FZfaqfj9E3&!+&pO$*hZAvzz9ktUF)` z*E#mjwa_QmneL(5*5HVhbpgUhiX7?vwK)d9vr|vC+n!#*Q_x@B{Zw!yNLKa?E_*g# z&OiQ^Pe*vsS8Q|koS;7FW{*?Zh^%9mEMq9$oiyvthzedIFB#cyDlZpu0YV}H0N^8F z8QQP?%VZ7L*MBq?pq@H*`|4`a)7oy2PwgFz)U7o2tMS28S#4i_w)Z@YmCSCBQH!FK z?P&M~>;=iYSY^L+9)+Gd{vJ<9>+JDL7-5!^#>FYfK4cdz5836O#*H?eZv8_h)hvmg zt?37c@Ov(RoG$)<_KRGGo(RZTIF`6&sL{TRxpjYP_Dw(EDzVS#+yh{dUiO=AFikSq zzm1Y=vVSwK!IPMUp0r3Z*B}+?1poj5000000000000000()L_t(|obB0BZo?o9fMGW6Cfxr>++`1)Duj(O#7?H_|DHBN z!Ep#sS_%LF0PrzdYppf^C8K^+JVRf046;sAc;6X~_P3GI{w|rvT5Hk5>&s=GjNADM zZ_%LMfI1Rut+OonOH{K<&X0$Se*=bu4sXM7Z)#zgj9E3&!+&RG$*hZAvzO+gtT$i? z*E#mjTIiGOO!rW2YjDI$Sp!PKqFOs;m2|snPhhvLUcnFG9d|z!yykRS*)zE8*?c+w z_**`X@S?BS=Il8^UFc@Z>1;$FEW*alXISlJcScn33YibHzo~q<|p0=A+3 z-oH%taD7c<1ApqNW4EvFCOxg~_W0D<(MUZ?Q~x#o@KjdYmw(%59>z{)x5ubWQPxoe zoB|Hx^`sg)iKb^rhX07*qo IM6N<$f-xuLP5=M^ 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 index c9222461cdd3ea49c300c4820e3704d33b9a3838..e90cd9db37ed7e4c669da0b1abe6e4a823770f3c 100644 GIT binary patch delta 339 zcmaFM^p0tQO1-J4i(^Q|oVPclR~<4CX?>`1PUW-wrFq@_jX}kk$&Q=C{_bC{yxi%I z_H^ILLJV*qDJUp-{om@BJF6JNOIGKE|2m}8FsJzEVy*Ar3abyaMl!6N-kAS2*sK34 z^NtmF3uIQ$mkDi&x~{%H3tZ zvTc^&QHE1ba^rn`=AOG#w&}HTh3wzZyU+KlI&I{gYm>a+wq>>Q5mm+5Cfld1Y|$6? jX68ChzTpPV-0__5jB!4tXL_t(|obB3M4uUWggyExcC+vSoXD>c9AxK+NNJwY!|DH5f zQqS}jFaiJo000000001hjLgi;YoBU*&+fn#%_`fKzAy`5S(fr*SMK%g+Q5Zb0MW|8 zxB3zBn%#km>IKKK`r$YOie0%)s~^4rJcerky-nDTWdPe|_^ zZ|I#keKYt8ATuqF6U|Oq^!$k3*m)GHKOY&)M+Wne0sf27-O%mi8#z;!_V%Yw9qR+d z`<^TcKC}GH?!b`dv zk6Zv{vkh9gndMc6<}wUO9Xc(j|DNyg+>kf~aQ< ke*gdg00000007+Y3sw)mR9g3FCIA2c07*qoM6N<$f+Jg>jsO4v diff --git a/tests/snapshots/nanosp/test_get_public_key_confirm_refused/00006.png b/tests/snapshots/nanosp/test_get_public_key_confirm_refused/00006.png index 51264fc134d7afd8d68b7b8c14ae4f97980da6ab..79857a0267ee414b6d04cca997d48106d64ba911 100644 GIT binary patch delta 436 zcmV;l0ZabZ1J?tPEq_sRgCG=zVcT&h?0-q@r4LLf1BfQUc#iqMr_?x|3l~tXW?29L z00000@GX9>4&Ze$#_C82;gU$+@q2XuFRFS!b$y!>eU=I6_P%cp%)}V0UM~M^zr|$T z-mh}->6qT&cMVK|33ro=1@;Y;a^~Y}p zB<(y%N9@MFYXX+Llp+8Cc(A*T^Rm;uYQ3)(&lH=DQfqB@tF?8SmonxxAJV^x-r9VX zTd;giTcyxxUb1NyDYUB%qkn!VuMlMt9%lVFg?Z36N3j^!4wH0b{3O8WBJ4_G2v2AEUeKM8006+% zPQAmq$BV*J0 zebACz0uB~0+iy*OAtRT7W zN56`}r`z-fe;46q{;7_8yc)YvB^kRQe60X~?C5tc3Hp4epnqom*+@Zm%Xwyj{Nry0 zBz7I7BktzD*8ps*lp+8CcyMENHT?GMtd6a1R2sQoqla5+3e+K?WHlv zs8P$QNugi18GrRdd4*Oc;bGLbDXatA9mQgtohIo>|4D$Oi?CM;Q+PO+?**-d0001H zyY&ud$=fGSlmoDzpYjoT^L4au>TkHNyscI3??j3dDo%@+7b~6pDyd+JRAmK}uFOr> z?}L`)0&uZ-X+L%P3mMU!@J+?b^tDpiUv33lDPET0=`FkWi{#>u;UDX!qLX;gsE9{h}=mF4*(_ zFL)U@|Mx!g$*hc8p^odfH*YQzJo`U%&3vtB&AqdWbapN&)ID6rXq<8>ewl#jOMN%_ oiX_obM~ZIb)0Sr~kKg=#fp?yrF2d z#5F!+T^>%^T`Ct~X>dWF zxBlYS==s0*sZVBQ)CxTqn$Mp8R%zD%)e-Wc+k&dhpGI6-TBv)tjL|sdQv5Oj)0g^g p@)b#`1PUW-wrFq@_jX}kk$&Q=C{_bC{yxi%I z_H^ILLJV*qDJUp-{om@BJF6JNOIGKE|2m}8FsJzEVy*Ar3abyaMl!6N-kAS2*sK34 z^NtmF3uIQ$mkDi&x~{%H3tZ zvTc^&QHE1ba^rn`=AOG#w&}HTh3wzZyU+KlI&I{gYm>a+wq>>Q5mm+5Cfld1Y|$6? jX68ChzTpPV-0__5jB!4tXL_t(|obB3M4uUWggyExcC+vSoXD>c9AxK+NNJwY!|DH5f zQqS}jFaiJo000000001hjLgi;YoBU*&+fn#%_`fKzAy`5S(fr*SMK%g+Q5Zb0MW|8 zxB3zBn%#km>IKKK`r$YOie0%)s~^4rJcerky-nDTWdPe|_^ zZ|I#keKYt8ATuqF6U|Oq^!$k3*m)GHKOY&)M+Wne0sf27-O%mi8#z;!_V%Yw9qR+d z`<^TcKC}GH?!b`dv zk6Zv{vkh9gndMc6<}wUO9Xc(j|DNyg+>kf~aQ< ke*gdg00000007+Y3sw)mR9g3FCIA2c07*qoM6N<$f+Jg>jsO4v diff --git a/tests/snapshots/nanosp/test_sign_tx_refused/00009.png b/tests/snapshots/nanosp/test_sign_tx_refused/00009.png index 51264fc134d7afd8d68b7b8c14ae4f97980da6ab..79857a0267ee414b6d04cca997d48106d64ba911 100644 GIT binary patch delta 436 zcmV;l0ZabZ1J?tPEq_sRgCG=zVcT&h?0-q@r4LLf1BfQUc#iqMr_?x|3l~tXW?29L z00000@GX9>4&Ze$#_C82;gU$+@q2XuFRFS!b$y!>eU=I6_P%cp%)}V0UM~M^zr|$T z-mh}->6qT&cMVK|33ro=1@;Y;a^~Y}p zB<(y%N9@MFYXX+Llp+8Cc(A*T^Rm;uYQ3)(&lH=DQfqB@tF?8SmonxxAJV^x-r9VX zTd;giTcyxxUb1NyDYUB%qkn!VuMlMt9%lVFg?Z36N3j^!4wH0b{3O8WBJ4_G2v2AEUeKM8006+% zPQAmq$BV*J0 zebACz0uB~0+iy*OAtRT7W zN56`}r`z-fe;46q{;7_8yc)YvB^kRQe60X~?C5tc3Hp4epnqom*+@Zm%Xwyj{Nry0 zBz7I7BktzD*8ps*lp+8CcyMENHT?GMtd6a1R2sQoqla5+3e+K?WHlv zs8P$QNugi18GrRdd4*Oc;bGLbDXatA9mQgtohIo>|4D$Oi?CM;Q+PO+?**-d0001H zyY&ud$=fGSlmoDzpYjoT^L4au>TkHNyscI3??j3dDo%@+7b~6pDyd+JRAmK}uFOr> z?}L`)0&uZ-X+L%P3mMU!@J+?b^tDpiUv33lDPET0=`Fk4&Ze$#_C82;gU$+@q2XuFRFS!b$y!>eU=I6_P%cp%)}V0UM~M^zr|$T z-mh}->6qT&cMVK|33ro=1@;Y;a^~Y}p zB<(y%N9@MFYXX+Llp+8Cc(A*T^Rm;uYQ3)(&lH=DQfqB@tF?8SmonxxAJV^x-r9VX zTd;giTcyxxUb1NyDYUB%qkn!VuMlMt9%lVFg?Z36N3j^!4wH0b{3O8WBJ4_G2v2AEUeKM8006+% zPQAmq$BV*J0 zebACz0uB~0+iy*OAtRT7W zN56`}r`z-fe;46q{;7_8yc)YvB^kRQe60X~?C5tc3Hp4epnqom*+@Zm%Xwyj{Nry0 zBz7I7BktzD*8ps*lp+8CcyMENHT?GMtd6a1R2sQoqla5+3e+K?WHlv zs8P$QNugi18GrRdd4*Oc;bGLbDXatA9mQgtohIo>|4D$Oi?CM;Q+PO+?**-d0001H zyY&ud$=fGSlmoDzpYjoT^L4au>TkHNyscI3??j3dDo%@+7b~6pDyd+JRAmK}uFOr> z?}L`)0&uZ-X+L%P3mMU!@J+?b^tDpiUv33lDPET0=`FkxNXu*H2w13o?m`*xdZvA^Oz2g8>LUUHx3vIVCg!05UfYNB{r; diff --git a/tests/snapshots/nanosp/test_sign_tx_short_tx/00006.png b/tests/snapshots/nanosp/test_sign_tx_short_tx/00006.png index f9a909e9cbc5a9f314ac31ab796bd55e03ad0c38..180d8bb31402604a3b46ded62e2667d43732772f 100644 GIT binary patch delta 362 zcmV-w0hRuS1BC;SB!5gvL_t(|obB0Nj)Wi(M$wwd?1cRKZ`L-=LOq~v18K(eniE|6n5%U3=I&h=Vn|P{f{j(f0*v;H1TYt z^KPg*IF62H-(&QpdjnYOoN=~JU-5Eq*0SXCyNY$nSxU8sYN1nM$C5`bu3hIl(FZd_ zCjDuYs7Ze^+8`36P$cHzNW=>O000000000000000000d03yCg11J%07*qo IM6N<$f`RgF1DMp3oXov{BUv6nu$!!Sk?b^-{e_dLZo zA)XKOV=Mvy001oa6@39BB01;!Fr^e#$$CH07w{L{sJxz%dlBCNmimq^v8si$E14>O z2r50GFsegR2jT)fV-lvDUk#f#g zZr=JkRwoPe9en|}rIhaG?ia?2p992LL3RtBsY0!J&q){n0N{TbzYIM+A9WXkqOAqH zTMlhi?VqkG*~@W#){ep{cWXbu*)X_uYQcy1J?}~Q!_WZ1MsCKH(f`;o^M~oNE^f?i zXz*^RIylab=483)%kT!U);aS$I(@~4&Ze$#_C82;gU$+@q2XuFRFS!b$y!>eU=I6_P%cp%)}V0UM~M^zr|$T z-mh}->6qT&cMVK|33ro=1@;Y;a^~Y}p zB<(y%N9@MFYXX+Llp+8Cc(A*T^Rm;uYQ3)(&lH=DQfqB@tF?8SmonxxAJV^x-r9VX zTd;giTcyxxUb1NyDYUB%qkn!VuMlMt9%lVFg?Z36N3j^!4wH0b{3O8WBJ4_G2v2AEUeKM8006+% zPQAmq$BV*J0 zebACz0uB~0+iy*OAtRT7W zN56`}r`z-fe;46q{;7_8yc)YvB^kRQe60X~?C5tc3Hp4epnqom*+@Zm%Xwyj{Nry0 zBz7I7BktzD*8ps*lp+8CcyMENHT?GMtd6a1R2sQoqla5+3e+K?WHlv zs8P$QNugi18GrRdd4*Oc;bGLbDXatA9mQgtohIo>|4D$Oi?CM;Q+PO+?**-d0001H zyY&ud$=fGSlmoDzpYjoT^L4au>TkHNyscI3??j3dDo%@+7b~6pDyd+JRAmK}uFOr> z?}L`)0&uZ-X+L%P3mMU!@J+?b^tDpiUv33lDPET0=`Fk Date: Tue, 23 Jan 2024 19:57:36 +0200 Subject: [PATCH 23/32] Expand the displayed info for function calls: - Parse `0x1::aptos_account::transfer_coins` function - Now show "Transaction Type" for all entry_function calls - Update gloden snapshots for tests --- src/bcs/types.h | 3 +- src/transaction/deserialize.c | 12 +++++- src/ui/bagl_display.c | 28 ++++++------ src/ui/common_display.c | 36 ++++++++++------ src/ui/display.h | 1 + src/ui/nbgl_display.c | 2 +- src/ui/nbgl_display.h | 2 +- src/ui/nbgl_display_transaction.c | 40 ++++++++++-------- .../part1/00001.png | Bin 469 -> 376 bytes .../part1/00002.png | Bin 479 -> 469 bytes .../part1/00003.png | Bin 464 -> 479 bytes .../part1/00004.png | Bin 486 -> 464 bytes .../part1/00005.png | Bin 416 -> 486 bytes .../part1/00006.png | Bin 355 -> 416 bytes .../part1/00007.png | Bin 341 -> 355 bytes .../part1/00008.png | Bin 408 -> 341 bytes .../part1/00009.png | Bin 0 -> 408 bytes .../nanos/test_sign_tx_short_tx/00001.png | Bin 383 -> 404 bytes .../nanos/test_sign_tx_short_tx/00002.png | Bin 433 -> 383 bytes .../nanos/test_sign_tx_short_tx/00003.png | Bin 451 -> 433 bytes .../nanos/test_sign_tx_short_tx/00004.png | Bin 478 -> 451 bytes .../nanos/test_sign_tx_short_tx/00005.png | Bin 474 -> 478 bytes .../nanos/test_sign_tx_short_tx/00006.png | Bin 473 -> 474 bytes .../nanos/test_sign_tx_short_tx/00007.png | Bin 442 -> 473 bytes .../nanos/test_sign_tx_short_tx/00008.png | Bin 310 -> 442 bytes .../nanos/test_sign_tx_short_tx/00009.png | Bin 347 -> 310 bytes .../nanos/test_sign_tx_short_tx/00010.png | Bin 341 -> 347 bytes .../nanos/test_sign_tx_short_tx/00011.png | Bin 408 -> 341 bytes .../nanos/test_sign_tx_short_tx/00012.png | Bin 0 -> 408 bytes .../part1/00001.png | Bin 890 -> 483 bytes .../part1/00002.png | Bin 706 -> 890 bytes .../part1/00003.png | Bin 404 -> 706 bytes .../part1/00004.png | Bin 364 -> 404 bytes .../part1/00005.png | Bin 471 -> 364 bytes .../part1/00006.png | Bin 0 -> 471 bytes .../nanosp/test_sign_tx_short_tx/00001.png | Bin 439 -> 506 bytes .../nanosp/test_sign_tx_short_tx/00002.png | Bin 571 -> 439 bytes .../nanosp/test_sign_tx_short_tx/00003.png | Bin 889 -> 571 bytes .../nanosp/test_sign_tx_short_tx/00004.png | Bin 501 -> 889 bytes .../nanosp/test_sign_tx_short_tx/00005.png | Bin 363 -> 501 bytes .../nanosp/test_sign_tx_short_tx/00006.png | Bin 389 -> 363 bytes .../nanosp/test_sign_tx_short_tx/00007.png | Bin 364 -> 389 bytes .../nanosp/test_sign_tx_short_tx/00008.png | Bin 471 -> 364 bytes .../nanosp/test_sign_tx_short_tx/00009.png | Bin 0 -> 471 bytes .../part1/00001.png | Bin 890 -> 483 bytes .../part1/00002.png | Bin 706 -> 890 bytes .../part1/00003.png | Bin 404 -> 706 bytes .../part1/00004.png | Bin 364 -> 404 bytes .../part1/00005.png | Bin 471 -> 364 bytes .../part1/00006.png | Bin 0 -> 471 bytes .../nanox/test_sign_tx_short_tx/00001.png | Bin 439 -> 506 bytes .../nanox/test_sign_tx_short_tx/00002.png | Bin 571 -> 439 bytes .../nanox/test_sign_tx_short_tx/00003.png | Bin 889 -> 571 bytes .../nanox/test_sign_tx_short_tx/00004.png | Bin 501 -> 889 bytes .../nanox/test_sign_tx_short_tx/00005.png | Bin 363 -> 501 bytes .../nanox/test_sign_tx_short_tx/00006.png | Bin 389 -> 363 bytes .../nanox/test_sign_tx_short_tx/00007.png | Bin 364 -> 389 bytes .../nanox/test_sign_tx_short_tx/00008.png | Bin 471 -> 364 bytes .../nanox/test_sign_tx_short_tx/00009.png | Bin 0 -> 471 bytes .../part1/00002.png | Bin 19728 -> 20218 bytes .../part1/00003.png | Bin 9157 -> 7851 bytes .../part1/00004.png | Bin 5467 -> 9157 bytes .../part1/00005.png | Bin 10733 -> 5467 bytes .../part1/00006.png | Bin 0 -> 10733 bytes .../stax/test_sign_tx_short_tx/00001.png | Bin 12801 -> 15966 bytes 65 files changed, 76 insertions(+), 48 deletions(-) create mode 100644 tests/snapshots/nanos/test_blind_sign_tx_long_tx/part1/00009.png create mode 100644 tests/snapshots/nanos/test_sign_tx_short_tx/00012.png create mode 100644 tests/snapshots/nanosp/test_blind_sign_tx_long_tx/part1/00006.png create mode 100644 tests/snapshots/nanosp/test_sign_tx_short_tx/00009.png create mode 100644 tests/snapshots/nanox/test_blind_sign_tx_long_tx/part1/00006.png create mode 100644 tests/snapshots/nanox/test_sign_tx_short_tx/00009.png create mode 100644 tests/snapshots/stax/test_blind_sign_tx_long_tx/part1/00006.png diff --git a/src/bcs/types.h b/src/bcs/types.h index 85c9de4..c024892 100644 --- a/src/bcs/types.h +++ b/src/bcs/types.h @@ -78,7 +78,8 @@ typedef struct { typedef enum { FUNC_UNKNOWN = 0, FUNC_APTOS_ACCOUNT_TRANSFER = 1, - FUNC_COIN_TRANSFER = 2 + FUNC_COIN_TRANSFER = 2, + FUNC_APTOS_ACCOUNT_TRANSFER_COINS = 3, } entry_function_known_type_t; typedef struct { diff --git a/src/transaction/deserialize.c b/src/transaction/deserialize.c index 3d54273..25aa6c9 100644 --- a/src/transaction/deserialize.c +++ b/src/transaction/deserialize.c @@ -174,6 +174,7 @@ parser_status_e entry_function_payload_deserialize(buffer_t *buf, transaction_t case FUNC_APTOS_ACCOUNT_TRANSFER: return aptos_account_transfer_function_deserialize(buf, tx); case FUNC_COIN_TRANSFER: + case FUNC_APTOS_ACCOUNT_TRANSFER_COINS: return coin_transfer_function_deserialize(buf, tx); default: return PARSING_OK; @@ -238,7 +239,8 @@ parser_status_e coin_transfer_function_deserialize(buffer_t *buf, transaction_t return PAYLOAD_UNDEFINED_ERROR; } entry_function_payload_t *payload = &tx->payload.entry_function; - if (payload->known_type != FUNC_COIN_TRANSFER) { + if (payload->known_type != FUNC_COIN_TRANSFER && + payload->known_type != FUNC_APTOS_ACCOUNT_TRANSFER_COINS) { return PAYLOAD_UNDEFINED_ERROR; } @@ -247,7 +249,7 @@ parser_status_e coin_transfer_function_deserialize(buffer_t *buf, transaction_t return TYPE_ARGS_SIZE_READ_ERROR; } if (payload->args.ty_size != 1) { - return -TYPE_ARGS_SIZE_UNEXPECTED_ERROR; + return TYPE_ARGS_SIZE_UNEXPECTED_ERROR; } uint32_t ty_arg_variant = TYPE_TAG_UNDEFINED; @@ -344,5 +346,11 @@ entry_function_known_type_t determine_function_type(transaction_t *tx) { return FUNC_COIN_TRANSFER; } + if (tx->payload.entry_function.module_id.address[ADDRESS_LEN - 1] == 0x01 && + bcs_cmp_bytes(&tx->payload.entry_function.module_id.name, "aptos_account", 13) && + bcs_cmp_bytes(&tx->payload.entry_function.function_name, "transfer_coins", 14)) { + return FUNC_APTOS_ACCOUNT_TRANSFER_COINS; + } + return FUNC_UNKNOWN; } diff --git a/src/ui/bagl_display.c b/src/ui/bagl_display.c index e2192b4..2072a24 100644 --- a/src/ui/bagl_display.c +++ b/src/ui/bagl_display.c @@ -212,7 +212,7 @@ UX_STEP_NOCB(ux_display_tx_type_step, bnnn_paging, { .title = "Transaction Type", - .text = g_struct, + .text = g_tx_type, }); // Step with title/text for function UX_STEP_NOCB(ux_display_function_step, @@ -292,13 +292,15 @@ UX_FLOW(ux_display_blind_short_message_flow, &ux_display_blind_warn_step, SEQUEN // FLOW to display entry_function transaction information: // #1 screen : warning icon + "Blind Signing" // #2 screen : eye icon + "Review Transaction" -// #3 screen : display function name -// #4 screen : display gas fee -// #5 screen : approve button -// #6 screen : reject button +// #3 screen : display tx type +// #4 screen : display function name +// #5 screen : display gas fee +// #6 screen : approve button +// #7 screen : reject button UX_FLOW(ux_display_blind_tx_entry_function_flow, &ux_display_blind_warn_step, &ux_display_review_step, + &ux_display_tx_type_step, &ux_display_function_step, &ux_display_gas_fee_step, &ux_display_approve_step, @@ -325,15 +327,17 @@ UX_FLOW(ux_display_tx_aptos_account_transfer_flow, // FLOW to display coin_transfer transaction information: // #1 screen : eye icon + "Review Transaction" -// #2 screen : display function name -// #3 screen : display coin type -// #4 screen : display destination address -// #5 screen : display amount -// #6 screen : display gas fee -// #7 screen : approve button -// #8 screen : reject button +// #2 screen : display tx type +// #3 screen : display function name +// #4 screen : display coin type +// #5 screen : display destination address +// #6 screen : display amount +// #7 screen : display gas fee +// #8 screen : approve button +// #9 screen : reject button UX_FLOW(ux_display_tx_coin_transfer_flow, &ux_display_review_step, + &ux_display_tx_type_step, &ux_display_function_step, &ux_display_coin_type_step, &ux_display_receiver_step, diff --git a/src/ui/common_display.c b/src/ui/common_display.c index e4ea779..c29d303 100644 --- a/src/ui/common_display.c +++ b/src/ui/common_display.c @@ -36,6 +36,7 @@ #include "../common/user_format.h" char g_bip32_path[60]; +char g_tx_type[60]; char g_address[67]; char g_gas_fee[30]; char g_struct[120]; @@ -101,27 +102,27 @@ int ui_prepare_transaction() { case PAYLOAD_ENTRY_FUNCTION: return ui_display_entry_function(); case PAYLOAD_SCRIPT: - memset(g_struct, 0, sizeof(g_struct)); - snprintf(g_struct, - sizeof(g_struct), + memset(g_tx_type, 0, sizeof(g_tx_type)); + snprintf(g_tx_type, + sizeof(g_tx_type), "%s [payload = SCRIPT]", RAW_TRANSACTION_SALT); break; default: - memset(g_struct, 0, sizeof(g_struct)); - snprintf(g_struct, - sizeof(g_struct), + memset(g_tx_type, 0, sizeof(g_tx_type)); + snprintf(g_tx_type, + sizeof(g_tx_type), "%s [payload = UNKNOWN]", RAW_TRANSACTION_SALT); break; } } else if (transaction->tx_variant == TX_RAW_WITH_DATA) { - memset(g_struct, 0, sizeof(g_struct)); - snprintf(g_struct, sizeof(g_struct), RAW_TRANSACTION_WITH_DATA_SALT); + memset(g_tx_type, 0, sizeof(g_tx_type)); + snprintf(g_tx_type, sizeof(g_tx_type), RAW_TRANSACTION_WITH_DATA_SALT); } } else { - memset(g_struct, 0, sizeof(g_struct)); - snprintf(g_struct, sizeof(g_struct), "unknown data type"); + memset(g_tx_type, 0, sizeof(g_tx_type)); + snprintf(g_tx_type, sizeof(g_tx_type), "unknown data type"); } return UI_PREPARED; @@ -154,8 +155,12 @@ int ui_prepare_entry_function() { case FUNC_APTOS_ACCOUNT_TRANSFER: return ui_display_tx_aptos_account_transfer(); case FUNC_COIN_TRANSFER: + case FUNC_APTOS_ACCOUNT_TRANSFER_COINS: return ui_display_tx_coin_transfer(); default: + memset(g_tx_type, 0, sizeof(g_tx_type)); + snprintf(g_tx_type, sizeof(g_tx_type), "Function call"); + PRINTF("Tx Type: %s\n", g_tx_type); break; } @@ -167,9 +172,9 @@ int ui_prepare_tx_aptos_account_transfer() { &G_context.tx_info.transaction.payload.entry_function.args.transfer; // For well-known functions, display the transaction type in human-readable format - memset(g_struct, 0, sizeof(g_struct)); - snprintf(g_struct, sizeof(g_struct), "APT transfer"); - PRINTF("Tx Type: %s\n", g_struct); + memset(g_tx_type, 0, sizeof(g_tx_type)); + snprintf(g_tx_type, sizeof(g_tx_type), "APT transfer"); + PRINTF("Tx Type: %s\n", g_tx_type); memset(g_address, 0, sizeof(g_address)); if (0 > format_prefixed_hex(transfer->receiver, ADDRESS_LEN, g_address, sizeof(g_address))) { @@ -193,6 +198,11 @@ int ui_prepare_tx_coin_transfer() { &G_context.tx_info.transaction.payload.entry_function.args.coin_transfer; char transfer_ty_coin_address_hex[67] = {0}; + // For well-known functions, display the transaction type in human-readable format + memset(g_tx_type, 0, sizeof(g_tx_type)); + snprintf(g_tx_type, sizeof(g_tx_type), "Coin transfer"); + PRINTF("Tx Type: %s\n", g_tx_type); + // Be sure to display at least 1 byte, even if it is zero size_t leading_zeros = count_leading_zeros(transfer->ty_coin.address, ADDRESS_LEN - 1); if (0 > format_prefixed_hex(transfer->ty_coin.address + leading_zeros, diff --git a/src/ui/display.h b/src/ui/display.h index dd0edec..9caca4e 100644 --- a/src/ui/display.h +++ b/src/ui/display.h @@ -3,6 +3,7 @@ #define UI_PREPARED -10 extern char g_bip32_path[60]; +extern char g_tx_type[60]; extern char g_address[67]; extern char g_gas_fee[30]; extern char g_struct[120]; diff --git a/src/ui/nbgl_display.c b/src/ui/nbgl_display.c index 04c906c..f92e5f9 100644 --- a/src/ui/nbgl_display.c +++ b/src/ui/nbgl_display.c @@ -33,7 +33,7 @@ static use_case_review_ctx_t blind_sign_ctx; -nbgl_layoutTagValue_t pairs[5]; +nbgl_layoutTagValue_t pairs[6]; nbgl_layoutTagValueList_t pairList; nbgl_pageInfoLongPress_t infoLongPress; diff --git a/src/ui/nbgl_display.h b/src/ui/nbgl_display.h index 94da09c..3f20010 100644 --- a/src/ui/nbgl_display.h +++ b/src/ui/nbgl_display.h @@ -2,7 +2,7 @@ #include "nbgl_use_case.h" -extern nbgl_layoutTagValue_t pairs[5]; +extern nbgl_layoutTagValue_t pairs[6]; extern nbgl_layoutTagValueList_t pairList; extern nbgl_pageInfoLongPress_t infoLongPress; diff --git a/src/ui/nbgl_display_transaction.c b/src/ui/nbgl_display_transaction.c index 014d210..8fd0478 100755 --- a/src/ui/nbgl_display_transaction.c +++ b/src/ui/nbgl_display_transaction.c @@ -55,7 +55,7 @@ static void review_choice(bool confirm) { static void review_default_continue(void) { pairs[0].item = "Transaction Type"; - pairs[0].value = g_struct; + pairs[0].value = g_tx_type; pairs[1].item = "Gas Fee"; pairs[1].value = g_gas_fee; @@ -71,13 +71,15 @@ static void review_default_continue(void) { } static void review_entry_function_continue(void) { - pairs[0].item = "Function"; - pairs[0].value = g_function; - pairs[1].item = "Gas Fee"; - pairs[1].value = g_gas_fee; + pairs[0].item = "Transaction Type"; + pairs[0].value = g_tx_type; + pairs[1].item = "Function"; + pairs[1].value = g_function; + pairs[2].item = "Gas Fee"; + pairs[2].value = g_gas_fee; pairList.nbMaxLinesForValue = 0; - pairList.nbPairs = 2; + pairList.nbPairs = 3; pairList.pairs = pairs; infoLongPress.icon = &C_aptos_logo_64px; @@ -89,7 +91,7 @@ static void review_entry_function_continue(void) { static void review_tx_aptos_account_transfer_continue(void) { pairs[0].item = "Transaction Type"; - pairs[0].value = g_struct; + pairs[0].value = g_tx_type; pairs[1].item = "Function"; pairs[1].value = g_function; pairs[2].item = "Receiver"; @@ -111,19 +113,21 @@ static void review_tx_aptos_account_transfer_continue(void) { } static void review_tx_coin_transfer_continue(void) { - pairs[0].item = "Function"; - pairs[0].value = g_function; - pairs[1].item = "Coin Type"; - pairs[1].value = g_struct; - pairs[2].item = "Receiver"; - pairs[2].value = g_address; - pairs[3].item = "Amount"; - pairs[3].value = g_amount; - pairs[4].item = "Gas Fee"; - pairs[4].value = g_gas_fee; + pairs[0].item = "Transaction Type"; + pairs[0].value = g_tx_type; + pairs[1].item = "Function"; + pairs[1].value = g_function; + pairs[2].item = "Coin Type"; + pairs[2].value = g_struct; + pairs[3].item = "Receiver"; + pairs[3].value = g_address; + pairs[4].item = "Amount"; + pairs[4].value = g_amount; + pairs[5].item = "Gas Fee"; + pairs[5].value = g_gas_fee; pairList.nbMaxLinesForValue = 0; - pairList.nbPairs = 5; + pairList.nbPairs = 6; pairList.pairs = pairs; infoLongPress.icon = &C_aptos_logo_64px; diff --git a/tests/snapshots/nanos/test_blind_sign_tx_long_tx/part1/00001.png b/tests/snapshots/nanos/test_blind_sign_tx_long_tx/part1/00001.png index 168128d6ffce4c50efd7a0f7e702e1186b510120..7df01d23395b5e37a56e466d43fbede99119408e 100644 GIT binary patch delta 349 zcmV-j0iyoZ1NZ`vB!53iL_t(|ob8#*5`!QNMPsM_{|9%`F6cN2B!VOa^`7ZQgq!dR zm=Xa10C*}(SL^R*FSd56o%Z3h-5LB>AnC^CEROd-;;k>a^=DakeGBU=FG-pl)`=g3 z2~LNTlAVvMg-1>#H|IlfXt+A@+hXBis~Qoxkh8+Im6iK8kbl7rh^cq3xR57D!%yQ0 zpi)#3>TGjR)5;x<$n)x#P$P-9zHanfu3E6)0X1VPAD*rC0uN8)h^Q}tRiN`i8-000000ALh9?b`fmkGO5I00000NkvXXu0mjfKUb;3 delta 443 zcmV;s0Yv`z0@VYMB!8SqL_t(|ob8#-vcez?g{!0Q|G+ME!B}HR!YL3yn{V!-7vY3L z!cV$wK@bGNS-CiBKOf(w?%iaorD)sKJtmbZ(4MCXEk>uoCSV1rT_-&-S@x?(2QqF> zx-!fGcjwxnUM7xCa!=;Pw4tWP_&s;7!1g22-83JpYiNkr6@Q+O&!5q}2hI@y`r``F zz!Kxh2j>Y`e9#x*I=cgBXY3}t!9h*Wf^@H@A(hubG{u^%T-@6SMYI2^HwXUQ zHM1gNs;rScm_4HLoD@# zpGUz&6WC|;IDc!T23Z|DCu2Nl`YZ{9lp9hSMZ03g6l_~8e{+KuaQ*t-0)rOVCHgL lw)Hhup&$r?AP9mJ@&bo$aqtmIi6Q_1002ovPDHLkV1fwH)`9>4 diff --git a/tests/snapshots/nanos/test_blind_sign_tx_long_tx/part1/00002.png b/tests/snapshots/nanos/test_blind_sign_tx_long_tx/part1/00002.png index 20702e10daf420c2f6c2ac1f399d69b6780b1689..168128d6ffce4c50efd7a0f7e702e1186b510120 100644 GIT binary patch delta 443 zcmV;s0Yv`a1JwhNB!8SqL_t(|ob8#-vcez?g{!0Q|G+ME!B}HR!YL3yn{V!-7vY3L z!cV$wK@bGNS-CiBKOf(w?%iaorD)sKJtmbZ(4MCXEk>uoCSV1rT_-&-S@x?(2QqF> zx-!fGcjwxnUM7xCa!=;Pw4tWP_&s;7!1g22-83JpYiNkr6@Q+O&!5q}2hI@y`r``F zz!Kxh2j>Y`e9#x*I=cgBXY3}t!9h*Wf^@H@A(hubG{u^%T-@6SMYI2^HwXUQ zHM1gNs;rScm_4HLoD@# zpGUz&6WC|;IDc!T23Z|DCu2Nl`YZ{9lp9hSMZ03g6l_~8e{+KuaQ*t-0)rOVCHgL lw)Hhup&$r?AP9mJ@&bo$aqtmIi6Q_1002ovPDHLkV1nN`)@lF% delta 453 zcmV;$0XqKG1K$IXB!8w!L_t(|ob6e`j>I4cbvLvB|G|5hIW!>%XkV$Q>F~0L9Rp7k z1*D}U5{X3OTk#Xf{r<0~`Wr^;rXpRkO;8;I+;Wm1W&b<~2kbzldH4wZ-xnK-R}ila zevb5EEcJO5Yd(G+$CHx?#TMH)!g1VMXV9nEAvtBHzrOly1b^Rv&CjEGBTM5x#UR)L z8*VybkG%T3+JHsaWB1GKBwXN2&1*rPtNE^J8HCeJ;KCnfZlC0^_^7uM?$yQB!6DOZ zi{%dJQ9XY5_kpq1x%-omK3Iv2LMu^kvg(HFddn>JI`yAf>Iq?8Q-Xx%2+|P(EiuJf z)*>T%&|l7Wntz2{rqw^u>JCB@K5guDrnqDYB7A8@HHN-~hrd>~d9TL7`x3_Air{1Q z=HpXG0L`GMpttl*H=8`z!eIx9#h8J$Wt?WviXb78i2ecc-OBtFp%sx1u8xYD2U`*5 zfYZY$;xfJw4ni=zy2ID0*3f1(-~ePL!xB9}II&qj0Y2~zIKZ!e!9r)JuDBYDwI|;7 vH*_$~2!_6*mO<I4cbvLvB|G|5hIW!>%XkV$Q>F~0L9Rp7k z1*D}U5{X3OTk#Xf{r<0~`Wr^;rXpRkO;8;I+;Wm1W&b<~2kbzldH4wZ-xnK-R}ila zevb5EEcJO5Yd(G+$CHx?#TMH)!g1VMXV9nEAvtBHzrOly1b^Rv&CjEGBTM5x#UR)L z8*VybkG%T3+JHsaWB1GKBwXN2&1*rPtNE^J8HCeJ;KCnfZlC0^_^7uM?$yQB!6DOZ zi{%dJQ9XY5_kpq1x%-omK3Iv2LMu^kvg(HFddn>JI`yAf>Iq?8Q-Xx%2+|P(EiuJf z)*>T%&|l7Wntz2{rqw^u>JCB@K5guDrnqDYB7A8@HHN-~hrd>~d9TL7`x3_Air{1Q z=HpXG0L`GMpttl*H=8`z!eIx9#h8J$Wt?WviXb78i2ecc-OBtFp%sx1u8xYD2U`*5 zfYZY$;xfJw4ni=zy2ID0*3f1(-~ePL!xB9}II&qj0Y2~zIKZ!e!9r)JuDBYDwI|;7 vH*_$~2!_6*mO<9krMcr!p{~tVy&cc#K0N)VD*l5C8H7Vfh zX9y`JNs=UaDlf;_-``_XpJ`!-Lp9%~jfJWPRC%+XrGFi40wRQxap;})8=Fn#$0@E3 zT}N^;mg9P4eXf^vdD0-vu@~)$3@o?a8XR*3LF#4Cp#H@Se1A59^A3o-9@*heH!7j~& zW%~r6Q2&1PQV1M-%W1U2r;XA$NKwF@S32a#92gtso`Rq^`dJ~@bN)n`2u}_BWO<3Jc zs!cgNaOQG)60VVYm0FfS?kJPqm54eT40y}OU1DjCVMulhximSelKVQ$sbT6rPe#fq*m<(@C}k> gBuSDaNs9krMcr!p{~tVy&cc#K0N)VD*l5C8H7Vfh zX9y`JNs=UaDlf;_-``_XpJ`!-Lp9%~jfJWPRC%+XrGFi40wRQxap;})8=Fn#$0@E3 zT}N^;mg9P4eXf^vdD0-vu@~)$3@o?a8XR*3LF#4Cp#H@Se1A59^A3o-9@*heH!7j~& zW%~r6Q2&1PQV1M-%W1U2r;XA$NKwF@S32a#92gtso`Rq^`dJ~@bN)n`2u}_BWO<3Jc zs!cgNaOQG)60VVYm0FfS?kJPqm54eT40y}OU1DjCVMulhximSelKVQ$sbT6rPe#fq*m<(@C}k> gBuSDaNsU37+G5-t}6q`sVSVHILb zLLzAhj^j9v)0x-vaC8*gcdowpxuTWt_!cu*#OPR#4h~@MF%Ec)5Nh*!hHaPU>08CS zLA~wg=eA2BVq#7j(C5eEng>Ua8ECoaYnup!FwZjc=KybwTz>&o@wfu%@-kP|07g1s zS)<1?8-HG>>ckqb4x-px8YpueKrZLBHm0>YwUi#i$OI$BU9-Z^aMf+U3QoUT7t0ic z+}QeI4F@1O_qP607^ZgXPsV+4C7y+@O_T diff --git a/tests/snapshots/nanos/test_blind_sign_tx_long_tx/part1/00005.png b/tests/snapshots/nanos/test_blind_sign_tx_long_tx/part1/00005.png index 2001bf6bd98036636f237140b1d675c118a3d1c4..56622281884e1b960967bbd2451facdf7500a200 100644 GIT binary patch delta 460 zcmV;-0WU37+G5-t}6q`sVSVHILb zLLzAhj^j9v)0x-vaC8*gcdowpxuTWt_!cu*#OPR#4h~@MF%Ec)5Nh*!hHaPU>08CS zLA~wg=eA2BVq#7j(C5eEng>Ua8ECoaYnup!FwZjc=KybwTz>&o@wfu%@-kP|07g1s zS)<1?8-HG>>ckqb4x-px8YpueKrZLBHm0>YwUi#i$OI$BU9-Z^aMf+U3QoUT7t0ic z+}QeI4F@1O_qP607^ZgXPsV+4C7y+@O4#OY_MeVZw{|E13doVE+5z&ca%gM4dt6ou{ zIvRrGIF9pF4n^(n=Q`9mOtxDp^@X-Uwb&rP`_G`uKn}1Vm2^l!=I+3`TzM<$(!e;9 z1S9Gj8z2$Xv847y_&6fNtrUZO9eI)TAw`(GLs8BEv+Xl!U z=53l}7rHB#5`LX(N78fox7=U_EY*TK=2@)}2sPIQyBP-@Cw>=LrMmh}nz8ZSXnO0y z{1^g`&{kJ5W{?eLJ%T1yL&?fzs&O{eHAz8O=_E^@LN(stUD@s|G0WiT?*k;D$=@LW ji4#OY_MeVZw{|E13doVE+5z&ca%gM4dt6ou{ zIvRrGIF9pF4n^(n=Q`9mOtxDp^@X-Uwb&rP`_G`uKn}1Vm2^l!=I+3`TzM<$(!e;9 z1S9Gj8z2$Xv847y_&6fNtrUZO9eI)TAw`(GLs8BEv+Xl!U z=53l}7rHB#5`LX(N78fox7=U_EY*TK=2@)}2sPIQyBP-@Cw>=LrMmh}nz8ZSXnO0y z{1^g`&{kJ5W{?eLJ%T1yL&?fzs&O{eHAz8O=_E^@LN(stUD@s|G0WiT?*k;D$=@LW jiSvX^ji1kxwOp25;>FNW`-Gqz;yv9H-7r%@;z<-{8P`Qaf!T z2APh@72wrL@;!0L=5JxSWPQMoL>DnIyB zbyzA(Of`|47?)S>U^{;v_nSUadtZ5{sRT6G#W1(M2|tCkC*bcJg3P6*i10oB#(&2W z{PZcgx)zk(96@dBPPNup5LZtCch0eof$eAv?l@7HiSnz$QHq|X`YhCe_AAB#00000 a0PP%chUi%X7zcL%0000SvX^ji1kxwOp25;>FNW`-Gqz;yv9H-7r%@;z<-{8P`Qaf!T z2APh@72wrL@;!0L=5JxSWPQMoL>DnIyB zbyzA(Of`|47?)S>U^{;v_nSUadtZ5{sRT6G#W1(M2|tCkC*bcJg3P6*i10oB#(&2W z{PZcgx)zk(96@dBPPNup5LZtCch0eof$eAv?l@7HiSnz$QHq|X`YhCe_AAB#00000 a0PP%chUi%X7zcL%00004uc>JMe8#E|AT#S4;a$4l#R@IsowLnAtUTG zToFYGA%qY@{$}4~-_Vm7Rt#sf<#$}=)VJ~BlvESR-Jq3=$jydfC?r!$iuAw9oGJ!U-M%Y zMJ+y&Ch%TCM>9}$(GT~2qZ!TIc>6skNTK;?O1Y^i^a^-9EC6{n9}GT=eBR!K!~g&Q M07*qoM6N<$f4uc>JMe8#E|AT#S4;a$4l#R@IsowLnAtUTG zToFYGA%qY@{$}4~-_Vm7Rt#sf<#$}=)VJ~BlvESR-Jq3=$jydfC?r!$iuAw9oGJ!U-M%Y zMJ+y&Ch%TCM>9}$(GT~2qZ!TIc>6skNTK;?O1Y^i^a^-9EC6{n9}GT=eBR!K!~g&Q M07*qoM6N<$g6G7RT>t<8 delta 381 zcmV-@0fPS30+<7kB!6E?L_t(|ob8!m6T%<}hF#bG{}0}W^})_LQH0Ya5YKg8QCkY~ zDing_IF942LAzGobpK^#wh=7XSWv zd>8DtPw=3^7zmJ{Szb%hq)LK@0|4E}oj(-u5n?9kiNQ8>b${WqBqPN6Lr+Bu+=K(z zW6f^D^ksM+w?|?B%^1|tnHtyot!oEkU^oB)nH_7|RqwY>id<|5AlxRnT_%=vLiLAs z-CF!G6^C;(09o(j+kkB*s1Wo%vL!elVV}V@AI5e2`mU^4k_u3Sp5+) z43v3=SY98|gLa%&M5~O#>#uGi!opZ!S`1N?W86j8?PU@hpLo+$aL07G7c_A-QP!rp ztzJMkG(zlU!cUb36=>a7r231=07@@24-azoRhtc_ks1|Y666>}PGRUc bjw6f@Wj+33^pH0U00000NkvXXu0mjfkB776 diff --git a/tests/snapshots/nanos/test_blind_sign_tx_long_tx/part1/00009.png b/tests/snapshots/nanos/test_blind_sign_tx_long_tx/part1/00009.png new file mode 100644 index 0000000000000000000000000000000000000000..02d922befda7ad5494398ded74de6ab739697b06 GIT binary patch literal 408 zcmV;J0cZY+P)tP{{Ii&hxNhEIZ=euB@oYbT~S*K@+uU9<2a7vtmHgakKmt)-tWf1Xpr8k z2T&vT^|oJ@_?%nP+p5JO0W+Zbn)L-eycYldd3+b_womY&!WamUpjlo^(xgg)h64cI z$DKbE@eyJs>50KMbammfBqPN6Lr+Bu+=K(zW6f^D^ksM+w?|?B%^1|tnHtyot!oEk zU^oB)nH_7|RqwY>id<|5AlxRnT_%=vLiLAs-CF!G6^C;(09o(j+kkB*s1Wo%vL!e< zch7)hC{c^>lVV}V@AI5e2`mU^4k_u3Sp5+)43v3=SY98|gPc}GtBk_yuWlm3!dPHh z3{jM0+(p;zWfB{oc+*sH$8@+CG;uXi)~30wUO+cALhNP2PoWm6V)g$41ylYNXx&z% z`isc`N-r}H4|4WZn+>Ls8Wmv@o5%I6i;I)86GVo^3ykEj(XoOJq{*!!JXK zlAn?*IeFeKT$Y@q;pUK?no=KrH``dXYH=brmZFqwWzV_|Nj-aoTj3d; zPRnbBiRX*A{|3JWki22`iN4i8Z8VSK9s|f=4Q7HWG?UTiaHy);+Ugp&k!oV*;f7*9 zyp_Fmq5B_DrE>H=nf>w-q|nHUlJB4n+4Yhxd#hgs?c$>RMyQuvFX^B@_)8IE=#yPF zevG)w0#L8)n(Z(Ue>HT0gDz$f*_DXgcfcX-9+#xn5mOzMx3}1q;=1ao000000D$oU XLpTV0OUeg{00000NkvXXu0mjfh;O-q delta 356 zcmV-q0h|7m1OEb$B!5OpL_t(|ob8#*62l+}MM7B2a%vc zr9=P#0A^+By#BuZb(hsmt(U5oBQ{_VRSo&}HbB7-Z)|ht@}n)B9=gjam57NsZ8M^e zEgy;P>fq^#z37bIKT$X=XB1ew*j*=zzxtC<8ny0v42f02^VBWr*~3%ITiQ9 z`whrC8QyP3!qxD8W3UH3K@{qVLmu9@x|o)+%(5)qmy2KFV1KR@Qer@P!pc5|9_x2)N67jt5# z3$9hGY7B2a%vc zr9=P#0A^+By#BuZb(hsmt(U5oBQ{_VRSo&}HbB7-Z)|ht@}n)B9=gjam57NsZ8M^e zEgy;P>fq^#z37bIKT$X=XB1ew*j*=zzxtC<8ny0v42f02^VBWr*~3%ITiQ9 z`whrC8QyP3!qxD8W3UH3K@{qVLmu9@x|o)+%(5)qmy2KFV1KR@Qer@P!pc5|9_x2)N67jt5# z3$9hGY7Q!G1hPR!1{|DYhU3iX%K#&ShH@>TK_~R7O zXxow`Ns_y=+e^MqApexigr`k4S@0{M_u>L67lY~@8e5IQh1ZFv%u3ctuzW!J)E%<7 z<6$eeZA_2~p`_d~Pzsu%P(>otuV%Ch(+m*UNJFXlRF+kWaDQPd1h~e)bQ3u2fT{Rl zvS^m~%==egfd41X`P4n^B|Q#dL`nJq7ZQIL);pk1P5oLMVT%XU1?RW4bC(60f1rZ< zk_5!B3EgA!tL_0EneGREe6?%YWS|@K2Mfi1_Z~SpjnS_40v90HU?j_Dp{40eviBNj zs&&-Hsm2%2;D5K!)D*c&j>*vHTgB0(2v`%<7c6NnS`Fn|VD-OQqvf1l0ijO$LkUyq zqT47q^=I@Bs6R~pj5x!Ii~Tj~P>dVJ{xq1lA`-X{MlV1Kx7c^?6F8pO6r@Qw8k^?P zEz~FIpOk3T?{Wx7GS!yi8J&V|PcA@`B*}ew0|g5Tvk+i2LFfPg002ovPDHLkV1oIh B#U}s& diff --git a/tests/snapshots/nanos/test_sign_tx_short_tx/00003.png b/tests/snapshots/nanos/test_sign_tx_short_tx/00003.png index 161f7d3e77ce3fdde9930fd4d989bac04b090fd3..b516c615877af858a9cc9d28b31afb78308114a9 100644 GIT binary patch delta 407 zcmV;I0cifi1F-{;B!75GL_t(|ob8#>7Q!G1hPR!1{|DYhU3iX%K#&ShH@>TK_~R7O zXxow`Ns_y=+e^MqApexigr`k4S@0{M_u>L67lY~@8e5IQh1ZFv%u3ctuzW!J)E%<7 z<6$eeZA_2~p`_d~Pzsu%P(>otuV%Ch(+m*UNJFXlRF+kWaDQPd1h~e)bQ3u2fT{Rl zvS^m~%==egfd41X`P4n^B|Q#dL`nJq7ZQIL);pk1P5oLMVT%XU1?RW4bC(60f1rZ< zk_5!B3EgA!tL_0EneGREe6?%YWS|@K2Mfi1_Z~SpjnS_40v90HU?j_Dp{40eviBNj zs&&-Hsm2%2;D5K!)D*c&j>*vHTgB0(2v`%<7c6NnS`Fn|VD-OQqvf1l0ijO$LkUyq zqT47q^=I@Bs6R~pj5x!Ii~Tj~P>dVJ{xq1lA`-X{MlV1Kx7c^?6F8pO6r@Qw8k^?P zEz~FIpOk3T?{Wx7GS!yi8J&V|PcA@`B*}ew0|g5Tvk+i2LFfPg002ovPDHLkV1k>~ B#Owe7 delta 425 zcmV;a0apI81H%K5B!7xYL_t(|ob8$05`-WKhN;=!|AD(`FWhlhQbYsI;+wr$v|mF! z5rE@3j`LO)eaT}-@*7u;DNU;Jf>p%Uqdrj%70#u?ZV%(wsmruvtp%}#Db?=DM^_FY z6QoQi31;BURpkYm`D!t6AFKMv}6T+ge;+mn}2mKikT@(LCBeqy@ZX(xiu;Vo+X-~?U4@rmk zRY9_^${+9WVCM0a7Qf}VHVATJ{$rxp=Z}f^C(+xvUf==v7>s24RcLAoPVO@XZLJvf zEo>^qG@?rD6Mu(z=z8%58qT9bonn)UIA31yUnr$QaVdXICC}nPVwxrv>-24Jm@86S zDioLI>K6sCXGRER?jlp8b{po&hH81OQ%Xn5Br^a2mhJb`QZxI?ScT0e zNxXwKq(aFiOrjNAlFD%t&V5zKmVxQp>ABNV-pu70Kq9>0@$w=bF#{aOaR%}Q>k=-N T?9SaV00000NkvXXu0mjf1i#Co diff --git a/tests/snapshots/nanos/test_sign_tx_short_tx/00004.png b/tests/snapshots/nanos/test_sign_tx_short_tx/00004.png index 86db3977b70213e98b8a49fa4924895c6554d17f..161f7d3e77ce3fdde9930fd4d989bac04b090fd3 100644 GIT binary patch delta 425 zcmV;a0apIr1H%K5B!7xYL_t(|ob8$05`-WKhN;=!|AD(`FWhlhQbYsI;+wr$v|mF! z5rE@3j`LO)eaT}-@*7u;DNU;Jf>p%Uqdrj%70#u?ZV%(wsmruvtp%}#Db?=DM^_FY z6QoQi31;BURpkYm`D!t6AFKMv}6T+ge;+mn}2mKikT@(LCBeqy@ZX(xiu;Vo+X-~?U4@rmk zRY9_^${+9WVCM0a7Qf}VHVATJ{$rxp=Z}f^C(+xvUf==v7>s24RcLAoPVO@XZLJvf zEo>^qG@?rD6Mu(z=z8%58qT9bonn)UIA31yUnr$QaVdXICC}nPVwxrv>-24Jm@86S zDioLI>K6sCXGRER?jlp8b{po&hH81OQ%Xn5Br^a2mhJb`QZxI?ScT0e zNxXwKq(aFiOrjNAlFD%t&V5zKmVxQp>ABNV-pu70Kq9>0@$w=bF#{aOaR%}Q>k=-N T?9SaV00000NkvXXu0mjfPjt)A delta 452 zcmV;#0XzP~1KtCWB!8tzL_t(|ob8$04#F@9Ks)39|AT$dhncQ&D~#S;I5B3!mQuP> zhA9O>5ClPc-mmlH)Z@3Lyv7P;iQj-ZtTTr^`f&k_A-zA!_-8-WEO|cLPD}9Zwtv4% zC0t{myo3~D^N!*E9`Yd)F7z$++B6c`PEJW9I`07Td8|&xG=E$F0i)R#-RQgkAS{%^ zYA@3eO#mmvkhK|d2H*(p(UY1w9q7-D+8M(S;qrVtW(Xv>fk_+JhWu6O<)LBf4yQk2 z`iqEG)h)fBR$2f_+g-iCAcU*K`-6!!m`OyTnfy9=BYp-cmnQYbZG>L9s&krCs}6BO z&=KpA^;d@wrhmre!DRAk&S-@ii_k`{%s7j~nvVLC4%za8W>SM9qCBcC>ZX|b;`P7$ zjx)7}(~5y_!lvD)e;K|E7dA;@mb5O1*cU))f%81aQJ#$WO@=6)o5upe^6v-S5!~i$ zMG>se4!{SLztFgHz~M3%1@;Bt9swDl(0IAjHM^8AnLWWJR|u4bk^>}adxA|zj_OQ9 u$(Ug6Skg5OO-#&L zhA9O>5ClPc-mmlH)Z@3Lyv7P;iQj-ZtTTr^`f&k_A-zA!_-8-WEO|cLPD}9Zwtv4% zC0t{myo3~D^N!*E9`Yd)F7z$++B6c`PEJW9I`07Td8|&xG=E$F0i)R#-RQgkAS{%^ zYA@3eO#mmvkhK|d2H*(p(UY1w9q7-D+8M(S;qrVtW(Xv>fk_+JhWu6O<)LBf4yQk2 z`iqEG)h)fBR$2f_+g-iCAcU*K`-6!!m`OyTnfy9=BYp-cmnQYbZG>L9s&krCs}6BO z&=KpA^;d@wrhmre!DRAk&S-@ii_k`{%s7j~nvVLC4%za8W>SM9qCBcC>ZX|b;`P7$ zjx)7}(~5y_!lvD)e;K|E7dA;@mb5O1*cU))f%81aQJ#$WO@=6)o5upe^6v-S5!~i$ zMG>se4!{SLztFgHz~M3%1@;Bt9swDl(0IAjHM^8AnLWWJR|u4bk^>}adxA|zj_OQ9 u$(Ug6Skg5OO-#&L!YKt->Mou(Xgw>N7?|ycGl=05KO2e`jZiRuo6*)R^mIz8}oB{VoSx`ro7qK?z*)R4bZ{n zQsrEz5dss~D1VV)=hOH3n5Y>}v|z4+KY&cqaFUW3T|$M6$v|`16O&PP1Tx4~xB+a*Yt1!P5fm5m{(C-1&?u#=%8H5A$iA|r q83!YKt->Mou(Xgw>N7?|ycGl=05KO2e`jZiRuo6*)R^mIz8}oB{VoSx`ro7qK?z*)R4bZ{n zQsrEz5dss~D1VV)=hOH3n5Y>}v|z4+KY&cqaFUW3T|$M6$v|`16O&PP1Tx4~xB+a*Yt1!P5fm5m{(C-1&?u#=%8H5A$iA|r q83-W1B z;f#TJgL_wV{~q!o5-#kPb~RF;YtiCWZwAi*@_AG{=brvZ@Eo*MlPAwr$epG=OyN^%ui$vwyiQO%`j@cqD&G!qWjLQ=>p4r~M+ zi*iE*>RQ2##(xtnNaqT*xM5%>RFSo=Y)`PtXe_J~{xs^BY5`fAIoSd(0!>f%us31j z+pN00km(1DO);!^fJmx?i+(&kuFt6x{qrSHYBgglE7+F~InNx_Q61(K?r1Z>GOfrx z$K%8hdL?iyI)OB*H~^$jbH|M1v=zn(1k$MJ7z$d#Z8(reE7Fg`pS{le-+q>3UqcCQ p)T?8R0PdR5og_(;BuSE_ls7fopTxbu`d|P6002ovPDHLkV1g_!*$V&w diff --git a/tests/snapshots/nanos/test_sign_tx_short_tx/00007.png b/tests/snapshots/nanos/test_sign_tx_short_tx/00007.png index 7ab267c8528daa1b87fc20628c9978723b3bae1d..81e05d2de396074bfc8e950394b5957ac6eacb3b 100644 GIT binary patch delta 447 zcmV;w0YLt`1K9(RB!8euL_t(|ob8$0Zo?o9hRL+P{{!zLy~xxNpN%;!@~5gw!TB*J z9O9OeBuSDa{W*XBK0%$hC%`4OiMk~2z#8`HgEzilkVZQHJx-eC)1Tu-m*Ahr>-W1B z;f#TJgL_wV{~q!o5-#kPb~RF;YtiCWZwAi*@_AG{=brvZ@Eo*MlPAwr$epG=OyN^%ui$vwyiQO%`j@cqD&G!qWjLQ=>p4r~M+ zi*iE*>RQ2##(xtnNaqT*xM5%>RFSo=Y)`PtXe_J~{xs^BY5`fAIoSd(0!>f%us31j z+pN00km(1DO);!^fJmx?i+(&kuFt6x{qrSHYBgglE7+F~InNx_Q61(K?r1Z>GOfrx z$K%8hdL?iyI)OB*H~^$jbH|M1v=zn(1k$MJ7z$d#Z8(reE7Fg`pS{le-+q>3UqcCQ p)T?8R0PdR5og_(;BuSE_ls7fopTxbu`d|P6002ovPDHLkV1o2O*y{iQ delta 416 zcmV;R0bl;v1G)o{B!7WPL_t(|ob8#-vcn(oVW ziWL5nm^*~br(;gj8$3N`7OLY{c+uz7t7-H#wQY$eW-k+0-tKt2@AO=^0S?EfBoxD{3w(hrt z?RlYgESn$Gj(?YT)ILA!4O?eGS*=e&N&I$JzK7wLZY^^`&|_#d=}UKzb{kp^^;DPA zbC7cqHVriW(KpI)Gxx;RS^AfV0C>h@YqrfZj3Q`Ix&y!+G5kWYhiPh+um-GmYU@MB zj{z<2yFX^zP%H9OsNaV2Y<@%GQ-n}4jY9V}6aWAK02u%f5zz-qhdgATko1lK0000< KMNUMnLSTXq^~g*B diff --git a/tests/snapshots/nanos/test_sign_tx_short_tx/00008.png b/tests/snapshots/nanos/test_sign_tx_short_tx/00008.png index a76dbae2b9b89d53e8dbd9d14d97c32050357040..7ab267c8528daa1b87fc20628c9978723b3bae1d 100644 GIT binary patch delta 417 zcmV;S0bc&L0=ff`BYy#bNklykGl!w@4sWUl#?XdA#5;rkEW* zEQ%EVlbAb%%%@{c(;GZJW)`aBS9sCq)T?RqHMMPtN02!MZGSaB_NLQjnA#cQluP@2 z{u)sD=(MROUzjo%vsu;enmnOo24H1*#x!HqA;+>@48*FACQm5&0XVWbk-kkWQg{ZF zS}TtrrS$T+X=>E=YaCJQLkV6HKv}I%K}q~}R=$Vfmu@X{LC|ApHR(%tkaind4fRx) z(sPh=5;hGq{n0nda5MMB)mi$NhyZxTV{5j}GmIi=P`U%a9Wneuv4?4Dm9Pe^cWUcH z#*YCl?z=x`+fXa=RH)yE@@#%X;ZuZAF^xj^HWUB=02%-Q5E0P_N{2jTpOEy900000 LNkvXXu0mjf*nP+; delta 284 zcmV+%0ptF<1GWN?BYyz>Nkl?WYmey zt`UPo0000$Jo^?sgUUSAck>{P+4txPjNuwB>+5k@`wqNDmb>@RyVtVImSy4h z%20066CfhCTKP(^L7FY7nC^`<2FRVg1_=z{k&~Xg&}nQ`!+$b;<6qJsTxtv0+jDt=52`BSC{vDH zPzay=?#-vF0XfvCx&|2ddQ;MXcK4uOLim0e36gRCbjdsQLhWzq4j%FpXmq}?#+bnD ilPCZH0000WIu!s9LEZ_Pk7$?x0000BYyz>Nkl?WYmey zt`UPo0000$Jo^?sgUUSAck>{P+4txPjNuwB>+5k@`wqNDmb>@RyVtVImSy4h z%20066CfhCTKP(^L7FY7nC^`<2FRVg1_=z{k&~Xg&}nQ`!+$b;<6qJsTxtv0+jDt=52`BSC{vDH zPzay=?#-vF0XfvCx&|2ddQ;MXcK4uOLim0e36gRCbjdsQLhWzq4j%FpXmq}?#+bnD ilPCZH0000WIu!s9LEZ_Pk7$?x0000_Brj1Qp!cjGguq-P z0wDkZ0C*~k_XHBYpIvoXyLNv%nS3r0Ja~Igz#^43CiP}HlH=65sQZI3^LKNQJgJ>_ zF@tnx$S)wOljVEnz~-;=xv)OqPo|5RvqzMjLH(Ea1kSRo1AnS{f?>8GMNldC&A(_G zGdfetaNHuT#>J2q>UTgC8R~a~ks9iE25aC6b|FvpB9qrp>5^GAKpKJGPRS&g5!1`C z-ozd&Y4>)PBCgA84-oeHN@ZH5_9M?bN>hizWv0Ce-vumyGgY4=whb=c_GdivMq5c9$=bU!TtbSFbV~Mg7dXsXLqE*(Y1gvNQ000000OkAu2a@Pb Tz@P@D00000NkvXXu0mjf_{Nl0 diff --git a/tests/snapshots/nanos/test_sign_tx_short_tx/00010.png b/tests/snapshots/nanos/test_sign_tx_short_tx/00010.png index 66c411c2ebc833c701039f213ad4ff68cc881146..cd5f607dbdb09cc0569666e2c95339d69c2ac198 100644 GIT binary patch delta 320 zcmV-G0l)s$0^0(RB!41FL_t(|ob8y)5`!QNMX^)=|AV_|7tB~BFHs<%_pBgU#gG^3cR&;w>UV>Y8tQijYv2iXAy4)qlh;t`l36rB8iC$U$t0K&)61~l z#2zbY_jZ;duFGo=5cc{?Wm={7BhNcZQ-{K3ro9Q@1uTFwRi7fZ4KCjJdp^N8-&tvULk{sKtnoOaBtepRGniLw%UlX8@zRo18ktY`rM00000<@^8#lITsq Spa!J?00004uc>JMe8#E|AT#S4;a$4l#R@IsowLnAtUTG zToFYGA%qY@{$}4~-_Vm7Rt#sf<#$}=)VJ~BlvESR-Jq3=$jydfC?r!$iuAw9oGJ!U-M%Y zMJ+y&Ch%TCM>9}$(GT~2qZ!TIc>6skNTK;?O1Y^i^a^-9EC6{n9}GT=eBR!K!~g&Q M07*qoM6N<$f;h;Qp8x;= diff --git a/tests/snapshots/nanos/test_sign_tx_short_tx/00011.png b/tests/snapshots/nanos/test_sign_tx_short_tx/00011.png index 02d922befda7ad5494398ded74de6ab739697b06..66c411c2ebc833c701039f213ad4ff68cc881146 100644 GIT binary patch delta 314 zcmV-A0mc591JweMB!3)9L_t(|ob8#>4uc>JMe8#E|AT#S4;a$4l#R@IsowLnAtUTG zToFYGA%qY@{$}4~-_Vm7Rt#sf<#$}=)VJ~BlvESR-Jq3=$jydfC?r!$iuAw9oGJ!U-M%Y zMJ+y&Ch%TCM>9}$(GT~2qZ!TIc>6skNTK;?O1Y^i^a^-9EC6{n9}GT=eBR!K!~g&Q M07*qoM6N<$g6G7RT>t<8 delta 381 zcmV-@0fPS30+<7kB!6E?L_t(|ob8!m6T%<}hF#bG{}0}W^})_LQH0Ya5YKg8QCkY~ zDing_IF942LAzGobpK^#wh=7XSWv zd>8DtPw=3^7zmJ{Szb%hq)LK@0|4E}oj(-u5n?9kiNQ8>b${WqBqPN6Lr+Bu+=K(z zW6f^D^ksM+w?|?B%^1|tnHtyot!oEkU^oB)nH_7|RqwY>id<|5AlxRnT_%=vLiLAs z-CF!G6^C;(09o(j+kkB*s1Wo%vL!elVV}V@AI5e2`mU^4k_u3Sp5+) z43v3=SY98|gLa%&M5~O#>#uGi!opZ!S`1N?W86j8?PU@hpLo+$aL07G7c_A-QP!rp ztzJMkG(zlU!cUb36=>a7r231=07@@24-azoRhtc_ks1|Y666>}PGRUc bjw6f@Wj+33^pH0U00000NkvXXu0mjfkB776 diff --git a/tests/snapshots/nanos/test_sign_tx_short_tx/00012.png b/tests/snapshots/nanos/test_sign_tx_short_tx/00012.png new file mode 100644 index 0000000000000000000000000000000000000000..02d922befda7ad5494398ded74de6ab739697b06 GIT binary patch literal 408 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 R4dVa+002ovPDHLkV1fadJ+=S< diff --git a/tests/snapshots/nanosp/test_blind_sign_tx_long_tx/part1/00003.png b/tests/snapshots/nanosp/test_blind_sign_tx_long_tx/part1/00003.png index 2c8ac7e6eb3b7baac0e31a5c3239e1969c98cab9..27000e65ebf02d47d53c6fa566f8e0e6ec8568fc 100644 GIT binary patch delta 683 zcmV;c0#yB!1HuK6BYy&kNkl)qU{eAjPj98XmRksIu{x(%fLQIO2j{U<)~ExkE7FsRJR0mV^1Vz+ zz!Xma000164S)588efoM-K0cX6-`yyQX1^@Ei$Sqn(o7YK$fQ>I)N`PG9%7|hwq8n zQk~kGanbY7{1>sol`>s$FT~&1e5|)QmRkCX=e#|5a0j$9Gy*+oo?!miSY~#_vE?%YT;te$VcW+x9`Gdz$#xru+IL zl1tT-$V#=Ce-G%sS+P$scZq&MKHWv&JD|)LDUR|p;n~tud?PS}k#aA6i&zfME)Qr2 z=d)-folu%KU_9o}{G`2q_FF(rI=&%xTCrAWPy zNr@53kbgB=5%)z(CRMUy)x9TdG8vR=W86-4pqe@PZ`|P(T;-Q>sp~o;B4yCdrxyEF z5^!p8tpZV1q>S6__(Aavh?gLFRlX03-ka00000000000001d6@QE|*sqQ1 R4dVa+002ovPDHLkV1nsdJxu@r delta 378 zcmV-=0fqj;1(XAjBYy!~Nkl)6FKHd%36E`YfPsw}aUx1SIiH>Q_9=toqt^9|e z*aKo-4oOM7NTs{jv}R8{8Eu+{dO%tOF=KkFk~sUAXJb}^Pk**h0aErk-5iQ^Mp~y* zCv)`nZop+Bgfr=@_m6e>&jC_cK{gLoriyIjH78*J0D%8Aei^E&*>@i)ECeOD7Hn=g z*h^eGQrfrZh`g4qeWe|RL*7g8w3Q75`%~YCN*ns(bbH>L@Q?ZH0vtw57b7?0;{9w} zW_G}JzuTtyC36|P8=4&)*UY=kwM&N>T!7L#XMHOSM|(R)ooH7?=dY!zm8FzjP4ykI zf3VkW#<`?%?&BWYCn_eH>`#+PHQAqx8hBz9^29vsiSz;h000000000000000006i7 Y0+V(=)kjBBV*mgE07*qoM6N<$f~3i-9{>OV diff --git a/tests/snapshots/nanosp/test_blind_sign_tx_long_tx/part1/00004.png b/tests/snapshots/nanosp/test_blind_sign_tx_long_tx/part1/00004.png index 53ae65195fbea5b281a1bc1a80351dbf1cd79ff8..2c8ac7e6eb3b7baac0e31a5c3239e1969c98cab9 100644 GIT binary patch delta 377 zcmV-<0fzqU0+a)gB!62;L_t(|obA|K5`!QNK+&|*ov{BUWiS2EVHm?h86?==^VQlK zF_DLe00000)4jYKAR?lw>DLf~SCIKW-VN9jH!5FG$$R8qfRglyj%m#vygSIP{D+{} z17cndNlCj%rMuX)W=}jBZJLF8Kw1MaV|uERIQy7qV^)Gswtr9oQuaCB9Ex;CTBlMc zbM*FZz-1wXGwG}Mk9GLZ0a92&HV;;&ifrUHCt&~pfd4dp8LFz;cONM%1SPi?Y;HN& zOI$iq+PCP4yq2wfr5%Ms-b?Sal??;?Q{RV58~WmOd)}MykNN8Y97anQBRAvX{cKxi zcEEMN+ot&?8FIWEnjIY1%)8CCONSU-fYLf=eJcz{dpky*Xjeq%ucfM$rIcMw^&PQ) zu-9$IxukLK;~v{5DkhoiPm@VC*`JIWcw!Xt#60YY^a20?0000000000000000Jr%9 XlXgDUM@La(00000NkvXXu0mjf+ZC%t delta 337 zcmbQj{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%99Hc;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 zH6PNyiQd|Lm0PfUPFtnWXfpPxEGL>bcmBgvGOE8^+M17u26I_+AT z#bzzP>rah~%zx^&yfi7as|}-mD6bG@5*}v#H-&l7Hb=1-*AA0(Wc(z+=pyV&VF*uW z`CibSkN^O{)lR*`x#jJX6XgV~`=@+F-h6HCo5mZiBX4U}`#X{1go@qb<-tnlxJoKm zB2}3Ir6Xh0`hC!nTmlXjFWYZTe<356faIjrIal;_RyKdR1RN<|mX*=L3(|J8;VY2&#qrkz000000Nl+VtD-!y7@Mbx00000NkvXXu0mjfZMoZ> diff --git a/tests/snapshots/nanosp/test_blind_sign_tx_long_tx/part1/00006.png b/tests/snapshots/nanosp/test_blind_sign_tx_long_tx/part1/00006.png new file mode 100644 index 0000000000000000000000000000000000000000..79857a0267ee414b6d04cca997d48106d64ba911 GIT binary patch literal 471 zcmV;|0Vw{7P)#bpS7_dOvl2n-YDN3F!8|Zw}1F7^_|`|7^d-WZmAca`5Sx-r#o;?yf)8 zamTB%jcSo;Cxq7w@YDAG;F6%vdkN~UKMPCH+44GbgZ0O61|;n~NJs3(zH0)OyObgT z0C=#wjq|e8y=uL$7S9x$jZ$lEcdNB^nwK)>H6PNyiQd|Lm0PfUPFtnWXfpPxEGL>bcmBgvGOE8^+M17u26I_+AT#bzzP>rah~%<8qgG%2*J4WoW2uMlMt z9%lVFg?Z36N3j^!4wH0b{3O8WBJ4_G2v2AEUeKM8006+%PQAmq$BV*J0ebACz0uB~0+iy*OAtRT7 z96rVI*8>0m0002o%^$0xJh2#?r-}do N002ovPDHLkV1fi5-8TRL literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanosp/test_sign_tx_short_tx/00001.png b/tests/snapshots/nanosp/test_sign_tx_short_tx/00001.png index bf3675325f5a1fd84129d442f1095c240a43bf90..ac30e02978e99a435007ee9cbe4f73015c3a9732 100644 GIT binary patch delta 480 zcmV<60U!Ri1NsAyB!9t4L_t(|obB0Lj>8}fKv8BiJ7NDzVlVT7gph5_qmZQSJzrJA z!*PHlGz0(u0N`>zvlUWG;z*2fQ!wjtRBMqu^NKoBN;>Yh4&bgU`rFb!x;1fKW_R6|wcn}I4u26uCXVMU=(?qFt8Pg_ zeO6Qyk&O3l##8F*#Z5F)#}*m`#j$4wh{$GxXr*kSHM9DmHC^1@wMKT{fXvUPP|s^; zb-JEjaJuE!I@-1bEi;!9QDCaISE>vC%T+h>5&LIA9y^1>$9xEz?}hd8eC6ec$bxff z3;ie-v2E}1OMmI1aN{)#sGi7F% zU?V!|ea^V}V9g|x{mU4sCi@rT9^8pl=uVv^a}SOpy#N3J000000000000000z%l>( WyoPnvCfKI{0000681GfW^B!7NML_t(|obB0Ba)clZfZ?>WH}U>Q;x2t~hQR~^c9GES|2-+C zzy^(D6afGL0G9g-oI9mdo*u_Beek(sewvh$+Jk*YTjmwLfQx+Dme+4eDYr;*QCGuV z9ii-8wp52*>^o%E(#Vy221~Vw$Wb`k%VXPFuG?mZT`ztEs(&H#-AXmK^H!NEegpow zKe++7?ikxSJnfWr+<=kPoD+I}gp@6<&azqb0RRAS!(j11^_fyE3xA1?FZt!^opsng z=fV1=&zHlG=lPMqB0;y?~2+*_PLDN-4KUaZy*p zT^*t9T((q)UFaKm8nK=qkYEDL{$jW7A->78}h zKIg&urO%!5iS0=+l>N)v~?}g5Tz4e)_JD{_GcUIV$56@`^ndmQ5 z2{qAQj6H}%7K+pfGJEhS!V3TZ00000000000000002e&w2Z4NRM&MBn>Hq)$07*qo IM6N<$g2~v;AOHXW delta 547 zcmV+;0^I$#1G@x}BYy${Nklw0000001W4Aiq{w;y$&Jh-INZ}TG1vrVvI6nZq4@QXLbO8Q2J>7raK_U z7($SJ6jRa;n<3W0V!1irBb_O*TwnDuW+$~H>liaa9dz%VaDTA_dnYA(6tj3h17t!Srr1RZdNbQj zz?f=QN$nFEL+EjtzG97~_<(VhKOhitM&HtWL<;X-;{EyIVn9m{24ZX>>j=iy{x^BnFyoR8=gbKsV@ zR3V=fl8ia%ikI}>i=$KYF=4#-WiV=@wP~6zba&B$vVRYo9RI)XTxpi|sDhPH6v(=imJl8wVKH0{qnBR!2Qhu99JAkDCi{)MHu>$}A00000 l0000002}}S0002kn_orQ{fIe8&j0`b002ovPDHLkV1lF)_}u^i diff --git a/tests/snapshots/nanosp/test_sign_tx_short_tx/00003.png b/tests/snapshots/nanosp/test_sign_tx_short_tx/00003.png index ebcd22e7eb47dcdb668c9c3ccc26602185db2e0c..dba442abbd22e2b28247ecaf4fd74baeb0d06885 100644 GIT binary patch delta 547 zcmV+;0^I%i2D=21BYy${Nklw0000001W4Aiq{w;y$&Jh-INZ}TG1vrVvI6nZq4@QXLbO8Q2J>7raK_U z7($SJ6jRa;n<3W0V!1irBb_O*TwnDuW+$~H>liaa9dz%VaDTA_dnYA(6tj3h17t!Srr1RZdNbQj zz?f=QN$nFEL+EjtzG97~_<(VhKOhitM&HtWL<;X-;{EyIVn9m{24ZX>>j=iy{x^BnFyoR8=gbKsV@ zR3V=fl8ia%ikI}>i=$KYF=4#-WiV=@wP~6zba&B$vVRYo9RI)XTxpi|sDhPH6v(=imJl8wVKH0{qnBR!2Qhu99JAkDCi{)MHu>$}A00000 l0000002}}S0002kn_orQ{fIe8&j0`b002ovPDHLkV1hS|`62)S delta 867 zcmV-p1DyQ31o;M#BYy)xNklmwhHJH?tkZ2>Q{iJ1)`5vZyaLn zt|7NBsAc0j%*Wc=s$Jj5juqfOszuP z=t8ZO+H~)-Jq5X;u|_6>_T5+>ce1yIY?%Oe4|jbN8Qo%hTWKwvzHwF@a@{lU=O4(_ z)NbIVtO#*Ddv4znyhBBlCvf$bEz-*bO4`OSgO{=nY26p)wr=f@B=wot8M(et^KZloF zTw|}H)*gnZCxGn1%>xU*1}PbQe{(RnwZ>+#A8eKO`F|BF+}kZHAkw1yud_k?gI&mihY%>+t4G(Ic|3H zk<#=4VUQL5$8bWe=s%3+;GHN7y^|!!nuD#_@FF#o+2;XEUlDKncy+TG-Cb#FWRzEC zjJWehr+*jN<|ddD1^W+-bP9Y9e{vPgW#dAlvr=eeaoPB@l+W?=$&DsbM4>9lB$Ee3 z(1k`_{jsX6Xad}nx4hOE1t}ejD>U*(+_AJ#S32#B0iRI^=EOK&OJP`3({N5_jGLC% z+FjEYIeM#33AQ4P@zX#P03LH-Ilq4$-P_5GIe#Uix~Ul$U7yVT($;r?5JCtc#P5Vs zLuc>ML0w#C*?Fo~GPQu8Gy?7znUgRDRyrB6uo>61$=NbDJ>$Yyw7{~BWm*l@xg(0e z+WCLiZ$qb!z979Yr_ks$TcUcBMA0ueFsEzk>KKZ-i<;3>8CPlQa2u`ilXf`rFp%E| zq+C-+YF-a3VpW15<7ariO*Nf}apcu2!+)Vo4v-N5JH3>}OZnai_G-~3%+>un8P_@3 t8uAv~=&T^gb+f!pMO{@e7=9=-Gu-E002ovPDHLkV1o2?tj7QV diff --git a/tests/snapshots/nanosp/test_sign_tx_short_tx/00004.png b/tests/snapshots/nanosp/test_sign_tx_short_tx/00004.png index 206f7d55addcc4992811a2042c152e6b74d27755..ebcd22e7eb47dcdb668c9c3ccc26602185db2e0c 100644 GIT binary patch delta 867 zcmV-p1DyQz1NjD!BYy)xNklmwhHJH?tkZ2>Q{iJ1)`5vZyaLn zt|7NBsAc0j%*Wc=s$Jj5juqfOszuP z=t8ZO+H~)-Jq5X;u|_6>_T5+>ce1yIY?%Oe4|jbN8Qo%hTWKwvzHwF@a@{lU=O4(_ z)NbIVtO#*Ddv4znyhBBlCvf$bEz-*bO4`OSgO{=nY26p)wr=f@B=wot8M(et^KZloF zTw|}H)*gnZCxGn1%>xU*1}PbQe{(RnwZ>+#A8eKO`F|BF+}kZHAkw1yud_k?gI&mihY%>+t4G(Ic|3H zk<#=4VUQL5$8bWe=s%3+;GHN7y^|!!nuD#_@FF#o+2;XEUlDKncy+TG-Cb#FWRzEC zjJWehr+*jN<|ddD1^W+-bP9Y9e{vPgW#dAlvr=eeaoPB@l+W?=$&DsbM4>9lB$Ee3 z(1k`_{jsX6Xad}nx4hOE1t}ejD>U*(+_AJ#S32#B0iRI^=EOK&OJP`3({N5_jGLC% z+FjEYIeM#33AQ4P@zX#P03LH-Ilq4$-P_5GIe#Uix~Ul$U7yVT($;r?5JCtc#P5Vs zLuc>ML0w#C*?Fo~GPQu8Gy?7znUgRDRyrB6uo>61$=NbDJ>$Yyw7{~BWm*l@xg(0e z+WCLiZ$qb!z979Yr_ks$TcUcBMA0ueFsEzk>KKZ-i<;3>8CPlQa2u`ilXf`rFp%E| zq+C-+YF-a3VpW15<7ariO*Nf}apcu2!+)Vo4v-N5JH3>}OZnai_G-~3%+>un8P_@3 t8uAv~=&T^gb+f!pMO{@e7=9=-Gu-E002ovPDHLkV1l)etpET3 delta 476 zcmV<20VDqT2K57wBYy$BNkl_K z&Xf+Is3`#e005W!3(U1`Tlt)G4$K*qZBJOTl@2%g>mQZJ)EVY|q7oHNzvr{XR=@dd z^|o%8$3*?Rl+u4xBA>cAWTVxRb8eP`RhrTwLmF25igoOWUw;8oDMVeby0NLXIxE#! zCrVDzsIyt@5|3X2>QqffOV}yg;cr<{J+*cgmUT?5_yO40zPwV^U!5wC{m-$ep1}@0 z-K&q(7rdRPa_DCatK!S(rt z_H*MClKifa0e=YT2>{^N1#Cl|ZCP_W*0b+a6OIL{o5;g#V;OGaKYM8&KR8byoP;xh zXG6x?XRNvtRv(%VPnH+o^(=WDed?8k^;TqEU! zSdX3SuMa$dJf~MnUP;!kSvsFW`(Awa-)=+CP7VK5*j2v`m50p-TAN6}V?7y$x1k5+ zeepzl4ztKq|1wIcss6`J8hO%o&w!Pgt^*4mbJhACon$jXe8dm#?b?k^=0e?~{L|w1Cv8lB>E7e#h zN>0+KvsvsCk6!`mR82=q*eTrMZ&^`2wRRSkbxf@I0od2Ryi(O)ohpz0&#|bU!45p# ztCpXF)Y8bto(jqfW5}#@Cd#Sqjfvle$}%P6%694^+=N)`NsV%PSO>}|=Q?!3_4$SN zbK?_|{H~Az2!H7b0N~dJY(t%GS#vwqv+qcl$ir-78E)f0dubj&I8Pv)gfoF> zL&n-?thy6cADRzOmKWdkEO{J#>Xn7{R%BgZ37;9)$zLx524H4AT4&pJfl;Cs2!BJ8>4e(?O9LgQX}h00000000000000000026%oj)Yw?tc+ R#54c^002ovPDHLkV1i49;DP`E delta 336 zcmV-W0k8h`1M32iB!4nVL_t(|obB0B4#FS|fMH_13HLuz@8SaqX@H@d($?{RPdL~l ztt)J%1ONa4Y)eE$#CsMF9^Mm3DWw{EvmC_9_tSdok|r z!@T(40nIN_e=M=njb>Qweft&q^xDoj`$j)SNI-Ea7JbBn)PIu;qLiTjjo_D@?*Ltz z`{I72zgOHV$z>r*kS@xnP8qJE{em$$ecL+^003Ywlbv7RweE=SYKGl;V>)^3*>|mL z=r0|H+cF0s9>iRH^1NnX(*y*Ge%dwx6UMpOF#)B-*9Bns4}_U0ucIyL5bKDCs7tFi z0L{ju-vv$v|4H!3WCBZfqHnHz=Phs;he0O#W(J`q`o_qCC#sMq)?rVC7XSbN00000 i0000000000Smp(>AT9#5B%4qG0000ok|r z!@T(40nIN_e=M=njb>Qweft&q^xDoj`$j)SNI-Ea7JbBn)PIu;qLiTjjo_D@?*Ltz z`{I72zgOHV$z>r*kS@xnP8qJE{em$$ecL+^003Ywlbv7RweE=SYKGl;V>)^3*>|mL z=r0|H+cF0s9>iRH^1NnX(*y*Ge%dwx6UMpOF#)B-*9Bns4}_U0ucIyL5bKDCs7tFi z0L{ju-vv$v|4H!3WCBZfqHnHz=Phs;he0O#W(J`q`o_qCC#sMq)?rVC7XSbN00000 i0000000000Smp(>AT9#5B%4qG0000KZ`L-=LOq~v18K(eniE|6n5%U3=I&h=Vn|P{f{j(f0*v;H1TYt z^KPg*IF62H-(&QpdjnYOoN=~JU-5Eq*0SXCyNY$nSxU8sYN1nM$C5`bu3hIl(FZd_ zCjDuYs7Ze^+8`36P$cHzNW=>O000000000000000000d03yCg11J%07*qo IM6N<$f)8q_3;+NC diff --git a/tests/snapshots/nanosp/test_sign_tx_short_tx/00007.png b/tests/snapshots/nanosp/test_sign_tx_short_tx/00007.png index 53ae65195fbea5b281a1bc1a80351dbf1cd79ff8..180d8bb31402604a3b46ded62e2667d43732772f 100644 GIT binary patch delta 362 zcmV-w0hRvj0)+#RB!5gvL_t(|obB0Nj)Wi(M$wwd?1cRKZ`L-=LOq~v18K(eniE|6n5%U3=I&h=Vn|P{f{j(f0*v;H1TYt z^KPg*IF62H-(&QpdjnYOoN=~JU-5Eq*0SXCyNY$nSxU8sYN1nM$C5`bu3hIl(FZd_ zCjDuYs7Ze^+8`36P$cHzNW=>O000000000000000000d03yCg11J%07*qo IM6N<$f)LcG4FCWD delta 337 zcmZo=e#10DrQX=n#WAE}&fA-Te9a01t`{>e&)x7}b>sB92?B>0*7klh{5EgB*xH5p zk5*)`F~ETXkLB|@o2$gwZLSJi1h09~{aa+gviU)m&OMosz&fLJ#)6m8JD5abc^@sy zf5;V}yl!E;-~BUkuQ>l4DqjeaGhXoGQQz!;4h!n7cNT2_^Ud&H!GHBdnJ1Ri&vd-9 zq~0)Vfs1(1BdawodkU29oty9RN9E1*l7DBtZ5tccNu(}KG@B8mHG9|HTkG!%&9h%n zVCY=Qb|!3UccMn!hQCwKZ~tp^$7;>Hsb9JaOvj4WuwQcWDM$g~J%Bg%K zQ8KiQZOhqP`_sHKYj1X^DeqH$JE2-N&(XBIv^bu>%>A|Ap4YbJFPv^mwiR7p@gTe~DWM4fVz!?b diff --git a/tests/snapshots/nanosp/test_sign_tx_short_tx/00008.png b/tests/snapshots/nanosp/test_sign_tx_short_tx/00008.png index 79857a0267ee414b6d04cca997d48106d64ba911..53ae65195fbea5b281a1bc1a80351dbf1cd79ff8 100644 GIT binary patch delta 337 zcmcc4{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 zH6PNyiQd|Lm0PfUPFtnWXfpPxEGL>bcmBgvGOE8^+M17u26I_+AT z#bzzP>rah~%zx^&yfi7as|}-mD6bG@5*}v#H-&l7Hb=1-*AA0(Wc(z+=pyV&VF*uW z`CibSkN^O{)lR*`x#jJX6XgV~`=@+F-h6HCo5mZiBX4U}`#X{1go@qb<-tnlxJoKm zB2}3Ir6Xh0`hC!nTmlXjFWYZTe<356faIjrIal;_RyKdR1RN<|mX*=L3(|J8;VY2&#qrkz000000Nl+VtD-!y7@Mbx00000NkvXXu0mjfZMoZ> diff --git a/tests/snapshots/nanosp/test_sign_tx_short_tx/00009.png b/tests/snapshots/nanosp/test_sign_tx_short_tx/00009.png new file mode 100644 index 0000000000000000000000000000000000000000..79857a0267ee414b6d04cca997d48106d64ba911 GIT binary patch literal 471 zcmV;|0Vw{7P)#bpS7_dOvl2n-YDN3F!8|Zw}1F7^_|`|7^d-WZmAca`5Sx-r#o;?yf)8 zamTB%jcSo;Cxq7w@YDAG;F6%vdkN~UKMPCH+44GbgZ0O61|;n~NJs3(zH0)OyObgT z0C=#wjq|e8y=uL$7S9x$jZ$lEcdNB^nwK)>H6PNyiQd|Lm0PfUPFtnWXfpPxEGL>bcmBgvGOE8^+M17u26I_+AT#bzzP>rah~%<8qgG%2*J4WoW2uMlMt z9%lVFg?Z36N3j^!4wH0b{3O8WBJ4_G2v2AEUeKM8006+%PQAmq$BV*J0ebACz0uB~0+iy*OAtRT7 z96rVI*8>0m0002o%^$0xJh2#?r-}do N002ovPDHLkV1fi5-8TRL literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanox/test_blind_sign_tx_long_tx/part1/00001.png b/tests/snapshots/nanox/test_blind_sign_tx_long_tx/part1/00001.png index 63fa6f5787a14bf7e1834c54e964c0b999f00382..f5226fcb86a3d5a1e0cb2e4b30ce130547e98c0f 100644 GIT binary patch delta 458 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 R4dVa+002ovPDHLkV1fadJ+=S< diff --git a/tests/snapshots/nanox/test_blind_sign_tx_long_tx/part1/00003.png b/tests/snapshots/nanox/test_blind_sign_tx_long_tx/part1/00003.png index 2c8ac7e6eb3b7baac0e31a5c3239e1969c98cab9..27000e65ebf02d47d53c6fa566f8e0e6ec8568fc 100644 GIT binary patch delta 683 zcmV;c0#yB!1HuK6BYy&kNkl)qU{eAjPj98XmRksIu{x(%fLQIO2j{U<)~ExkE7FsRJR0mV^1Vz+ zz!Xma000164S)588efoM-K0cX6-`yyQX1^@Ei$Sqn(o7YK$fQ>I)N`PG9%7|hwq8n zQk~kGanbY7{1>sol`>s$FT~&1e5|)QmRkCX=e#|5a0j$9Gy*+oo?!miSY~#_vE?%YT;te$VcW+x9`Gdz$#xru+IL zl1tT-$V#=Ce-G%sS+P$scZq&MKHWv&JD|)LDUR|p;n~tud?PS}k#aA6i&zfME)Qr2 z=d)-folu%KU_9o}{G`2q_FF(rI=&%xTCrAWPy zNr@53kbgB=5%)z(CRMUy)x9TdG8vR=W86-4pqe@PZ`|P(T;-Q>sp~o;B4yCdrxyEF z5^!p8tpZV1q>S6__(Aavh?gLFRlX03-ka00000000000001d6@QE|*sqQ1 R4dVa+002ovPDHLkV1nsdJxu@r delta 378 zcmV-=0fqj;1(XAjBYy!~Nkl)6FKHd%36E`YfPsw}aUx1SIiH>Q_9=toqt^9|e z*aKo-4oOM7NTs{jv}R8{8Eu+{dO%tOF=KkFk~sUAXJb}^Pk**h0aErk-5iQ^Mp~y* zCv)`nZop+Bgfr=@_m6e>&jC_cK{gLoriyIjH78*J0D%8Aei^E&*>@i)ECeOD7Hn=g z*h^eGQrfrZh`g4qeWe|RL*7g8w3Q75`%~YCN*ns(bbH>L@Q?ZH0vtw57b7?0;{9w} zW_G}JzuTtyC36|P8=4&)*UY=kwM&N>T!7L#XMHOSM|(R)ooH7?=dY!zm8FzjP4ykI zf3VkW#<`?%?&BWYCn_eH>`#+PHQAqx8hBz9^29vsiSz;h000000000000000006i7 Y0+V(=)kjBBV*mgE07*qoM6N<$f~3i-9{>OV diff --git a/tests/snapshots/nanox/test_blind_sign_tx_long_tx/part1/00004.png b/tests/snapshots/nanox/test_blind_sign_tx_long_tx/part1/00004.png index 53ae65195fbea5b281a1bc1a80351dbf1cd79ff8..2c8ac7e6eb3b7baac0e31a5c3239e1969c98cab9 100644 GIT binary patch delta 377 zcmV-<0fzqU0+a)gB!62;L_t(|obA|K5`!QNK+&|*ov{BUWiS2EVHm?h86?==^VQlK zF_DLe00000)4jYKAR?lw>DLf~SCIKW-VN9jH!5FG$$R8qfRglyj%m#vygSIP{D+{} z17cndNlCj%rMuX)W=}jBZJLF8Kw1MaV|uERIQy7qV^)Gswtr9oQuaCB9Ex;CTBlMc zbM*FZz-1wXGwG}Mk9GLZ0a92&HV;;&ifrUHCt&~pfd4dp8LFz;cONM%1SPi?Y;HN& zOI$iq+PCP4yq2wfr5%Ms-b?Sal??;?Q{RV58~WmOd)}MykNN8Y97anQBRAvX{cKxi zcEEMN+ot&?8FIWEnjIY1%)8CCONSU-fYLf=eJcz{dpky*Xjeq%ucfM$rIcMw^&PQ) zu-9$IxukLK;~v{5DkhoiPm@VC*`JIWcw!Xt#60YY^a20?0000000000000000Jr%9 XlXgDUM@La(00000NkvXXu0mjf+ZC%t delta 337 zcmbQj{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%99Hc;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 zH6PNyiQd|Lm0PfUPFtnWXfpPxEGL>bcmBgvGOE8^+M17u26I_+AT z#bzzP>rah~%zx^&yfi7as|}-mD6bG@5*}v#H-&l7Hb=1-*AA0(Wc(z+=pyV&VF*uW z`CibSkN^O{)lR*`x#jJX6XgV~`=@+F-h6HCo5mZiBX4U}`#X{1go@qb<-tnlxJoKm zB2}3Ir6Xh0`hC!nTmlXjFWYZTe<356faIjrIal;_RyKdR1RN<|mX*=L3(|J8;VY2&#qrkz000000Nl+VtD-!y7@Mbx00000NkvXXu0mjfZMoZ> diff --git a/tests/snapshots/nanox/test_blind_sign_tx_long_tx/part1/00006.png b/tests/snapshots/nanox/test_blind_sign_tx_long_tx/part1/00006.png new file mode 100644 index 0000000000000000000000000000000000000000..79857a0267ee414b6d04cca997d48106d64ba911 GIT binary patch literal 471 zcmV;|0Vw{7P)#bpS7_dOvl2n-YDN3F!8|Zw}1F7^_|`|7^d-WZmAca`5Sx-r#o;?yf)8 zamTB%jcSo;Cxq7w@YDAG;F6%vdkN~UKMPCH+44GbgZ0O61|;n~NJs3(zH0)OyObgT z0C=#wjq|e8y=uL$7S9x$jZ$lEcdNB^nwK)>H6PNyiQd|Lm0PfUPFtnWXfpPxEGL>bcmBgvGOE8^+M17u26I_+AT#bzzP>rah~%<8qgG%2*J4WoW2uMlMt z9%lVFg?Z36N3j^!4wH0b{3O8WBJ4_G2v2AEUeKM8006+%PQAmq$BV*J0ebACz0uB~0+iy*OAtRT7 z96rVI*8>0m0002o%^$0xJh2#?r-}do N002ovPDHLkV1fi5-8TRL literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanox/test_sign_tx_short_tx/00001.png b/tests/snapshots/nanox/test_sign_tx_short_tx/00001.png index bf3675325f5a1fd84129d442f1095c240a43bf90..ac30e02978e99a435007ee9cbe4f73015c3a9732 100644 GIT binary patch delta 480 zcmV<60U!Ri1NsAyB!9t4L_t(|obB0Lj>8}fKv8BiJ7NDzVlVT7gph5_qmZQSJzrJA z!*PHlGz0(u0N`>zvlUWG;z*2fQ!wjtRBMqu^NKoBN;>Yh4&bgU`rFb!x;1fKW_R6|wcn}I4u26uCXVMU=(?qFt8Pg_ zeO6Qyk&O3l##8F*#Z5F)#}*m`#j$4wh{$GxXr*kSHM9DmHC^1@wMKT{fXvUPP|s^; zb-JEjaJuE!I@-1bEi;!9QDCaISE>vC%T+h>5&LIA9y^1>$9xEz?}hd8eC6ec$bxff z3;ie-v2E}1OMmI1aN{)#sGi7F% zU?V!|ea^V}V9g|x{mU4sCi@rT9^8pl=uVv^a}SOpy#N3J000000000000000z%l>( WyoPnvCfKI{0000681GfW^B!7NML_t(|obB0Ba)clZfZ?>WH}U>Q;x2t~hQR~^c9GES|2-+C zzy^(D6afGL0G9g-oI9mdo*u_Beek(sewvh$+Jk*YTjmwLfQx+Dme+4eDYr;*QCGuV z9ii-8wp52*>^o%E(#Vy221~Vw$Wb`k%VXPFuG?mZT`ztEs(&H#-AXmK^H!NEegpow zKe++7?ikxSJnfWr+<=kPoD+I}gp@6<&azqb0RRAS!(j11^_fyE3xA1?FZt!^opsng z=fV1=&zHlG=lPMqB0;y?~2+*_PLDN-4KUaZy*p zT^*t9T((q)UFaKm8nK=qkYEDL{$jW7A->78}h zKIg&urO%!5iS0=+l>N)v~?}g5Tz4e)_JD{_GcUIV$56@`^ndmQ5 z2{qAQj6H}%7K+pfGJEhS!V3TZ00000000000000002e&w2Z4NRM&MBn>Hq)$07*qo IM6N<$g2~v;AOHXW delta 547 zcmV+;0^I$#1G@x}BYy${Nklw0000001W4Aiq{w;y$&Jh-INZ}TG1vrVvI6nZq4@QXLbO8Q2J>7raK_U z7($SJ6jRa;n<3W0V!1irBb_O*TwnDuW+$~H>liaa9dz%VaDTA_dnYA(6tj3h17t!Srr1RZdNbQj zz?f=QN$nFEL+EjtzG97~_<(VhKOhitM&HtWL<;X-;{EyIVn9m{24ZX>>j=iy{x^BnFyoR8=gbKsV@ zR3V=fl8ia%ikI}>i=$KYF=4#-WiV=@wP~6zba&B$vVRYo9RI)XTxpi|sDhPH6v(=imJl8wVKH0{qnBR!2Qhu99JAkDCi{)MHu>$}A00000 l0000002}}S0002kn_orQ{fIe8&j0`b002ovPDHLkV1lF)_}u^i diff --git a/tests/snapshots/nanox/test_sign_tx_short_tx/00003.png b/tests/snapshots/nanox/test_sign_tx_short_tx/00003.png index ebcd22e7eb47dcdb668c9c3ccc26602185db2e0c..dba442abbd22e2b28247ecaf4fd74baeb0d06885 100644 GIT binary patch delta 547 zcmV+;0^I%i2D=21BYy${Nklw0000001W4Aiq{w;y$&Jh-INZ}TG1vrVvI6nZq4@QXLbO8Q2J>7raK_U z7($SJ6jRa;n<3W0V!1irBb_O*TwnDuW+$~H>liaa9dz%VaDTA_dnYA(6tj3h17t!Srr1RZdNbQj zz?f=QN$nFEL+EjtzG97~_<(VhKOhitM&HtWL<;X-;{EyIVn9m{24ZX>>j=iy{x^BnFyoR8=gbKsV@ zR3V=fl8ia%ikI}>i=$KYF=4#-WiV=@wP~6zba&B$vVRYo9RI)XTxpi|sDhPH6v(=imJl8wVKH0{qnBR!2Qhu99JAkDCi{)MHu>$}A00000 l0000002}}S0002kn_orQ{fIe8&j0`b002ovPDHLkV1hS|`62)S delta 867 zcmV-p1DyQ31o;M#BYy)xNklmwhHJH?tkZ2>Q{iJ1)`5vZyaLn zt|7NBsAc0j%*Wc=s$Jj5juqfOszuP z=t8ZO+H~)-Jq5X;u|_6>_T5+>ce1yIY?%Oe4|jbN8Qo%hTWKwvzHwF@a@{lU=O4(_ z)NbIVtO#*Ddv4znyhBBlCvf$bEz-*bO4`OSgO{=nY26p)wr=f@B=wot8M(et^KZloF zTw|}H)*gnZCxGn1%>xU*1}PbQe{(RnwZ>+#A8eKO`F|BF+}kZHAkw1yud_k?gI&mihY%>+t4G(Ic|3H zk<#=4VUQL5$8bWe=s%3+;GHN7y^|!!nuD#_@FF#o+2;XEUlDKncy+TG-Cb#FWRzEC zjJWehr+*jN<|ddD1^W+-bP9Y9e{vPgW#dAlvr=eeaoPB@l+W?=$&DsbM4>9lB$Ee3 z(1k`_{jsX6Xad}nx4hOE1t}ejD>U*(+_AJ#S32#B0iRI^=EOK&OJP`3({N5_jGLC% z+FjEYIeM#33AQ4P@zX#P03LH-Ilq4$-P_5GIe#Uix~Ul$U7yVT($;r?5JCtc#P5Vs zLuc>ML0w#C*?Fo~GPQu8Gy?7znUgRDRyrB6uo>61$=NbDJ>$Yyw7{~BWm*l@xg(0e z+WCLiZ$qb!z979Yr_ks$TcUcBMA0ueFsEzk>KKZ-i<;3>8CPlQa2u`ilXf`rFp%E| zq+C-+YF-a3VpW15<7ariO*Nf}apcu2!+)Vo4v-N5JH3>}OZnai_G-~3%+>un8P_@3 t8uAv~=&T^gb+f!pMO{@e7=9=-Gu-E002ovPDHLkV1o2?tj7QV diff --git a/tests/snapshots/nanox/test_sign_tx_short_tx/00004.png b/tests/snapshots/nanox/test_sign_tx_short_tx/00004.png index 206f7d55addcc4992811a2042c152e6b74d27755..ebcd22e7eb47dcdb668c9c3ccc26602185db2e0c 100644 GIT binary patch delta 867 zcmV-p1DyQz1NjD!BYy)xNklmwhHJH?tkZ2>Q{iJ1)`5vZyaLn zt|7NBsAc0j%*Wc=s$Jj5juqfOszuP z=t8ZO+H~)-Jq5X;u|_6>_T5+>ce1yIY?%Oe4|jbN8Qo%hTWKwvzHwF@a@{lU=O4(_ z)NbIVtO#*Ddv4znyhBBlCvf$bEz-*bO4`OSgO{=nY26p)wr=f@B=wot8M(et^KZloF zTw|}H)*gnZCxGn1%>xU*1}PbQe{(RnwZ>+#A8eKO`F|BF+}kZHAkw1yud_k?gI&mihY%>+t4G(Ic|3H zk<#=4VUQL5$8bWe=s%3+;GHN7y^|!!nuD#_@FF#o+2;XEUlDKncy+TG-Cb#FWRzEC zjJWehr+*jN<|ddD1^W+-bP9Y9e{vPgW#dAlvr=eeaoPB@l+W?=$&DsbM4>9lB$Ee3 z(1k`_{jsX6Xad}nx4hOE1t}ejD>U*(+_AJ#S32#B0iRI^=EOK&OJP`3({N5_jGLC% z+FjEYIeM#33AQ4P@zX#P03LH-Ilq4$-P_5GIe#Uix~Ul$U7yVT($;r?5JCtc#P5Vs zLuc>ML0w#C*?Fo~GPQu8Gy?7znUgRDRyrB6uo>61$=NbDJ>$Yyw7{~BWm*l@xg(0e z+WCLiZ$qb!z979Yr_ks$TcUcBMA0ueFsEzk>KKZ-i<;3>8CPlQa2u`ilXf`rFp%E| zq+C-+YF-a3VpW15<7ariO*Nf}apcu2!+)Vo4v-N5JH3>}OZnai_G-~3%+>un8P_@3 t8uAv~=&T^gb+f!pMO{@e7=9=-Gu-E002ovPDHLkV1l)etpET3 delta 476 zcmV<20VDqT2K57wBYy$BNkl_K z&Xf+Is3`#e005W!3(U1`Tlt)G4$K*qZBJOTl@2%g>mQZJ)EVY|q7oHNzvr{XR=@dd z^|o%8$3*?Rl+u4xBA>cAWTVxRb8eP`RhrTwLmF25igoOWUw;8oDMVeby0NLXIxE#! zCrVDzsIyt@5|3X2>QqffOV}yg;cr<{J+*cgmUT?5_yO40zPwV^U!5wC{m-$ep1}@0 z-K&q(7rdRPa_DCatK!S(rt z_H*MClKifa0e=YT2>{^N1#Cl|ZCP_W*0b+a6OIL{o5;g#V;OGaKYM8&KR8byoP;xh zXG6x?XRNvtRv(%VPnH+o^(=WDed?8k^;TqEU! zSdX3SuMa$dJf~MnUP;!kSvsFW`(Awa-)=+CP7VK5*j2v`m50p-TAN6}V?7y$x1k5+ zeepzl4ztKq|1wIcss6`J8hO%o&w!Pgt^*4mbJhACon$jXe8dm#?b?k^=0e?~{L|w1Cv8lB>E7e#h zN>0+KvsvsCk6!`mR82=q*eTrMZ&^`2wRRSkbxf@I0od2Ryi(O)ohpz0&#|bU!45p# ztCpXF)Y8bto(jqfW5}#@Cd#Sqjfvle$}%P6%694^+=N)`NsV%PSO>}|=Q?!3_4$SN zbK?_|{H~Az2!H7b0N~dJY(t%GS#vwqv+qcl$ir-78E)f0dubj&I8Pv)gfoF> zL&n-?thy6cADRzOmKWdkEO{J#>Xn7{R%BgZ37;9)$zLx524H4AT4&pJfl;Cs2!BJ8>4e(?O9LgQX}h00000000000000000026%oj)Yw?tc+ R#54c^002ovPDHLkV1i49;DP`E delta 336 zcmV-W0k8h`1M32iB!4nVL_t(|obB0B4#FS|fMH_13HLuz@8SaqX@H@d($?{RPdL~l ztt)J%1ONa4Y)eE$#CsMF9^Mm3DWw{EvmC_9_tSdok|r z!@T(40nIN_e=M=njb>Qweft&q^xDoj`$j)SNI-Ea7JbBn)PIu;qLiTjjo_D@?*Ltz z`{I72zgOHV$z>r*kS@xnP8qJE{em$$ecL+^003Ywlbv7RweE=SYKGl;V>)^3*>|mL z=r0|H+cF0s9>iRH^1NnX(*y*Ge%dwx6UMpOF#)B-*9Bns4}_U0ucIyL5bKDCs7tFi z0L{ju-vv$v|4H!3WCBZfqHnHz=Phs;he0O#W(J`q`o_qCC#sMq)?rVC7XSbN00000 i0000000000Smp(>AT9#5B%4qG0000ok|r z!@T(40nIN_e=M=njb>Qweft&q^xDoj`$j)SNI-Ea7JbBn)PIu;qLiTjjo_D@?*Ltz z`{I72zgOHV$z>r*kS@xnP8qJE{em$$ecL+^003Ywlbv7RweE=SYKGl;V>)^3*>|mL z=r0|H+cF0s9>iRH^1NnX(*y*Ge%dwx6UMpOF#)B-*9Bns4}_U0ucIyL5bKDCs7tFi z0L{ju-vv$v|4H!3WCBZfqHnHz=Phs;he0O#W(J`q`o_qCC#sMq)?rVC7XSbN00000 i0000000000Smp(>AT9#5B%4qG0000KZ`L-=LOq~v18K(eniE|6n5%U3=I&h=Vn|P{f{j(f0*v;H1TYt z^KPg*IF62H-(&QpdjnYOoN=~JU-5Eq*0SXCyNY$nSxU8sYN1nM$C5`bu3hIl(FZd_ zCjDuYs7Ze^+8`36P$cHzNW=>O000000000000000000d03yCg11J%07*qo IM6N<$f)8q_3;+NC diff --git a/tests/snapshots/nanox/test_sign_tx_short_tx/00007.png b/tests/snapshots/nanox/test_sign_tx_short_tx/00007.png index 53ae65195fbea5b281a1bc1a80351dbf1cd79ff8..180d8bb31402604a3b46ded62e2667d43732772f 100644 GIT binary patch delta 362 zcmV-w0hRvj0)+#RB!5gvL_t(|obB0Nj)Wi(M$wwd?1cRKZ`L-=LOq~v18K(eniE|6n5%U3=I&h=Vn|P{f{j(f0*v;H1TYt z^KPg*IF62H-(&QpdjnYOoN=~JU-5Eq*0SXCyNY$nSxU8sYN1nM$C5`bu3hIl(FZd_ zCjDuYs7Ze^+8`36P$cHzNW=>O000000000000000000d03yCg11J%07*qo IM6N<$f)LcG4FCWD delta 337 zcmZo=e#10DrQX=n#WAE}&fA-Te9a01t`{>e&)x7}b>sB92?B>0*7klh{5EgB*xH5p zk5*)`F~ETXkLB|@o2$gwZLSJi1h09~{aa+gviU)m&OMosz&fLJ#)6m8JD5abc^@sy zf5;V}yl!E;-~BUkuQ>l4DqjeaGhXoGQQz!;4h!n7cNT2_^Ud&H!GHBdnJ1Ri&vd-9 zq~0)Vfs1(1BdawodkU29oty9RN9E1*l7DBtZ5tccNu(}KG@B8mHG9|HTkG!%&9h%n zVCY=Qb|!3UccMn!hQCwKZ~tp^$7;>Hsb9JaOvj4WuwQcWDM$g~J%Bg%K zQ8KiQZOhqP`_sHKYj1X^DeqH$JE2-N&(XBIv^bu>%>A|Ap4YbJFPv^mwiR7p@gTe~DWM4fVz!?b diff --git a/tests/snapshots/nanox/test_sign_tx_short_tx/00008.png b/tests/snapshots/nanox/test_sign_tx_short_tx/00008.png index 79857a0267ee414b6d04cca997d48106d64ba911..53ae65195fbea5b281a1bc1a80351dbf1cd79ff8 100644 GIT binary patch delta 337 zcmcc4{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 zH6PNyiQd|Lm0PfUPFtnWXfpPxEGL>bcmBgvGOE8^+M17u26I_+AT z#bzzP>rah~%zx^&yfi7as|}-mD6bG@5*}v#H-&l7Hb=1-*AA0(Wc(z+=pyV&VF*uW z`CibSkN^O{)lR*`x#jJX6XgV~`=@+F-h6HCo5mZiBX4U}`#X{1go@qb<-tnlxJoKm zB2}3Ir6Xh0`hC!nTmlXjFWYZTe<356faIjrIal;_RyKdR1RN<|mX*=L3(|J8;VY2&#qrkz000000Nl+VtD-!y7@Mbx00000NkvXXu0mjfZMoZ> diff --git a/tests/snapshots/nanox/test_sign_tx_short_tx/00009.png b/tests/snapshots/nanox/test_sign_tx_short_tx/00009.png new file mode 100644 index 0000000000000000000000000000000000000000..79857a0267ee414b6d04cca997d48106d64ba911 GIT binary patch literal 471 zcmV;|0Vw{7P)#bpS7_dOvl2n-YDN3F!8|Zw}1F7^_|`|7^d-WZmAca`5Sx-r#o;?yf)8 zamTB%jcSo;Cxq7w@YDAG;F6%vdkN~UKMPCH+44GbgZ0O61|;n~NJs3(zH0)OyObgT z0C=#wjq|e8y=uL$7S9x$jZ$lEcdNB^nwK)>H6PNyiQd|Lm0PfUPFtnWXfpPxEGL>bcmBgvGOE8^+M17u26I_+AT#bzzP>rah~%<8qgG%2*J4WoW2uMlMt z9%lVFg?Z36N3j^!4wH0b{3O8WBJ4_G2v2AEUeKM8006+%PQAmq$BV*J0ebACz0uB~0+iy*OAtRT7 z96rVI*8>0m0002o%^$0xJh2#?r-}do N002ovPDHLkV1fi5-8TRL literal 0 HcmV?d00001 diff --git a/tests/snapshots/stax/test_blind_sign_tx_long_tx/part1/00002.png b/tests/snapshots/stax/test_blind_sign_tx_long_tx/part1/00002.png index c58859d18ff31fc37a4cbb5569ae3f7478a542c6..873f85b41675de033eccf6cd08ba90ef2fb350a0 100644 GIT binary patch literal 20218 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 b|Ma_OFqU^_s~P~0&|&a&^>bP0l+XkKKRPvs diff --git a/tests/snapshots/stax/test_blind_sign_tx_long_tx/part1/00003.png b/tests/snapshots/stax/test_blind_sign_tx_long_tx/part1/00003.png index f4d08a644a2347b63d46de13d146ce98d9a7ca22..06b34b816419ae394a9bbde290e9f5c6021f765f 100644 GIT binary patch literal 7851 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 Date: Tue, 23 Jan 2024 20:10:19 +0200 Subject: [PATCH 24/32] Add support for multisig payload variant (pulled from #14) --- src/bcs/types.h | 1 + src/transaction/deserialize.c | 6 +++++- src/ui/common_display.c | 7 +++++++ 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/bcs/types.h b/src/bcs/types.h index c024892..87aab9c 100644 --- a/src/bcs/types.h +++ b/src/bcs/types.h @@ -126,6 +126,7 @@ typedef enum { TX_RAW = 0, TX_RAW_WITH_DATA = 1, TX_MESSAGE = 2, TX_UNDEFINED = typedef enum { PAYLOAD_SCRIPT = 0, PAYLOAD_ENTRY_FUNCTION = 2, + PAYLOAD_MULTISIG = 3, PAYLOAD_UNDEFINED = 1000 } payload_variant_t; diff --git a/src/transaction/deserialize.c b/src/transaction/deserialize.c index 25aa6c9..9835fe6 100644 --- a/src/transaction/deserialize.c +++ b/src/transaction/deserialize.c @@ -76,7 +76,8 @@ parser_status_e tx_raw_deserialize(buffer_t *buf, transaction_t *tx) { if (!bcs_read_u32_from_uleb128(buf, &payload_variant)) { return PAYLOAD_VARIANT_READ_ERROR; } - if (payload_variant != PAYLOAD_ENTRY_FUNCTION && payload_variant != PAYLOAD_SCRIPT) { + if (payload_variant != PAYLOAD_ENTRY_FUNCTION && payload_variant != PAYLOAD_SCRIPT && + payload_variant != PAYLOAD_MULTISIG) { return PAYLOAD_UNDEFINED_ERROR; } tx->payload_variant = payload_variant; @@ -95,6 +96,9 @@ parser_status_e tx_raw_deserialize(buffer_t *buf, transaction_t *tx) { case PAYLOAD_SCRIPT: // TODO: implement script fields parsing return PARSING_OK; + case PAYLOAD_MULTISIG: + // TODO: implement multisig fields parsing + return PARSING_OK; default: return PAYLOAD_UNDEFINED_ERROR; } diff --git a/src/ui/common_display.c b/src/ui/common_display.c index c29d303..fcc296d 100644 --- a/src/ui/common_display.c +++ b/src/ui/common_display.c @@ -108,6 +108,13 @@ int ui_prepare_transaction() { "%s [payload = SCRIPT]", RAW_TRANSACTION_SALT); break; + case PAYLOAD_MULTISIG: + memset(g_tx_type, 0, sizeof(g_tx_type)); + snprintf(g_tx_type, + sizeof(g_tx_type), + "%s [payload = MULTISIG]", + RAW_TRANSACTION_SALT); + break; default: memset(g_tx_type, 0, sizeof(g_tx_type)); snprintf(g_tx_type, From 6f78868c0b0467ae9550e297007643cc959b52f9 Mon Sep 17 00:00:00 2001 From: vldmkr Date: Tue, 23 Jan 2024 20:25:32 +0200 Subject: [PATCH 25/32] Version bump to 0.6.9. Update changelog. --- CHANGELOG.md | 6 +++++- Makefile | 2 +- .../stax/test_app_mainmenu/00001.png | Bin 12684 -> 12885 bytes .../stax/test_app_mainmenu/00005.png | Bin 12684 -> 12885 bytes tests/test_name_version.py | 2 +- tests/test_version_cmd.py | 2 +- 6 files changed, 8 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 37056dd..e1656c4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,7 +7,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] -## [0.6.6] - 2023-10-06 +## [0.6.9] - 2024-01-23 ### Added @@ -20,6 +20,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Refactor BAGL UI (display, menu, settings). - Implement NBGL UI (display, menu, settings). - Add Aptos icon for Ledger Stax. +- Expand the displayed info: + - Parse `0x1::aptos_account::transfer_coins` function + - Now show "Transaction Type" for all entry_function calls + - Add support for multisig payload variant - Add new tests. ### Fixed diff --git a/Makefile b/Makefile index a2d848a..ee8f490 100644 --- a/Makefile +++ b/Makefile @@ -48,7 +48,7 @@ APPNAME = "Aptos" # Application version APPVERSION_M = 0 APPVERSION_N = 6 -APPVERSION_P = 6 +APPVERSION_P = 9 APPVERSION = "$(APPVERSION_M).$(APPVERSION_N).$(APPVERSION_P)" # Application source files diff --git a/tests/snapshots/stax/test_app_mainmenu/00001.png b/tests/snapshots/stax/test_app_mainmenu/00001.png index 3e7cbfb44c85755d199cb996b81d4995a481488f..33e5cf996cd89ad30ed12ac1fb7c6f64b335f958 100644 GIT binary patch literal 12885 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 literal 12684 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 diff --git a/tests/snapshots/stax/test_app_mainmenu/00005.png b/tests/snapshots/stax/test_app_mainmenu/00005.png index 3e7cbfb44c85755d199cb996b81d4995a481488f..33e5cf996cd89ad30ed12ac1fb7c6f64b335f958 100644 GIT binary patch literal 12885 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 literal 12684 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 diff --git a/tests/test_name_version.py b/tests/test_name_version.py index fef07f5..a7d6d24 100644 --- a/tests/test_name_version.py +++ b/tests/test_name_version.py @@ -12,4 +12,4 @@ def test_get_app_and_version(backend, backend_name): app_name, version = unpack_get_app_and_version_response(response.data) assert app_name == "Aptos" - assert version == "0.6.6" + assert version == "0.6.9" diff --git a/tests/test_version_cmd.py b/tests/test_version_cmd.py index 616709f..535d3d1 100644 --- a/tests/test_version_cmd.py +++ b/tests/test_version_cmd.py @@ -4,7 +4,7 @@ # Taken from the Makefile, to update every time the Makefile version is bumped MAJOR = 0 MINOR = 6 -PATCH = 6 +PATCH = 9 # In this test we check the behavior of the device when asked to provide the app version def test_version(backend): From 22da8de96c5bdbac9212a319d6a137db9d315a95 Mon Sep 17 00:00:00 2001 From: Gabriele Della Casa Venturelli Date: Sat, 10 Feb 2024 14:39:59 -0800 Subject: [PATCH 26/32] Support for non-UTF8 messages --- src/bcs/types.h | 8 +++++- src/transaction/deserialize.c | 18 ++++++------- src/ui/bagl_display.c | 43 ++++++++++++++++++++++++++++++ src/ui/common_display.c | 2 ++ src/ui/display.h | 1 + src/ui/nbgl_display_message.c | 50 +++++++++++++++++++++++++++++++++++ 6 files changed, 112 insertions(+), 10 deletions(-) diff --git a/src/bcs/types.h b/src/bcs/types.h index 87aab9c..9315f3c 100644 --- a/src/bcs/types.h +++ b/src/bcs/types.h @@ -121,7 +121,13 @@ typedef struct { fixed_bytes_t *args; } script_payload_t; -typedef enum { TX_RAW = 0, TX_RAW_WITH_DATA = 1, TX_MESSAGE = 2, TX_UNDEFINED = 1000 } tx_variant_t; +typedef enum { + TX_RAW = 0, + TX_RAW_WITH_DATA = 1, + TX_MESSAGE = 2, + TX_RAW_MESSAGE = 3, + TX_UNDEFINED = 1000 +} tx_variant_t; typedef enum { PAYLOAD_SCRIPT = 0, diff --git a/src/transaction/deserialize.c b/src/transaction/deserialize.c index 9835fe6..dbad298 100644 --- a/src/transaction/deserialize.c +++ b/src/transaction/deserialize.c @@ -25,6 +25,7 @@ parser_status_e transaction_deserialize(buffer_t *buf, transaction_t *tx) { return tx_raw_deserialize(buf, tx); case TX_RAW_WITH_DATA: case TX_MESSAGE: + case TX_RAW_MESSAGE: // To make sure the message is a null-terminated string if (buf->size == MAX_TRANSACTION_LEN && buf->ptr[MAX_TRANSACTION_LEN - 1] != 0) { return WRONG_LENGTH_ERROR; @@ -107,7 +108,6 @@ parser_status_e tx_raw_deserialize(buffer_t *buf, transaction_t *tx) { } parser_status_e tx_variant_deserialize(buffer_t *buf, transaction_t *tx) { - parser_status_e status = TX_VARIANT_UNDEFINED_ERROR; if (buf->offset != 0) { return TX_VARIANT_READ_ERROR; } @@ -126,17 +126,17 @@ parser_status_e tx_variant_deserialize(buffer_t *buf, transaction_t *tx) { tx->tx_variant = TX_RAW; return PARSING_OK; } - } else { - status = HASHED_PREFIX_READ_ERROR; } - if (transaction_utils_check_encoding(buf->ptr, buf->size)) { - buf->offset = 0; - tx->tx_variant = TX_MESSAGE; - return PARSING_OK; - } + // Not a transaction prefix, so we reset the offer to consider the full message + buf->offset = 0; + + // Try to display the message as UTF8 if possible + tx->tx_variant = transaction_utils_check_encoding(buf->ptr, buf->size) + ? TX_MESSAGE + : TX_RAW_MESSAGE; - return status; + return PARSING_OK; } parser_status_e entry_function_payload_deserialize(buffer_t *buf, transaction_t *tx) { diff --git a/src/ui/bagl_display.c b/src/ui/bagl_display.c index 2072a24..7196060 100644 --- a/src/ui/bagl_display.c +++ b/src/ui/bagl_display.c @@ -24,6 +24,7 @@ #include "ux.h" #include "glyphs.h" #include "io.h" +#include "format.h" #include "bagl_display.h" #include "display.h" @@ -207,6 +208,13 @@ UX_STEP_NOCB(ux_display_short_msg_step, .title = "Message", .text = g_struct, }); +// Step with title/text for message in raw form +UX_STEP_NOCB(ux_display_raw_msg_step, + bnnn_paging, + { + .title = "Raw message", + .text = g_struct, + }); // Step with title/text for transaction type UX_STEP_NOCB(ux_display_tx_type_step, bnnn_paging, @@ -289,6 +297,18 @@ UX_FLOW(ux_display_short_message_flow, SEQUENCE_SHORT_MESSAGE); // preceding screen : warning icon + "Blind Signing" UX_FLOW(ux_display_blind_short_message_flow, &ux_display_blind_warn_step, SEQUENCE_SHORT_MESSAGE); +// FLOW to display message information in raw form: +// #1 screen : eye icon + "Review Message" +// #2 screen : display raw message +// #3 screen : approve button +// #4 screen : reject button +#define SEQUENCE_RAW_MESSAGE \ + &ux_display_review_msg_step, &ux_display_raw_msg_step, &ux_display_approve_step, \ + &ux_display_reject_step +UX_FLOW(ux_display_raw_message_flow, SEQUENCE_RAW_MESSAGE); +// preceding screen : warning icon + "Blind Signing" +UX_FLOW(ux_display_blind_raw_message_flow, &ux_display_blind_warn_step, SEQUENCE_RAW_MESSAGE); + // FLOW to display entry_function transaction information: // #1 screen : warning icon + "Blind Signing" // #2 screen : eye icon + "Review Transaction" @@ -390,6 +410,29 @@ int ui_display_message() { return 0; } +int ui_display_raw_message() { + memset(g_struct, 0, sizeof(g_struct)); + const bool short_enough = sizeof(g_struct) >= 2 * G_context.tx_info.raw_tx_len + 1; + if (short_enough) { + format_hex(G_context.tx_info.raw_tx, G_context.tx_info.raw_tx_len, + g_struct, sizeof(g_struct)); + } else { + const size_t cropped_bytes_len = (sizeof(g_struct) - sizeof(DOTS)) / 2; + format_hex(G_context.tx_info.raw_tx, cropped_bytes_len, + g_struct, sizeof(g_struct)); + strcpy(g_struct + cropped_bytes_len * 2, DOTS); + } + PRINTF("Message: %s\n", g_struct); + + if (short_enough) { + ui_flow_display(ux_display_raw_message_flow); + } else { + ui_flow_verified_display(ux_display_blind_raw_message_flow); + } + + return 0; +} + int ui_display_entry_function() { const int ret = ui_prepare_entry_function(); if (ret == UI_PREPARED) { diff --git a/src/ui/common_display.c b/src/ui/common_display.c index fcc296d..eeb4487 100644 --- a/src/ui/common_display.c +++ b/src/ui/common_display.c @@ -87,6 +87,8 @@ int ui_prepare_transaction() { if (transaction->tx_variant == TX_MESSAGE) { return ui_display_message(); + } else if (transaction->tx_variant == TX_RAW_MESSAGE) { + return ui_display_raw_message(); } else if (transaction->tx_variant != TX_UNDEFINED) { uint64_t gas_fee_value = transaction->gas_unit_price * transaction->max_gas_amount; memset(g_gas_fee, 0, sizeof(g_gas_fee)); diff --git a/src/ui/display.h b/src/ui/display.h index 9caca4e..05e4759 100644 --- a/src/ui/display.h +++ b/src/ui/display.h @@ -29,6 +29,7 @@ int ui_display_transaction(void); int ui_prepare_transaction(void); int ui_display_message(void); +int ui_display_raw_message(void); int ui_display_entry_function(void); int ui_prepare_entry_function(void); diff --git a/src/ui/nbgl_display_message.c b/src/ui/nbgl_display_message.c index 19607c8..a7bb416 100755 --- a/src/ui/nbgl_display_message.c +++ b/src/ui/nbgl_display_message.c @@ -21,6 +21,7 @@ #include // memset #include "os.h" +#include "format.h" #include "glyphs.h" #include "nbgl_use_case.h" @@ -32,6 +33,8 @@ #include "action/validate.h" #include "../common/user_format.h" +#define DOTS "[...]" + static void confirm_message_rejection(void) { validate_transaction(false); nbgl_useCaseStatus("Message rejected", false, ui_menu_main); @@ -69,6 +72,21 @@ static void review_message_continue(void) { nbgl_useCaseStaticReview(&pairList, &infoLongPress, "Reject message", review_choice); } +static void review_raw_message_continue(void) { + pairs[0].item = "Raw message"; + pairs[0].value = g_struct; + + pairList.nbMaxLinesForValue = 0; + pairList.nbPairs = 1; + pairList.pairs = pairs; + + infoLongPress.icon = &C_Message_64px; + infoLongPress.text = "Sign message"; + infoLongPress.longPressText = "Hold to sign"; + + nbgl_useCaseStaticReview(&pairList, &infoLongPress, "Reject message", review_choice); +} + int ui_display_message() { if (is_str_interrupted((const char *) G_context.tx_info.raw_tx, G_context.tx_info.raw_tx_len)) { nbgl_useCaseReviewVerify(&C_Message_64px, @@ -89,4 +107,36 @@ int ui_display_message() { return 0; } +int ui_display_raw_message() { + memset(g_struct, 0, sizeof(g_struct)); + const bool short_enough = sizeof(g_struct) >= 2 * G_context.tx_info.raw_tx_len + 1; + if (short_enough) { + format_hex(G_context.tx_info.raw_tx, G_context.tx_info.raw_tx_len, + g_struct, sizeof(g_struct)); + } else { + const size_t cropped_bytes_len = (sizeof(g_struct) - sizeof(DOTS)) / 2; + format_hex(G_context.tx_info.raw_tx, cropped_bytes_len, + g_struct, sizeof(g_struct)); + strcpy(g_struct + cropped_bytes_len * 2, DOTS); + } + + if (!short_enough) { + nbgl_useCaseReviewVerify(&C_Message_64px, + "Review message", + NULL, + "Reject message", + review_raw_message_continue, + ask_message_rejection_confirmation); + } else { + nbgl_useCaseReviewStart(&C_Message_64px, + "Review message", + NULL, + "Reject message", + review_raw_message_continue, + ask_message_rejection_confirmation); + } + + return 0; +} + #endif From 0bc69d9839c360d6b7402a142071c89ad25c5fc4 Mon Sep 17 00:00:00 2001 From: Gabriele Della Casa Venturelli Date: Sat, 10 Feb 2024 14:40:58 -0800 Subject: [PATCH 27/32] Non-UTF8 messages testing --- .../test_sign_long_raw_msg/part0/00000.png | Bin 0 -> 428 bytes .../test_sign_long_raw_msg/part0/00001.png | Bin 0 -> 426 bytes .../test_sign_long_raw_msg/part0/00002.png | Bin 0 -> 398 bytes .../test_sign_long_raw_msg/part1/00000.png | Bin 0 -> 396 bytes .../test_sign_long_raw_msg/part1/00001.png | Bin 0 -> 505 bytes .../test_sign_long_raw_msg/part1/00002.png | Bin 0 -> 520 bytes .../test_sign_long_raw_msg/part1/00003.png | Bin 0 -> 519 bytes .../test_sign_long_raw_msg/part1/00004.png | Bin 0 -> 515 bytes .../test_sign_long_raw_msg/part1/00005.png | Bin 0 -> 515 bytes .../test_sign_long_raw_msg/part1/00006.png | Bin 0 -> 491 bytes .../test_sign_long_raw_msg/part1/00007.png | Bin 0 -> 384 bytes .../test_sign_long_raw_msg/part1/00008.png | Bin 0 -> 341 bytes .../test_sign_long_raw_msg/part1/00009.png | Bin 0 -> 408 bytes .../nanos/test_sign_short_raw_msg/00000.png | Bin 0 -> 388 bytes .../nanos/test_sign_short_raw_msg/00001.png | Bin 0 -> 400 bytes .../nanos/test_sign_short_raw_msg/00002.png | Bin 0 -> 341 bytes .../nanos/test_sign_short_raw_msg/00003.png | Bin 0 -> 408 bytes .../test_sign_long_raw_msg/part0/00000.png | Bin 0 -> 580 bytes .../test_sign_long_raw_msg/part0/00001.png | Bin 0 -> 457 bytes .../test_sign_long_raw_msg/part1/00000.png | Bin 0 -> 431 bytes .../test_sign_long_raw_msg/part1/00001.png | Bin 0 -> 956 bytes .../test_sign_long_raw_msg/part1/00002.png | Bin 0 -> 926 bytes .../test_sign_long_raw_msg/part1/00003.png | Bin 0 -> 469 bytes .../test_sign_long_raw_msg/part1/00004.png | Bin 0 -> 364 bytes .../test_sign_long_raw_msg/part1/00005.png | Bin 0 -> 471 bytes .../nanosp/test_sign_short_raw_msg/00000.png | Bin 0 -> 420 bytes .../nanosp/test_sign_short_raw_msg/00001.png | Bin 0 -> 467 bytes .../nanosp/test_sign_short_raw_msg/00002.png | Bin 0 -> 364 bytes .../nanosp/test_sign_short_raw_msg/00003.png | Bin 0 -> 471 bytes .../test_sign_long_raw_msg/part0/00000.png | Bin 0 -> 580 bytes .../test_sign_long_raw_msg/part0/00001.png | Bin 0 -> 457 bytes .../test_sign_long_raw_msg/part1/00000.png | Bin 0 -> 431 bytes .../test_sign_long_raw_msg/part1/00001.png | Bin 0 -> 956 bytes .../test_sign_long_raw_msg/part1/00002.png | Bin 0 -> 926 bytes .../test_sign_long_raw_msg/part1/00003.png | Bin 0 -> 469 bytes .../test_sign_long_raw_msg/part1/00004.png | Bin 0 -> 364 bytes .../test_sign_long_raw_msg/part1/00005.png | Bin 0 -> 471 bytes .../nanox/test_sign_short_raw_msg/00000.png | Bin 0 -> 420 bytes .../nanox/test_sign_short_raw_msg/00001.png | Bin 0 -> 467 bytes .../nanox/test_sign_short_raw_msg/00002.png | Bin 0 -> 364 bytes .../nanox/test_sign_short_raw_msg/00003.png | Bin 0 -> 471 bytes .../test_sign_long_raw_msg/part0/00000.png | Bin 0 -> 11897 bytes .../test_sign_long_raw_msg/part0/00001.png | Bin 0 -> 5208 bytes .../test_sign_long_raw_msg/part1/00000.png | Bin 0 -> 14377 bytes .../test_sign_long_raw_msg/part1/00001.png | Bin 0 -> 7712 bytes .../test_sign_long_raw_msg/part1/00002.png | Bin 0 -> 21556 bytes .../test_sign_long_raw_msg/part1/00003.png | Bin 0 -> 8440 bytes .../test_sign_long_raw_msg/part1/00004.png | Bin 0 -> 5084 bytes .../test_sign_long_raw_msg/part1/00005.png | Bin 0 -> 10733 bytes .../stax/test_sign_short_raw_msg/00000.png | Bin 0 -> 7712 bytes .../stax/test_sign_short_raw_msg/00001.png | Bin 0 -> 8186 bytes .../stax/test_sign_short_raw_msg/00002.png | Bin 0 -> 8440 bytes .../stax/test_sign_short_raw_msg/00003.png | Bin 0 -> 5084 bytes .../stax/test_sign_short_raw_msg/00004.png | Bin 0 -> 10733 bytes tests/test_sign_cmd.py | 87 ++++++++++++++++++ 55 files changed, 87 insertions(+) create mode 100644 tests/snapshots/nanos/test_sign_long_raw_msg/part0/00000.png create mode 100644 tests/snapshots/nanos/test_sign_long_raw_msg/part0/00001.png create mode 100644 tests/snapshots/nanos/test_sign_long_raw_msg/part0/00002.png create mode 100644 tests/snapshots/nanos/test_sign_long_raw_msg/part1/00000.png create mode 100644 tests/snapshots/nanos/test_sign_long_raw_msg/part1/00001.png create mode 100644 tests/snapshots/nanos/test_sign_long_raw_msg/part1/00002.png create mode 100644 tests/snapshots/nanos/test_sign_long_raw_msg/part1/00003.png create mode 100644 tests/snapshots/nanos/test_sign_long_raw_msg/part1/00004.png create mode 100644 tests/snapshots/nanos/test_sign_long_raw_msg/part1/00005.png create mode 100644 tests/snapshots/nanos/test_sign_long_raw_msg/part1/00006.png create mode 100644 tests/snapshots/nanos/test_sign_long_raw_msg/part1/00007.png create mode 100644 tests/snapshots/nanos/test_sign_long_raw_msg/part1/00008.png create mode 100644 tests/snapshots/nanos/test_sign_long_raw_msg/part1/00009.png create mode 100644 tests/snapshots/nanos/test_sign_short_raw_msg/00000.png create mode 100644 tests/snapshots/nanos/test_sign_short_raw_msg/00001.png create mode 100644 tests/snapshots/nanos/test_sign_short_raw_msg/00002.png create mode 100644 tests/snapshots/nanos/test_sign_short_raw_msg/00003.png create mode 100644 tests/snapshots/nanosp/test_sign_long_raw_msg/part0/00000.png create mode 100644 tests/snapshots/nanosp/test_sign_long_raw_msg/part0/00001.png create mode 100644 tests/snapshots/nanosp/test_sign_long_raw_msg/part1/00000.png create mode 100644 tests/snapshots/nanosp/test_sign_long_raw_msg/part1/00001.png create mode 100644 tests/snapshots/nanosp/test_sign_long_raw_msg/part1/00002.png create mode 100644 tests/snapshots/nanosp/test_sign_long_raw_msg/part1/00003.png create mode 100644 tests/snapshots/nanosp/test_sign_long_raw_msg/part1/00004.png create mode 100644 tests/snapshots/nanosp/test_sign_long_raw_msg/part1/00005.png create mode 100644 tests/snapshots/nanosp/test_sign_short_raw_msg/00000.png create mode 100644 tests/snapshots/nanosp/test_sign_short_raw_msg/00001.png create mode 100644 tests/snapshots/nanosp/test_sign_short_raw_msg/00002.png create mode 100644 tests/snapshots/nanosp/test_sign_short_raw_msg/00003.png create mode 100644 tests/snapshots/nanox/test_sign_long_raw_msg/part0/00000.png create mode 100644 tests/snapshots/nanox/test_sign_long_raw_msg/part0/00001.png create mode 100644 tests/snapshots/nanox/test_sign_long_raw_msg/part1/00000.png create mode 100644 tests/snapshots/nanox/test_sign_long_raw_msg/part1/00001.png create mode 100644 tests/snapshots/nanox/test_sign_long_raw_msg/part1/00002.png create mode 100644 tests/snapshots/nanox/test_sign_long_raw_msg/part1/00003.png create mode 100644 tests/snapshots/nanox/test_sign_long_raw_msg/part1/00004.png create mode 100644 tests/snapshots/nanox/test_sign_long_raw_msg/part1/00005.png create mode 100644 tests/snapshots/nanox/test_sign_short_raw_msg/00000.png create mode 100644 tests/snapshots/nanox/test_sign_short_raw_msg/00001.png create mode 100644 tests/snapshots/nanox/test_sign_short_raw_msg/00002.png create mode 100644 tests/snapshots/nanox/test_sign_short_raw_msg/00003.png create mode 100644 tests/snapshots/stax/test_sign_long_raw_msg/part0/00000.png create mode 100644 tests/snapshots/stax/test_sign_long_raw_msg/part0/00001.png create mode 100644 tests/snapshots/stax/test_sign_long_raw_msg/part1/00000.png create mode 100644 tests/snapshots/stax/test_sign_long_raw_msg/part1/00001.png create mode 100644 tests/snapshots/stax/test_sign_long_raw_msg/part1/00002.png create mode 100644 tests/snapshots/stax/test_sign_long_raw_msg/part1/00003.png create mode 100644 tests/snapshots/stax/test_sign_long_raw_msg/part1/00004.png create mode 100644 tests/snapshots/stax/test_sign_long_raw_msg/part1/00005.png create mode 100644 tests/snapshots/stax/test_sign_short_raw_msg/00000.png create mode 100644 tests/snapshots/stax/test_sign_short_raw_msg/00001.png create mode 100644 tests/snapshots/stax/test_sign_short_raw_msg/00002.png create mode 100644 tests/snapshots/stax/test_sign_short_raw_msg/00003.png create mode 100644 tests/snapshots/stax/test_sign_short_raw_msg/00004.png diff --git a/tests/snapshots/nanos/test_sign_long_raw_msg/part0/00000.png b/tests/snapshots/nanos/test_sign_long_raw_msg/part0/00000.png new file mode 100644 index 0000000000000000000000000000000000000000..c2420afe1d5b2ea19c999ee43f90c67f120d4f5b GIT binary patch literal 428 zcmV;d0aN~oP)CI>TUk!C8`c(mGx8WRa z!xd`|I)kHai-|mfH_EU=@WQ<8?vt;iutXgsJ7fsT#RT=*@-kDbFv|(3aIfXRyfj@+?msfv|9!ih8`J$fW)Vn zz~CO>;T|BN_mLd%e%vjPJ%D;eMaiRY#At6&Lsw*_J&nWB{N+Jii(`R~LM#+7vH7^1 zF{YKPgOW#*A8m0f)G#fTs8dpVu7-&qzkS-3oiTU-^*<9k78P5Y>WHD!W4f~aS-%if z=ZR@VlnSwV`CZM!$c^HXr@$^f3+e?K9T@e1AEk+s4NtSE;t^;oLOod9f%9u_+g!V> zg-|*Hr>)vEHnNj9aru-OX(LJU#UxzW#2tv5bk|2oN7xMoGovT4Cs$JRS3(FO58w+7 Wi7X{&VtL~L0000c)VqKK#{wdKnWi$6d?v9bX;j^j9QWi!)!9>|JaO=b{v36CU) z0cr0w@kQVOjFX95nBEb_$oN_*Ccq0bTBPKfjar;K&g1{NT5vD_onP!lIg;KfnC^hl zix+41G|S&3?|-Zf7zXd(dw3rn8-PW;55_4-c#x7Wj=5pvDNW`dEbvAlv3ns?pxO9o zPhC*7wD)0!0C2ii_x?fM)KmrR6WVTjCP*1@|wl~-{6W52;vK)0%=LIq3q5GQ4xzqJOvqJ_rIVAFyd5q9LJf+4};Sn UVzi>sz5oCK07*qoM6N<$f|h^9Q~&?~ literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanos/test_sign_long_raw_msg/part0/00002.png b/tests/snapshots/nanos/test_sign_long_raw_msg/part0/00002.png new file mode 100644 index 0000000000000000000000000000000000000000..2d1b9409c6522828731aab12cfaa18aa574835da GIT binary patch literal 398 zcmV;90df9`P)RF|2j{?)lOikugDmzd53ViMBoUAZ0002!$+3qIz4I&b>fHdMW2f!& z1h0b(&;d%0{kNTm{8DfqsBo4AO-$R(ACw}K&^rTM{ULg66?*q>z?5OT5X#D3 zgT-sK1>rGwQRK>bDPms_GiviM=;K$~jo8>iu7ZE4roejmD{9aEJRlCfEXq@VIeX=2UOS4^go=mtjW9`lm8lGU*`Ko sh^YTB$;Y$hZ&{Dntm1wV008L97k%0p$W|+otpET307*qoM6N<$f)F>k>Hq)$ literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanos/test_sign_long_raw_msg/part1/00000.png b/tests/snapshots/nanos/test_sign_long_raw_msg/part1/00000.png new file mode 100644 index 0000000000000000000000000000000000000000..f06b65ffbaebdf97e40c066e262aadcd39755f53 GIT binary patch literal 396 zcmV;70dxL|P)t*Pb8Q?ykqHG`A` z_ZknGyeto}KRM4}dsXd5m_*g3h^IwQk}RVs_Gm{9O;W8CO|c=Gyx)GRMmQ+OZxbm qkSD$~1a(B~{{=k_@+w82?Mgy9ySuWWgX%;2> zvDQxjYe%e2NlRH8($fQ%(gzqNQCTtoImi4GTL;zw`)pim_%z z$EbL}gzu59QY|jm%kU*UtlUnGw74K?7VAASn}R_|!wazcFR2RF-?dcj>EV?sZWgH) zk!o4G&*_y_iLM1999wgCaod4p5WsEvB;FX1XLnXGYH<`(&pBtKKjj^1sO}sjZ*ECC vuSr9D$=U2v`rnkzQ|aPGQ4~c{6a~N=J;rvul^CgI00000NkvXXu0mjfuVdY! literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanos/test_sign_long_raw_msg/part1/00002.png b/tests/snapshots/nanos/test_sign_long_raw_msg/part1/00002.png new file mode 100644 index 0000000000000000000000000000000000000000..03ca92b07d81d2d83bebf178c29947c6c18f3127 GIT binary patch literal 520 zcmV+j0{8uiP)qa`X6CqUV%vA{JWXK2(0yO?xvgP2$V%K;C844XJT?gP0EN4f3C zGL`y_2d&3zwgVCpz^`?t0yhy4MRYSp^?R<2Wlefa=7GDnfl-l?+Jrq+G5!_G=MySPk|arzWQ1>HXOz6LoIyJP0000< KMNUMnLSTYkL+q3Q literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanos/test_sign_long_raw_msg/part1/00003.png b/tests/snapshots/nanos/test_sign_long_raw_msg/part1/00003.png new file mode 100644 index 0000000000000000000000000000000000000000..ba6782fa84bfb796fb2860ef89c38cb6c3758977 GIT binary patch literal 519 zcmV+i0{H!jP)}OKXpJ5q^DQJcwVkP9e2fsoEw3Sl^T$*&a#i`!M7e z_}iVz(vZHsYN~zf53p#WV&ViSuDTZNo{=*&s)J=13GU}a`H2m%9PlL|W|QT>)j=JO zc014fQZCw$$Ls{8Bw*jxm0IXTSc>RsM2+=JlW;j93SnB-A6Xs97&g_HR~Nyr=v%nV zx2{xEmhn94Hs70j9`tq8qk0i&q4HwBUvX5ESW|uwj3#lEy9sg+K8f2!p-^~TWMD%v z50hIATfpH>2YaMXu*9mu@UWdkP%23kE9{h!WkHHi(F~V43ft!(TM7^?Y;H9645`$e zd5GQWDk%|Pfa#m?5ZL{97rvLMm|ZtvCA{cTc9A#G#ZuU0J6od3XTAW#2H-ie+|DQS zxkRY7ZzmzKcx)$fqB#Rio`_6l{<34kt!DhR+DiOBxk`#JAx1=dSdJC zMDI^|rCf7VW~|1>YLYGKEP^dgEklbCbAmWZB9TZW5{X14JOK$Cj;F(i(DDEP002ov JPDHLkV1kwr>c0R0 literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanos/test_sign_long_raw_msg/part1/00004.png b/tests/snapshots/nanos/test_sign_long_raw_msg/part1/00004.png new file mode 100644 index 0000000000000000000000000000000000000000..88c45cd2c4543b2117cffadcecfda67825fe1d48 GIT binary patch literal 515 zcmV+e0{s1nP)G@VdQ_XV5!eI7 zifI44O)&{eyH``A#jrg#vmOAJsxRuC2_G7@VcJxo+Jo5%U>w{9(cz*ZC&Z^}Lr&N2 zbO%xRt2OQ(^YK`!jkn19BoL>TCQC;dH_-)E>+DQ?)^qQIGmW zERpU4@>yX!9{RJ4o{)=uXR0@49y0q(cMITdd8f5s*z?h@7_*gq-$2a4fAU?s&~E%4 z@HG;G# zoKV`0Basq~wU@AkS-pxd=vjvbF5mQ2VMcp zFXaEBDo?^{Jw?^J{Qp^PIW2+gSOLIQb5Z9^?#oj)48^3vV|Mu+6X03kDX?y{Lre)Y(N%Qg8tAK?BYH1&-L?@D=2sY!adwuF5+z!}<P0|X<;8rzqXv}kMX}^O#@&RPgLiVfUFcM72U)y^ zs<%q;bVD;$G3&~z%7m3O8KB3bIWPjW6qpeVbLe&4^CAeI67efzOnFw3QyA;sx<;3@6NsncbxCN!|kO9&a*PjvEwl;JszylcaFnAwVI}xEYQY_8Z2;`6H94MR2Xl>t zR;nG%j=k3Hr)^Kz7s!!~&gyZFfb1IRPEiy^Q4~ed+AoYC!PmXPJB0uM002ovPDHLk FV1gVg^A-RA literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanos/test_sign_long_raw_msg/part1/00006.png b/tests/snapshots/nanos/test_sign_long_raw_msg/part1/00006.png new file mode 100644 index 0000000000000000000000000000000000000000..6dc8ceb1b3dd31d5da9ef5cd898d6703ca15ec41 GIT binary patch literal 491 zcmV$Zvuv4;9Z*Sl`CWc|_f~_W4hEk=>8kDtWd4x4Bsn0{- z0c>5!?^9KlLhJ2ARPEdA(|VWD5|xe}pe)s~z&VrWvdacbGqzXeobnwLVAA)JOFeV5ufT!AG8oX~;2GAGgD5*Y~B+-*RErmUTUXfURsc9vJ0!gQe z&`lUlV>o_YKk%Jtq5mfA+C=ceIaRQT_l%n5?VT3>ay9`yZaJJKot<8_8(?YEH`(e0 z$bn#|;hHz+HLYsk^Z`d&u_PB;!HkQ0$G+;H^7=7n4@331HYV5#1a-qK8eka8)P}>* hBuSDaNs@$!h@OW=c8#s^{r?}_hxVbJ^8nG5lI(qMwG0000_<<&TDTa!6HCaSn#TYt;R zEpYF^@5X@_k!q02cZaVN@HKx=p zZsd=pcLH)G5bs7y83qwQis)*1&Gn{5IGm7$cv;pjMIA^VvD61OM2ewf7F#o&DZ}wP z*}VML+OyExUbpHbXsL3t*pF=M|KkKf6FYtq2Rz|AZ>cE~CWYjR z5I^)Mj5nc(wFSGMgh3y0z+m8j!N387fdi(*)e*C%MU=%e5+0RKVcap)`hCEC;cv~v e4gdfEfE8bY;A2-u*(ogm0000_wxG+Yry2qARt#sf<#$}=)VJ~ zBlvESR-Jq3=$jydfC?r!$iuAw9oGJ!U-M%YMJ+y&Ch%TCM^JUq5BGkf8O_{y`#mQ} nq4{V^xv44i3V1v$0C_ea3_go|-rj`700000NkvXXu0mjfd&QW1 literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanos/test_sign_long_raw_msg/part1/00009.png b/tests/snapshots/nanos/test_sign_long_raw_msg/part1/00009.png new file mode 100644 index 0000000000000000000000000000000000000000..02d922befda7ad5494398ded74de6ab739697b06 GIT binary patch literal 408 zcmV;J0cZY+P)tP{{Ii&hxNhEIZ=euB@oYbT~S*K@+uU9<2a7vtmHgakKmt)-tWf1Xpr8k z2T&vT^|oJ@_?%nP+p5JO0W+Zbn)L-eycYldd3+b_womY&!WamUpjlo^(xgg)h64cI z$DKbE@eyJs>50KMbammfBqPN6Lr+Bu+=K(zW6f^D^ksM+w?|?B%^1|tnHtyot!oEk zU^oB)nH_7|RqwY>id<|5AlxRnT_%=vLiLAs-CF!G6^C;(09o(j+kkB*s1Wo%vL!e< zch7)hC{c^>lVV}V@AI5e2`mU^4k_u3Sp5+)43v3=SY98|gPc}GtBk_yuWlm3!dPHh z3{jM0+(p;zWfB{oc+*sH$8@+CG;uXi)~30wUO+cALhNP2PoWm6V)g$41ylYNXx&z% z`isc`N-r}H4|4WZn+>Ls8Wmv@&HnKs<1FD8!#&=}Xx$G!PoP zUqaXGeRw#IxPU|Sv6_gDO@(!!O><2D6soNNu}A>o{O-dA)lg0D+@hwFj#8uU=j;?z zkO%M#c2w0W!Xzp#MLaEfkXt0WVvBaw)CAQ^(G?BR1{ygWBMf3)`4hfRXiK?nTQ36Ogyjgi{)5vI|T7cXWVs4$fA8Zuby^A4|!srA!s04 i|1aoikS78FfX)u7xAbN92cC!k0000DWAZrFMMNR9e-$T!UqR9gP?wT4ATHX(vGQ~dwl&R|EsMe4i z+S>>JWz#Yhn}S+ySs!H(LJ+oPekR uloOuv_wxG+Yry2qARt#sf<#$}=)VJ~ zBlvESR-Jq3=$jydfC?r!$iuAw9oGJ!U-M%YMJ+y&Ch%TCM^JUq5BGkf8O_{y`#mQ} nq4{V^xv44i3V1v$0C_ea3_go|-rj`700000NkvXXu0mjfd&QW1 literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanos/test_sign_short_raw_msg/00003.png b/tests/snapshots/nanos/test_sign_short_raw_msg/00003.png new file mode 100644 index 0000000000000000000000000000000000000000..02d922befda7ad5494398ded74de6ab739697b06 GIT binary patch literal 408 zcmV;J0cZY+P)tP{{Ii&hxNhEIZ=euB@oYbT~S*K@+uU9<2a7vtmHgakKmt)-tWf1Xpr8k z2T&vT^|oJ@_?%nP+p5JO0W+Zbn)L-eycYldd3+b_womY&!WamUpjlo^(xgg)h64cI z$DKbE@eyJs>50KMbammfBqPN6Lr+Bu+=K(zW6f^D^ksM+w?|?B%^1|tnHtyot!oEk zU^oB)nH_7|RqwY>id<|5AlxRnT_%=vLiLAs-CF!G6^C;(09o(j+kkB*s1Wo%vL!e< zch7)hC{c^>lVV}V@AI5e2`mU^4k_u3Sp5+)43v3=SY98|gPc}GtBk_yuWlm3!dPHh z3{jM0+(p;zWfB{oc+*sH$8@+CG;uXi)~30wUO+cALhNP2PoWm6V)g$41ylYNXx&z% z`isc`N-r}H4|4WZn+>Ls8Wmv@`z`V0000000000001B&=bUps z9fgVS(*b-sffG>Ye)J-U$}WFjXL?HM zvPfKrT>&Yja8JA=SOS&{eYlS(HdTdDsp^TZB9jEMy%UkVgGfiU{3oj_WabHFPtxM`q$vP_nRG9A-D%l z^WDZx{_eQ^(IL>*QV4b+^E~c#COrG3xLyPR0DvbJ8*6E1@b{8mq>4dfpiH0Z zAG*eh7)`|5L|T&LMe^l@{N!O`;JsL3{H?*+wzh_)&~v@$vrA|qGW~fG7uoiT+<9FF zDGykVsRE3B?6)jwr?8~3j3_)iO#*~tkY_A*Sp~C$9V1;{b-pRA2tB0dy6c;6SAcxC zkvNNttcwFIG%4G;EI&(_y^O&B_;*~4+X9xL!`#aa4Fo(_0000000000K*KLZfh4pN SdPXk*0000P@)+k+@4A&=7?{fRSKF|MxIuN$a_GV1=zB000000000m!F%t$-<`#P z_wEE%vQ_%vISq)_ch2q2WQef_)Mgl?)faOO2(lj7t-hFRKrC@Ay6NhR$ZK~3Gs;=W zX!XV12ne!r+pWHB=HBuH005whH+GjgDX+rn*S38WrrN2Rxx$weQc4qhKm+7A`FA{J zcR}y}#Bb9}hsS$4=MIw5lV8*`0vcD#uSy(@0I9WQpExMBCH7C*Wb;X{g_o*lE_zbk z16Acc(K++<%=nrc`8j{c4%wa37@Fw>W#;Ar006+H{I7U2JLrki2tFEZ?(rtA+Q=-Q z@|g1NT!_WBRa(t-F*Q`>!)Q`$C8ht|*!byXkp4^*Dd!&<+|ewL)5zJGx%mB8uW+%Ln&!O$V!?brmm+X(S$vUI< zoB94AolJf{;7Lq=LZ+>@s<=N0000000LXm-^5SD-<|qUF00000NkvXXu0mjfQGncL literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanosp/test_sign_long_raw_msg/part1/00000.png b/tests/snapshots/nanosp/test_sign_long_raw_msg/part1/00000.png new file mode 100644 index 0000000000000000000000000000000000000000..6644903b5bb3d33e0835de0ae523097ff5dba586 GIT binary patch literal 431 zcmV;g0Z{&lP);qG3P@ax@yi>g4&#a&e?#qK}*RSBvq0B%OpTygp* z-4#&9S~2u1y-z`jkD)<4;~)kA0DzQ~Pc#w^!s{OWVw`>8m%4PjVOJyELzUWe?8#Sk zZY{{&jt0Oki*6QZrg5mz4LSzh7~N86e>$=qShiBmxs>9bRN4QFp5Bc&bb8b7+Tqcn|DvK~>9Bjl1Otmg6Sg)^)j+Z)^+z0D$*ubDyGLvARa}i&>8$ za1g5wR+H84mC>VKt;$e#tKCAk+FqZ3Di=yCz+S0xrCW6}rV&CPg`JP{lXSEWx`k2Z zE&|mzVViVot8L@3dwujRsLgKfSJPn2vTewi{-4QrY)7hF&|?Vyf54>nWB>pF0002o Z`~l`#Y3Hh$(Z3`?F97L(|k`Y0tpdg+~u}`@jiY0a_9?IwKxL#~Qg9H@D)R=)#Ar1eMIH51|x+bFU$kz^VA9)$#7 z#r^B@pM=F{#dJ?31!<$i?D6ESfH>)&02(QKwVJL=k0PQ1zj(Q7jeE7onEy=cTGDU& zVr`aQ$hagzW32F1Xd9wQL64HW2RtV_D}bw@FL|~zm!VyH6HQ&=?MC^?oz}8BQgq%^ zhEmVP>hn-upo(>>+wBMMv9BMF8sv)pZ3v;R=-*78gI7{n=#@A@u5)lHJiPuJF|gv) z`ZWFNce3INklG3YHkYV#XzWUz(LoE9i{b_GbSGool}^YB9<;S*73-HhTt z316*tg~S}B^F!o0(2Z?c5GZr>_^!&*aVCYj*OX9As36L6yA?*f3O+@XA z^G63}PC#0)6mOn1X}V&s*g1!BW4IIOh0H~lt&xjDd2G?TUBX?Ba{>TbR2o^pN{z+)z@*Mnng-S7Dn7 zeMKNHGYO)1f->P~nY2ShNks%y!~tXo*v)nlltSChKT#4lMS7b&MD<)GqXlhw#6?Ub ztc3h&%G0coaMDls8i9{<2iiwV_NWj%%ZnL*iwPRsVQXsSim9Qihg4Nx3mTI~*Vb6Z zT+uS0oN)MZ@NixGaqeK(I~mG#GVQt>_{K$lq7*7a?F^2Wq4ryjr;GG^Y79*#-?0000v(T5Y zWs;Dlsu0?R7B%P;!V5g6{v%>Z$W60kZ;?V4A3>kNs%^{2nP3ZVV^|lV#?G*%F4{ z8OAN=W~Gx%Sj`nEPPt6WJUowQxB+fWHMn2TeLgMGIWE8F5!b^PQ^Y zfmr^(r4&(|sV_KQm@L%FW|vewNi6R#D4I^6soEjBsSh=Hz{i%@2cUG7oTmRZw_hZ&8~RkRAY$-jv`=`MwdvYSv4b+WmuuDjbA{ ze9NfRD~I&JI5jYxBuSDaNs^>Y|33hv=2oI#hVZluG2HcmBAH;KWY7~!@M_1At^-^h z6bX8`z;LlL!4HYGw-&1)5vXnSM1C8pCVSyrE>IM|a?UDc^rfMw3hd z(mT)!1hHX^1gqGomO0h2%fiqkNs=TjF A+5i9m literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanosp/test_sign_long_raw_msg/part1/00003.png b/tests/snapshots/nanosp/test_sign_long_raw_msg/part1/00003.png new file mode 100644 index 0000000000000000000000000000000000000000..6d07ac672478d3c750496d20b03dc4659d7f5db2 GIT binary patch literal 469 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|^i%>EaktG3V`#=uL+dcp4J> zipviDn|>s&=EaOeg_bR>j(_*7yGR{cx>O3J=|frlT`^5n&Epd3YMUocxnvlT{Ns4I zq1)D87l{d{E;fqnn`d=t*QLD2bJqR0j`Xs;uTvJeZffu3_X}!%uQ+)A8cXi1UD3Cb zuf)~F>@(WOlDo^*_IHr}+vx4vtb$!1?^))jnLkauNAJqpOH!>D-Fz26+sk}q%bR2K z-kp!T?RD7lR`yHJ504T~TwZb8qEh@pMZgM4A1jGhbLaWr*;x5{WzNzic@JgpX|A(x z3ORat!3rBu$G@j4{*@e#JAIs^!rsH8l;gR1?@mkrjtSs=$yO-NJ z=C!|)leS+NA@qEiex99SeCYhS zx{A93-*_r+{n%X`lBjkqL3N&!b|K&TBVRz_iwrK?Fg}~bUQ~NKG#VuA>FVdQ&MBb@ E0QM5wx&QzG literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanosp/test_sign_long_raw_msg/part1/00004.png b/tests/snapshots/nanosp/test_sign_long_raw_msg/part1/00004.png new file mode 100644 index 0000000000000000000000000000000000000000..53ae65195fbea5b281a1bc1a80351dbf1cd79ff8 GIT binary patch literal 364 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|=-%ba4!+nDh2#AYZeBfa}G~ z%X2sUSKTFSd4J{-YHcY(QO5;J{<~e9q=7F?O4)!WO}6UUdH! zS+Hz=(4})vCM2-VD4nt3W%LdvkyzeG%km#`1t_mu*zR}#jNB{EKZnW}g5-=Bym-_% z`=7%C>zxJL|9msNSMXnbQRayy^)nr>EU7olTHqoc^vG(B%bo(Id*|kR{84!`z2x6n zZ`;PkbrPvd6U}A>Y0chs_tyHmLi6kw6c{>JvYiQ=+MTFTx8d*9^V|R0+_75oZt9or zLetinU!`YMvFyLCb8XxElhO0{v2rTkNR$jMW7~4}*8a52+MC^J%KMbxPN-JRb2RNP zEsp0ebAPS3=e2G53#Z$XZAI6Yd=Y#bpS7_dOvl2n-YDN3F!8|Zw}1F7^_|`|7^d-WZmAca`5Sx-r#o;?yf)8 zamTB%jcSo;Cxq7w@YDAG;F6%vdkN~UKMPCH+44GbgZ0O61|;n~NJs3(zH0)OyObgT z0C=#wjq|e8y=uL$7S9x$jZ$lEcdNB^nwK)>H6PNyiQd|Lm0PfUPFtnWXfpPxEGL>bcmBgvGOE8^+M17u26I_+AT#bzzP>rah~%<8qgG%2*J4WoW2uMlMt z9%lVFg?Z36N3j^!4wH0b{3O8WBJ4_G2v2AEUeKM8006+%PQAmq$BV*J0ebACz0uB~0+iy*OAtRT7 z96rVI*8>0m0002o%^$0xJh2#?r-}do N002ovPDHLkV1fi5-8TRL literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanosp/test_sign_short_raw_msg/00000.png b/tests/snapshots/nanosp/test_sign_short_raw_msg/00000.png new file mode 100644 index 0000000000000000000000000000000000000000..76560b8c0f3bd5e50f8a56f6718ab7bb80ca024f GIT binary patch literal 420 zcmV;V0bBlwP)x`j)$#)l2xD5^B9vd+L007`}(Kn1u*nQ(gU3$CFT~(<~$DUkDezhFAAUQ3} zEKr}6Hrvhe=ha$+4lgrCZz=Szj${XZ9Q$FKKXKgpgqT`u@~eeA0k6)fAa3Q_A}8il z^uw7iLF&k@gUxaT;buTjUb6liK3fL^007{*`rK#IpIDufBN=yN2{vMCW3^Z{TSo7C zG?k$=t7gHh_U-E*e(N6KA#5tU`xhD?|wrTh)ltmPTuXJyZlmS>b3O#L0@`b_Abe*_$ z^7>S^x)d(Nq5;;TM)|dC*iki-H!smSDJSX=s%Z+HQ}A#i8iJitv5gVVa>;UH~$p67R+s* zDQq5oqD^?lPEEGkZbRo!F8?C$2`0UcPSx3Pbejiezr11qHgnf{Q@t~|k7H_5J$(R% z%v^K5(J_7S$qVJt12Age@ZZ<2#~j5DKvMtoH^oD3!WWaJdmFmvTzA<>FQ3sTXeOEL zPZOk?>`%rR+=*T2P8&&P3{sI^0000000000000000000W%|C8^YlGBj>%IU0002ov JPDHLkV1m0&*TMh* literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanosp/test_sign_short_raw_msg/00002.png b/tests/snapshots/nanosp/test_sign_short_raw_msg/00002.png new file mode 100644 index 0000000000000000000000000000000000000000..53ae65195fbea5b281a1bc1a80351dbf1cd79ff8 GIT binary patch literal 364 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|=-%ba4!+nDh2#AYZeBfa}G~ z%X2sUSKTFSd4J{-YHcY(QO5;J{<~e9q=7F?O4)!WO}6UUdH! zS+Hz=(4})vCM2-VD4nt3W%LdvkyzeG%km#`1t_mu*zR}#jNB{EKZnW}g5-=Bym-_% z`=7%C>zxJL|9msNSMXnbQRayy^)nr>EU7olTHqoc^vG(B%bo(Id*|kR{84!`z2x6n zZ`;PkbrPvd6U}A>Y0chs_tyHmLi6kw6c{>JvYiQ=+MTFTx8d*9^V|R0+_75oZt9or zLetinU!`YMvFyLCb8XxElhO0{v2rTkNR$jMW7~4}*8a52+MC^J%KMbxPN-JRb2RNP zEsp0ebAPS3=e2G53#Z$XZAI6Yd=Y#bpS7_dOvl2n-YDN3F!8|Zw}1F7^_|`|7^d-WZmAca`5Sx-r#o;?yf)8 zamTB%jcSo;Cxq7w@YDAG;F6%vdkN~UKMPCH+44GbgZ0O61|;n~NJs3(zH0)OyObgT z0C=#wjq|e8y=uL$7S9x$jZ$lEcdNB^nwK)>H6PNyiQd|Lm0PfUPFtnWXfpPxEGL>bcmBgvGOE8^+M17u26I_+AT#bzzP>rah~%<8qgG%2*J4WoW2uMlMt z9%lVFg?Z36N3j^!4wH0b{3O8WBJ4_G2v2AEUeKM8006+%PQAmq$BV*J0ebACz0uB~0+iy*OAtRT7 z96rVI*8>0m0002o%^$0xJh2#?r-}do N002ovPDHLkV1fi5-8TRL literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanox/test_sign_long_raw_msg/part0/00000.png b/tests/snapshots/nanox/test_sign_long_raw_msg/part0/00000.png new file mode 100644 index 0000000000000000000000000000000000000000..2d20155f3589238276c8e24b49401b23d82327ec GIT binary patch literal 580 zcmV-K0=xZ*P)`z`V0000000000001B&=bUps z9fgVS(*b-sffG>Ye)J-U$}WFjXL?HM zvPfKrT>&Yja8JA=SOS&{eYlS(HdTdDsp^TZB9jEMy%UkVgGfiU{3oj_WabHFPtxM`q$vP_nRG9A-D%l z^WDZx{_eQ^(IL>*QV4b+^E~c#COrG3xLyPR0DvbJ8*6E1@b{8mq>4dfpiH0Z zAG*eh7)`|5L|T&LMe^l@{N!O`;JsL3{H?*+wzh_)&~v@$vrA|qGW~fG7uoiT+<9FF zDGykVsRE3B?6)jwr?8~3j3_)iO#*~tkY_A*Sp~C$9V1;{b-pRA2tB0dy6c;6SAcxC zkvNNttcwFIG%4G;EI&(_y^O&B_;*~4+X9xL!`#aa4Fo(_0000000000K*KLZfh4pN SdPXk*0000P@)+k+@4A&=7?{fRSKF|MxIuN$a_GV1=zB000000000m!F%t$-<`#P z_wEE%vQ_%vISq)_ch2q2WQef_)Mgl?)faOO2(lj7t-hFRKrC@Ay6NhR$ZK~3Gs;=W zX!XV12ne!r+pWHB=HBuH005whH+GjgDX+rn*S38WrrN2Rxx$weQc4qhKm+7A`FA{J zcR}y}#Bb9}hsS$4=MIw5lV8*`0vcD#uSy(@0I9WQpExMBCH7C*Wb;X{g_o*lE_zbk z16Acc(K++<%=nrc`8j{c4%wa37@Fw>W#;Ar006+H{I7U2JLrki2tFEZ?(rtA+Q=-Q z@|g1NT!_WBRa(t-F*Q`>!)Q`$C8ht|*!byXkp4^*Dd!&<+|ewL)5zJGx%mB8uW+%Ln&!O$V!?brmm+X(S$vUI< zoB94AolJf{;7Lq=LZ+>@s<=N0000000LXm-^5SD-<|qUF00000NkvXXu0mjfQGncL literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanox/test_sign_long_raw_msg/part1/00000.png b/tests/snapshots/nanox/test_sign_long_raw_msg/part1/00000.png new file mode 100644 index 0000000000000000000000000000000000000000..6644903b5bb3d33e0835de0ae523097ff5dba586 GIT binary patch literal 431 zcmV;g0Z{&lP);qG3P@ax@yi>g4&#a&e?#qK}*RSBvq0B%OpTygp* z-4#&9S~2u1y-z`jkD)<4;~)kA0DzQ~Pc#w^!s{OWVw`>8m%4PjVOJyELzUWe?8#Sk zZY{{&jt0Oki*6QZrg5mz4LSzh7~N86e>$=qShiBmxs>9bRN4QFp5Bc&bb8b7+Tqcn|DvK~>9Bjl1Otmg6Sg)^)j+Z)^+z0D$*ubDyGLvARa}i&>8$ za1g5wR+H84mC>VKt;$e#tKCAk+FqZ3Di=yCz+S0xrCW6}rV&CPg`JP{lXSEWx`k2Z zE&|mzVViVot8L@3dwujRsLgKfSJPn2vTewi{-4QrY)7hF&|?Vyf54>nWB>pF0002o Z`~l`#Y3Hh$(Z3`?F97L(|k`Y0tpdg+~u}`@jiY0a_9?IwKxL#~Qg9H@D)R=)#Ar1eMIH51|x+bFU$kz^VA9)$#7 z#r^B@pM=F{#dJ?31!<$i?D6ESfH>)&02(QKwVJL=k0PQ1zj(Q7jeE7onEy=cTGDU& zVr`aQ$hagzW32F1Xd9wQL64HW2RtV_D}bw@FL|~zm!VyH6HQ&=?MC^?oz}8BQgq%^ zhEmVP>hn-upo(>>+wBMMv9BMF8sv)pZ3v;R=-*78gI7{n=#@A@u5)lHJiPuJF|gv) z`ZWFNce3INklG3YHkYV#XzWUz(LoE9i{b_GbSGool}^YB9<;S*73-HhTt z316*tg~S}B^F!o0(2Z?c5GZr>_^!&*aVCYj*OX9As36L6yA?*f3O+@XA z^G63}PC#0)6mOn1X}V&s*g1!BW4IIOh0H~lt&xjDd2G?TUBX?Ba{>TbR2o^pN{z+)z@*Mnng-S7Dn7 zeMKNHGYO)1f->P~nY2ShNks%y!~tXo*v)nlltSChKT#4lMS7b&MD<)GqXlhw#6?Ub ztc3h&%G0coaMDls8i9{<2iiwV_NWj%%ZnL*iwPRsVQXsSim9Qihg4Nx3mTI~*Vb6Z zT+uS0oN)MZ@NixGaqeK(I~mG#GVQt>_{K$lq7*7a?F^2Wq4ryjr;GG^Y79*#-?0000v(T5Y zWs;Dlsu0?R7B%P;!V5g6{v%>Z$W60kZ;?V4A3>kNs%^{2nP3ZVV^|lV#?G*%F4{ z8OAN=W~Gx%Sj`nEPPt6WJUowQxB+fWHMn2TeLgMGIWE8F5!b^PQ^Y zfmr^(r4&(|sV_KQm@L%FW|vewNi6R#D4I^6soEjBsSh=Hz{i%@2cUG7oTmRZw_hZ&8~RkRAY$-jv`=`MwdvYSv4b+WmuuDjbA{ ze9NfRD~I&JI5jYxBuSDaNs^>Y|33hv=2oI#hVZluG2HcmBAH;KWY7~!@M_1At^-^h z6bX8`z;LlL!4HYGw-&1)5vXnSM1C8pCVSyrE>IM|a?UDc^rfMw3hd z(mT)!1hHX^1gqGomO0h2%fiqkNs=TjF A+5i9m literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanox/test_sign_long_raw_msg/part1/00003.png b/tests/snapshots/nanox/test_sign_long_raw_msg/part1/00003.png new file mode 100644 index 0000000000000000000000000000000000000000..6d07ac672478d3c750496d20b03dc4659d7f5db2 GIT binary patch literal 469 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|^i%>EaktG3V`#=uL+dcp4J> zipviDn|>s&=EaOeg_bR>j(_*7yGR{cx>O3J=|frlT`^5n&Epd3YMUocxnvlT{Ns4I zq1)D87l{d{E;fqnn`d=t*QLD2bJqR0j`Xs;uTvJeZffu3_X}!%uQ+)A8cXi1UD3Cb zuf)~F>@(WOlDo^*_IHr}+vx4vtb$!1?^))jnLkauNAJqpOH!>D-Fz26+sk}q%bR2K z-kp!T?RD7lR`yHJ504T~TwZb8qEh@pMZgM4A1jGhbLaWr*;x5{WzNzic@JgpX|A(x z3ORat!3rBu$G@j4{*@e#JAIs^!rsH8l;gR1?@mkrjtSs=$yO-NJ z=C!|)leS+NA@qEiex99SeCYhS zx{A93-*_r+{n%X`lBjkqL3N&!b|K&TBVRz_iwrK?Fg}~bUQ~NKG#VuA>FVdQ&MBb@ E0QM5wx&QzG literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanox/test_sign_long_raw_msg/part1/00004.png b/tests/snapshots/nanox/test_sign_long_raw_msg/part1/00004.png new file mode 100644 index 0000000000000000000000000000000000000000..53ae65195fbea5b281a1bc1a80351dbf1cd79ff8 GIT binary patch literal 364 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|=-%ba4!+nDh2#AYZeBfa}G~ z%X2sUSKTFSd4J{-YHcY(QO5;J{<~e9q=7F?O4)!WO}6UUdH! zS+Hz=(4})vCM2-VD4nt3W%LdvkyzeG%km#`1t_mu*zR}#jNB{EKZnW}g5-=Bym-_% z`=7%C>zxJL|9msNSMXnbQRayy^)nr>EU7olTHqoc^vG(B%bo(Id*|kR{84!`z2x6n zZ`;PkbrPvd6U}A>Y0chs_tyHmLi6kw6c{>JvYiQ=+MTFTx8d*9^V|R0+_75oZt9or zLetinU!`YMvFyLCb8XxElhO0{v2rTkNR$jMW7~4}*8a52+MC^J%KMbxPN-JRb2RNP zEsp0ebAPS3=e2G53#Z$XZAI6Yd=Y#bpS7_dOvl2n-YDN3F!8|Zw}1F7^_|`|7^d-WZmAca`5Sx-r#o;?yf)8 zamTB%jcSo;Cxq7w@YDAG;F6%vdkN~UKMPCH+44GbgZ0O61|;n~NJs3(zH0)OyObgT z0C=#wjq|e8y=uL$7S9x$jZ$lEcdNB^nwK)>H6PNyiQd|Lm0PfUPFtnWXfpPxEGL>bcmBgvGOE8^+M17u26I_+AT#bzzP>rah~%<8qgG%2*J4WoW2uMlMt z9%lVFg?Z36N3j^!4wH0b{3O8WBJ4_G2v2AEUeKM8006+%PQAmq$BV*J0ebACz0uB~0+iy*OAtRT7 z96rVI*8>0m0002o%^$0xJh2#?r-}do N002ovPDHLkV1fi5-8TRL literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanox/test_sign_short_raw_msg/00000.png b/tests/snapshots/nanox/test_sign_short_raw_msg/00000.png new file mode 100644 index 0000000000000000000000000000000000000000..76560b8c0f3bd5e50f8a56f6718ab7bb80ca024f GIT binary patch literal 420 zcmV;V0bBlwP)x`j)$#)l2xD5^B9vd+L007`}(Kn1u*nQ(gU3$CFT~(<~$DUkDezhFAAUQ3} zEKr}6Hrvhe=ha$+4lgrCZz=Szj${XZ9Q$FKKXKgpgqT`u@~eeA0k6)fAa3Q_A}8il z^uw7iLF&k@gUxaT;buTjUb6liK3fL^007{*`rK#IpIDufBN=yN2{vMCW3^Z{TSo7C zG?k$=t7gHh_U-E*e(N6KA#5tU`xhD?|wrTh)ltmPTuXJyZlmS>b3O#L0@`b_Abe*_$ z^7>S^x)d(Nq5;;TM)|dC*iki-H!smSDJSX=s%Z+HQ}A#i8iJitv5gVVa>;UH~$p67R+s* zDQq5oqD^?lPEEGkZbRo!F8?C$2`0UcPSx3Pbejiezr11qHgnf{Q@t~|k7H_5J$(R% z%v^K5(J_7S$qVJt12Age@ZZ<2#~j5DKvMtoH^oD3!WWaJdmFmvTzA<>FQ3sTXeOEL zPZOk?>`%rR+=*T2P8&&P3{sI^0000000000000000000W%|C8^YlGBj>%IU0002ov JPDHLkV1m0&*TMh* literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanox/test_sign_short_raw_msg/00002.png b/tests/snapshots/nanox/test_sign_short_raw_msg/00002.png new file mode 100644 index 0000000000000000000000000000000000000000..53ae65195fbea5b281a1bc1a80351dbf1cd79ff8 GIT binary patch literal 364 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|=-%ba4!+nDh2#AYZeBfa}G~ z%X2sUSKTFSd4J{-YHcY(QO5;J{<~e9q=7F?O4)!WO}6UUdH! zS+Hz=(4})vCM2-VD4nt3W%LdvkyzeG%km#`1t_mu*zR}#jNB{EKZnW}g5-=Bym-_% z`=7%C>zxJL|9msNSMXnbQRayy^)nr>EU7olTHqoc^vG(B%bo(Id*|kR{84!`z2x6n zZ`;PkbrPvd6U}A>Y0chs_tyHmLi6kw6c{>JvYiQ=+MTFTx8d*9^V|R0+_75oZt9or zLetinU!`YMvFyLCb8XxElhO0{v2rTkNR$jMW7~4}*8a52+MC^J%KMbxPN-JRb2RNP zEsp0ebAPS3=e2G53#Z$XZAI6Yd=Y#bpS7_dOvl2n-YDN3F!8|Zw}1F7^_|`|7^d-WZmAca`5Sx-r#o;?yf)8 zamTB%jcSo;Cxq7w@YDAG;F6%vdkN~UKMPCH+44GbgZ0O61|;n~NJs3(zH0)OyObgT z0C=#wjq|e8y=uL$7S9x$jZ$lEcdNB^nwK)>H6PNyiQd|Lm0PfUPFtnWXfpPxEGL>bcmBgvGOE8^+M17u26I_+AT#bzzP>rah~%<8qgG%2*J4WoW2uMlMt z9%lVFg?Z36N3j^!4wH0b{3O8WBJ4_G2v2AEUeKM8006+%PQAmq$BV*J0ebACz0uB~0+iy*OAtRT7 z96rVI*8>0m0002o%^$0xJh2#?r-}do N002ovPDHLkV1fi5-8TRL literal 0 HcmV?d00001 diff --git a/tests/snapshots/stax/test_sign_long_raw_msg/part0/00000.png b/tests/snapshots/stax/test_sign_long_raw_msg/part0/00000.png new file mode 100644 index 0000000000000000000000000000000000000000..7edbd372d82244ac4a0388710e72610f10214543 GIT binary patch literal 11897 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 ODJ^yVhvoNeBK`wcL%dZ0 literal 0 HcmV?d00001 diff --git a/tests/snapshots/stax/test_sign_long_raw_msg/part0/00001.png b/tests/snapshots/stax/test_sign_long_raw_msg/part0/00001.png new file mode 100644 index 0000000000000000000000000000000000000000..279acd54db7568993145eaa08b3ba55c1c567e5f GIT binary patch literal 5208 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 literal 0 HcmV?d00001 diff --git a/tests/snapshots/stax/test_sign_long_raw_msg/part1/00000.png b/tests/snapshots/stax/test_sign_long_raw_msg/part1/00000.png new file mode 100644 index 0000000000000000000000000000000000000000..8581a716185dc19678747d8a98becac295357c8c GIT binary patch literal 14377 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 literal 0 HcmV?d00001 diff --git a/tests/snapshots/stax/test_sign_long_raw_msg/part1/00001.png b/tests/snapshots/stax/test_sign_long_raw_msg/part1/00001.png new file mode 100644 index 0000000000000000000000000000000000000000..aa60a577dd7a2576c5aa25e5455c71123482b2b4 GIT binary patch literal 7712 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 aM-?p9tIK=81m65A*k5$IKsoR8<9`8h#`-t_ literal 0 HcmV?d00001 diff --git a/tests/snapshots/stax/test_sign_long_raw_msg/part1/00002.png b/tests/snapshots/stax/test_sign_long_raw_msg/part1/00002.png new file mode 100644 index 0000000000000000000000000000000000000000..90a229489f60ee16550c3a80347091d2c02347cf GIT binary patch literal 21556 zcmeFZcTiK&+bxU*rK40uiqcEyNG~cNB@_XH&}%@XNbdwiih|M!ohS%MhtQ-q5kkNS zC`CGLeOtMoM@e3GCC0A#Dx*FG{WxBR<(zh}tLiE-ZoHMDE04 z#6;>hNEnFj-@OkZdTsyO`U+9vmH&PZ&+%&%U%n%hLM^i+@QXYCkn=!A1OlG4@OAz8 zkBRyX$p7QzN^Jz&TeYr%tkZ9(Tw(Zc|N8%T$L^d_s&RN#f)Hde8j#bYO-{6J#euXw z2vLg7I}aN5ftpBaUmL$l<;xS;iDui{`NIqi4Nc&? zsUFOJO;ggbg~LTo84qcQiB1D^YF2WVWi%i&_+u;7^?Q*vVjI%2NyA!bTs0v9L!rcr z(K`RC`~&Nf+a&_&`?fC{^l??U?`6H?pDJmh=5Rw$sYY?}TB8nO$6J=KD~~sN(^tST zIdgy;jl}NohRSE_(3wrtiFJ0({lbTsz$Z3Gl9O!i_%>POET5d^Y$)mkw#|5PiY+%9 zs*mIbm-0pzI7R0^%Xw}quDWuR2L9+FN*(n!7+JoK1Ql)cO-{A|t;R2t!l|eSb9rAh zC+OvYeCSn0DU?Tjd@T0j=n{ ztreNvfhlg(w+Jni&bgGE;TADh{C>)ua4S8 zD4Io0H%EtOgi0t+f?7kfu^f9KuRD8QxOtMw&`#)oIH#Z#-&Gud-QXNo@eGLRELUjcr8gbQIZZO}E@Wn7b@dy={0;f@!_6fSCJO zZK*Dho|rK;41_*BQ7B6u-g7zO-4pKVnREtuiO?%VUu$o|C7FHnkCgsjA!*4G*EV za{4A!86o{GKgO_+FOtsltbmsy#f)*;zXeNW@86bNB}1I?-Y&{97cRWhyD>C6IQnR& z)_#nHJ<>)xTc*;J=@QOWyXbv%tvB=JRX|`$O#*U8eaa>pV!N-*F3RJ+>m9a#xuWd$al=}5 zkFlZUE5~Tr0&ah1x&J2VF;x`^oF3qrsDF46+rt5kW6KNkm#?e&5!+)oEKwt=TTau5 zPh$lF)t)*{9M(=KOW>=%skF*$G`z%reRl*=|2W8~bligh?~%5H{TF*M*DHj0qV1MA z6qg`&eU5Y2PbMSniC!D;1a@3?enbwzO7p9k%a6A(y#Ds662`MnO0}u9TOWO@$`h>e zIQR0A_sCV2*IX7F$vDgvb#juCitg4$vPaRg?1n^-#2!@=5uu1Wt`c!xyG~9NPjL(M z|M8*n!d~T3;8%^)a>-96_@l(uT;Aeh)4<2E&9pVV(T(NWqGK_itlMsMDh$4}Sv(t~ z`_=Mu)l@|2+@2e8{c7)39%%MV;P7If!0{(%LT_E_&3Y(;BwGBGtmw9V zn`9U|5*SGsY+iks*j%z@g#4hfQEG1HC2M)oMU3Vc+^(#?$%exR8RS;03ZccGP4Z+; zDEJ#1a#zLDkkaO3Eh>yH&Nf$d;Q1hM>NA)&;;VI;zY0?E@Q7?4gr!RIVLi=H-|uUrN?t;JSqgWUcFITv5{`6*yXqsoLz>lrcRmOwcFJ#$iIu8C3SJ@DTWjOUbfX^ z5BR>~AE+R_20qp4+cQ6(sCov@WDPs;mu8Ga=;^1%#KNT>JeZm8!4A^JISuXvwiqe( z=2PMhNi-xlL2+#8PBOd;)MUZ4Az3M{6ZvOWkfC77x8fz=NMG*<8ja*wwYB?#*{UJ$ zCp?;_8k^NwZM3O70_DSkDkmWx<1se(T8oQOF8#iWICjX@NY1s}BhS-mWPUg>=Fm?+ zu3R8G%;_{^e?PRdg>TxO_r_$J-})rQVBFL_N$zy4LcC5Ko3~+^?BvEYwATxLu)X`% zd_G}^m;7Vjkdyfnnggnm(pyan!&4`b)|mTB2qv&s6UWJ0b95X%(6iL#20T}7RM#7h z&!!oIINFSJ%78lSkJ#QI-bTB7ag;r-cdf*Z^?R4YG-b{h(F0+R!3 zGUP9Zz(nVx+-n`ZTHuZ6A{1RBz0VkyscoISgjGH24u@M&>g>MqN&qULsI*QfQWc!= znOc}&HyRdRTc!!JipCAcw{#A-fY2zF#dwl_`W_Cms^a3t@)YA-;#i!+&wYZ@m*LOn7$G;Z~BZ$jB~J^Lg~Ak9vrGYye;(S3;IC6 zBg3Us)dw1FlQ7b|H75v3O8CC!FAJ99N`|Mfbp5_Q{coj9bNzPxZFA=ZaTV@lz+u=Y z8>OKz-{@~Ks>vUaV!w^JpO+jy z@hJI-Ro{7Lm#xFoR2Zc0)pRQ#-2W6g6#0R89HPmx6ks{}@Xy?;cSaWdQ>Q>2%#He6 z-{~9)9(==YW7gN?TG#OKD z8lAnL8%;xcaR*3~`R^JoXv#yKVt0f~B+uk_6GP0=o*zz;zt3;KH}|g#-kU>m;aa$nPjkUteX8-O z*PhiHMPJ7&HQn1VwpUZharmZW`9%P51*oj~$Lw-TiEi9`d76d{VIJClUvAU#v~uC_ z4Oe6?ua<>cd5#V&)bXWVWK#u={1=6PTV4-lA*^vy3?|$&wCQWGLC~1F zJANIrW+CX>`Dw@*bm<8pfi$tyk-*A3l|F#LP|%dT>4=(w|ZOS&AN z(tfxNmJli3s#is`?Wzqw`g2z3f1pB8*p^<^a^6zy&?dyuye}dZtB93Kms-@-e`}sA zR+Q;CtaiK9gn{tu+qPK85ViXAGz$(+Kg}T6hMZ>7TcuOt`Ggn#kfeM3Hf&!DFu(2? z*bz(C+imCaf?6arITLwVbTOH`JWizzD$s!Gipy+7P59hcKyA|8yE}J$QpQW>ce4%q zn@d7fFYVZzF2>I(SFh8u!Z@VTL~$``(oJf3xfYHOwf35LJA8M$Ivwbv<-Iu;oXsZq z^kgGAzS7K|^>Rs{CBQ;nk+ZNqx`5wniTU(4|ET%%@~yxI_remj@6cqWHPuK%z%a{wokx<-Fm6)~HX&%pMf z=tbEz3!D3P_O+;d{fM1g(@$&yD=pO6(svdt5KuP!_p`0)BE(4+Ik#WKF6qpW7yZQc zPEW!O;&8bGfv) zwR>DyXnf#w)mb}YQ;M-dI{P(-C!`x2=n}jvtQUsaZw79 zYX%w+RDDKMtx3C-0Jf*qWE~K z;dSN3O;fSL5*Xx%LPYSZZ4nA9E34hGQY6Tc)-+Ic8@P?`%jcP!PhK(#tOX~z6#mbd zJfxZBHP;496Sw(yW9HV^W0pOBJN6+rPI81xl@OSwsh{3OD%S2#*g(iR0PAIkRmfvU zwMr@@Be?mV>AQQ=)Ph1w-~zL+)6Yd{^YMx1v{3a6hWn1Ug#2W+ zGhBoi;N>LX>a~O`IL#!EX5eb^HAk~_eY>-ySNH~4fwy4zOTZnP;JP)sn8$?mTnE$4 zqcASCov6oVu6Phf)rLg$bi}?3%qNrEZFg#mRgkds{Z7Hrl?!r-?qk6CP+x(wc? zIc)Z8+P&)fzx>Yj>;7b06ma$Y9e&-fNS5%yyx;V%mNUSw*mn<5=@hL;Pj#3&m@L@R zKg;;l^aQ%3O&&kGUVGeOM?cx!JU=%j@o_^)2<6cNT%hib?64}tQTQ7(b%O?$mr0EL z=>xvsZ)#i>MGw4v)4@^_i%7_*tVti?Mp~m7kzndsl%1jBg}rm}7M;C7Ulko}F5~2B z4tY$!K>4FU{{(9d^t+n39|L;OIC-&I3n%=EMFNiJGAyCH{iUr*j?|PI8>_rZC0ug& zuZk~o3YD}_Iaey%0-c3PnV*JV!o6hDpUp^-A{RQ4Ewh^Cr|cH%0O0rE8sTi6&X|he zlm}98%po5$frO*?f(N%=(*4Wz76N__>WM+B(%zXQzN;c++VUkGq{0AN?O)oJU(J{& zaF1dI4TV+tqpeY3-qki>8vVbZmx2U&+y!cYF#?Bsb*yG+$eOC^Y2ooipWVW9E8)#U zepiKmP36P2D)o8KWJHcYyQ)xpA57tPVK|u48RY)Q%*A?GF;Bwel~FQ@%xx{-;#W;1@O*JrH`t9bPLkdAs-Kp!x81Rqs-&(*6mAw#Fy^&+zga9vF!7m53w1wFAk!uoROfd zu*D&hP0=IhecSv7ayZLy(}T;k=x+5F@j*%CsH<$P59!TZ-DXh9;0o4er{w)xo;$;% z;MPS9CXBHUPs4$cifuP(%T!&W2WN^EPZ6V&MSEO;cy9S+f{-_c3oObsVXB|axt{_t zI`dK{M3Z_k6i`p(6LJC1dzN>D3dXNwKB#^=T3BrGCGM3)A|Wzz!siNM2e&Fdp#moL%STIAC!G2uFN_cMaAYYv znZF;G+d>o>Qn0~?W!+d4KUpt2P{V@XXnayFiYq6cLZ!6EaEj?_2`^`4y=hklrQC#F zXo_`J>o>Xc{viPVM5*6H0X*J~NEh{S)lOn`>)-jI@~x$mkZiPS<$gdqafm)c+M9PN zbvf3=Mtc4fhrM@)=R>UBdy1>SoF@lKEgs`n$#>tlgu_eagu#c zUG(U((&POjZD!{uLMpzb8tKt(U^(*ULx)qRP2dl;IlR6`A>C!O7b2hf->^0OTO9se zFZs@jz@p2~x%P$DTX!ZC3Y^ALT<%2Tz1`k{AU+lb=}w&efvm2Q_jUzK*G(1ssiNRE z?Hqz|J2Mmb?+45wD%ygL<1R;6f~M^+l9s2nI~VgY`_MYG^#`Fz^xI@mO0h)}ulrNMu zL))jCa~(IV+9|r)eLtS|#j(X#mYou zoavmH7CbeloA_Jm0}ul-1+J}HUBBO__&s#J&EKgMaMYh$?d>ycjK_>**J%r`waTo# zvkv#;b@P#yhfxlpjW()a9wAY4fY>|)`CsNh2e2k}p{dQO_|RM3l(pz26ty?sriB`XyZcx>&$ZQz{hLzb?~zJEn}QR8~g zdGK$i2u1T-9m`K(yLd%zj5p!4a`w?S$Lv*pR|clr=3sD>xAnGnKq4R;J(B)b%=&*q zQ2lTG*7vsXCqwvFN^okPeUaKyCD+3P&@QK&vin_$jt-}zZd=v;H8*o3hWZ-wRnOX=p;FpW&1pe zs-t`rS>rBwtyDw92E???IBKmir@t$APk!`gv)bOk5<*DS)8%m+>xzDqk444Qg>Wj` zewa~JG^oFH^_gdCUJ{~fHHy>WAD;d zw~WBp?eypZm&qARdDHQ3iuhAw!$laXle2(zCFdr3eDlp&Xx%kqLnxVCP<-JD6uf@h zsxq11IitXJqRusChG*DN2=p>z$zR@5C>0PoPO4UY|MavK?x#WE=>fgN=cEShVYt>emHM`-Egw-;~Y~pBCV1Hc{690k+o6%=3qN9Xj1ausw z86^gvU7rTs;@W#KAeDJh=en7w9lrl4RlfJ=KP&w1@#SqX zelJt8?@08K4N7Vna$ZDe{U|I_76{D_CPtx64g#rB4Y71o4MNs5p!CLk-Tt+ujR6JZ zXy1(TbpfL#)qkKL)F^%8mAqG=*j|+6#i>A2oU`5L|fSXOu zII7>D+^DqwrX(WhJl|g6RY5!JO4?1>)4PFhiokNc`( zkt)6e`4ROJcZ?hJTLh)vtM$vY#l9fIkimmP8cLl#>kZ&Z{_XzeA65h*Rbp&o!CQpX z0ns3jqMw0b^l6PT1>4t-Cv4khhBHR(+s748C2Wsv60kSsR=$Z+bmf+;kBO>Lb14{U zbu3QQuFIak`kobs{Wh_=GIN+&0@aarVsuPLFN&?=x&RI=-}}v!CSK-8U$FX~VA!t4 zxFP}*>-rrM_=()y0wxO4Pi@P>IEIk^nWvU+QsV7uJ)-)a0s^7=<2Kl1^iykHH2$9d zT~Mc6mooYpKvzX9dgAMu{;{!LIeQu*agyZfy7PUfuF@8&SV>@5oN1~&WR<>GHYvLe zX{jqbKdKMqcfJbn$o3OLn#YSVTL}tNXe6g7(1$)Z2`_2pqZwb^%RrVvu6nWLWTGb- z>W7TRdUVOkT&uh?0Q5g4`;%SCeYYn;oXuYsDWR`ZIP6e8$TsF8xx8mGu4ue+GHtum z%ji2+CXLdrg4!WXQ@iz)z-gyF{7mDd6<~(< zfxR|XAxVar%Ecx<^2gpgXB&-=2njc36C=Pa0_np0TX2?0?h25n-xCzeSn!OS!kJfGF`y3q_Q%EqzC~Zl>yu8I zRCvN(@A#y3LLPpaOH05mZ~CHz;lOGIaDnz1{%m=fN1%l*WCnp*{$;LnJI9Mk-!Nq+ zhS%Qb5fk6OB=`E6XG4u^P=omvUJh+E>eKv-A%;=d74(3!hpaThDFu{&^1uSm}FvN#_bCk6kC+B=4Qq4AIb2pLj6ykx z1FPPN!YI(t3sO`=O=HW1VYJSD9}59^XwEY5k67&6z-nmAI1W4-->+n{F`2Zt$w06qHJd8p271&?#>02?g-8SM48WH z&De{k6))Ry(qt~nRZ4r|gpiX-xn=p@&8>Gyhw>MHx@-|2dXj%(t;nqyI)YeaHJ7?F zU+JCa>w}I9Mu)Dk?A^y>9h6iplN*yOQ8=!}j2|vT)d+^>=vp0Te|c8d2{<%;8PFo_ zb@jRWrW=lgYK(xDtl@g`N6pMm$-}cs|MJBz3s-GMFu~a57 zhr^Ql0MNf9pz6D4@bYz;d=Jw*_WvyCm|Zqx$E(#hu>tWp-D%iSt63)f;lS+gICHf`w&5F<mv@ zyB%^vG{~~kZY!J;CZi?vbwWY2*$dV-bKvyJNwZgpzaYyqF#+`}X{2L8?E1wYiK;}N z_%tz*yT6_QOIHE`KCc)p`Tb&whIHditj`Ni2({MKZzK(xR9y2%PMiLM`YGRoR2hty z%q~C(mbxiebcY%%ML)WM*ckRy=e;S;pNR}~j#!wC#ini{#TNrwXK>I8;6#kp5DQ{Y z%QfkH{|UA(T;ibk1vnEIt#J60O<(5;BT)wKRF11bpIWGJcsbW42oo=-58+4l6xVM? zO8XzD4tJuF6hig8RyxG@1k~@|@gB>gnS8zwpJnE*l%ZVT?o=o? zTRb+wp#w+T+-0TmMn#twJ5&U>(=o;hVgUmIGH)mF_jtiVtei;**+=wx-Q&2!z z+X;UiV#;esamg{{`vLY5{RUg!c!?b6GB-mumqZY^6e094N0qRG)=!2mV&J$t%fRS? zR=~1BH=2V!HCdY+yIWr%EPOJus)diK_8G}Wush!@D+2L8r}1mPP1?R8$M(Oue7X;p zW`&wqAIM0l_U?Sk;!>gIosu-!7aUu-2?dzEm-nNsyZZn1rQ&n>@zrl9+^>y8ex)_Si{Oy9bJpo$#qF160$Q5Hbw71|lfXPJn?Z^Zkuz>hP zzV!7*?vh*NHgIBE(OnIibv9UTB1X&{uU9o*!cLI8p~8QWed%4OVG9)-CE(8L13g=x*3PaiiZ zeh=5EbO=gWES-+8qy`W!?P2wth0fpFnfGE~^NvQ#ipFMBvKN}8`LCKKBYDH1O2XB= zWJ$L`#mnQRI#dWeW9gs5@ZDYXM$e<#dr3oUb!inzLzUw$_R+ym_5Toe9OUx0kiNs^ z<-(e;sH>R0;5#=ID}c@c4x!jQPYvoppDBRr3*bc~d82La=oHf4J^XjT@JZ=RXotj3 zo-&)qbxpOmTzA?anpuB1B_Q-Dw)smmFW;iF2|Db%2YOo3c{Z`O?N9()}Dk^ zYXyCYgk?gmh4_2F8UKqMuq#N>pXqzD~x}3D0RUx9rQNzN4~%ll za2UB8C^q5SLp&_8K+d?@-B4B00>GlalClvL`)$BMn zPO=PtqEMUFpHn0!M2TivUT&)&zC~w^(s40e#m`q2Nm1r zFpSN-6uSL)J^jMI3a?!-c|vYq`JE=WS>#Pd&Em+c2R@!g8>!*qy0rl&bm9_($DIQ%y04bJeC|NdsVx z4|;nA6->@iXWv`v@0UkBJelL_isKVzcJq%}bOFfCgZ#v$_xjtw)-5W~zc<;+;GHd^dk%ktSuAXIz0<5Y$k6cFte~T#66t&NPN4 zG>yg=8uLy+>7tsuJ5sG5{?|` zDW~qYI(VDHg%Z+q(g+w*_{nay2A1t2uu&isN$pPvMD3ZcQ8oDOSRLp`g>%{S^zH?> z&4331#-UHmzHyRQr@Al53>AqY^O9muyA&HPb3hWO2|E=?)x42h{ZiT2XR*Z3H}zS1 z-f8`HaNSOBTto5?gV^~m#8;<=Lq^W~V6D!EBloqat~{_IoidE8V-lw{I9maC2G4%j zZ9-k&^WSS~B6nz=*!(vMtmXMlNY%9h8!^$VrKKxH653rnD`Lmb?;Ght;?lyn1mCqU zZ_*cgS6u8#pn$k_J!wnCqOlWr*uuLdZ&73@-bj+g zVp%L&`Ld<%c_7&vcf)-f^tM2vHf)X6EPr8&$QBY+y>I&z`AmZNd!|oTlc7#b;6807 zZmqC~W=@AOQ!N4m98qrs<{2q?Wg&n%!|#-vt*1ki~E z*7h=cI6!a0pM(sZ-i@5w+cTIB1s8bcEO&`iQf5KNSG}2f^cu{g02(4#*c%QFR@V5R zSPDC184g1GGoWZ|{yEJY{ybiKa8h;QxXc~=R&=o$gwEytXW5kSTRAyjUk6*Zw)dJO z=Ff4@+$gp$aj)CKjI9Dj)@LR%TOG1&EdjVSUeY_^Q#%Nep+T7MR^Lu zgK}Nww~sbQUyZ(9x+$6-F&^QV(J~x<5v&LUjoN)1Lh#zf$8adAAM( z9^d3naCS{LG{yEJH@s!j#f%L9Ec7MI4c)ZWdz8vW9cvyS{blIMP%U5vlm;J@`Kd=P z(j*qKWERZzG?pjDMI=kvyO(``bqjQIZAe(7$ZC}YiyR7VF!$DFhStI)6G3P|nqqAa zct$2h(Ip+bWz4=i55Nm!L;4g8q5Z)7qk#u)YhkK>d_OJU@LUu(6D4~ed{O2XHck6|{K9yBio7ccfiQSu&rR;LjlQl!@ zNW$Hd^Y{4(HQ@?yu0U0;wME5fQ#$0z=2&L*#ezZ(shcEPGu{c25ZY`m1a~TG5l0n; z(~-oTdpDT#@c;^Q1qlcp|p(Enqi|w)EX1 z*T!3C1z4Fis&)az?TsT7QomO0#8jsSD4VTRooC8~MDAg&&w!;>uBON_jdi<{{XkY2 zJw$g1Ypa%D&9XIy)s zi{Vy^4lje8VCyl&p2XT#yGdTR;&9KQ?rmkH!x`ntM;aGmMQPDv5tj>u%yZ>0V*jW6 z5tGsPT}3#sJdRw$@}GYV5sW|JnrBs;sM}{@-&_aWxohmmWt0Ov8%0xA1YRAcB!@Xu zzDaa6o%g8H*208e27|>BJB(EkwC;g!qnlm;v%NyL{S~ts;p57}aYFb6YEh*Sg#Nj_ zH|H+ROw}j#BeAhOAayUW1@MI=s;;(kZMvV=BkqwmSv6Rr>WKLuvGiP`o2;JC;cu@? zI~|i*#0}>GD=Y<2AoaA5Ej6Bq^@ohXm>8E0inbw(7P8-r*aLd>o)$ejUir@YrQF%G zn6syCoI_eNld|Fch>ybR>ejqrMFpjvS~AsF2CXSk01`^X`>}J02Km2@1^v#Y-2nA= zn(}L(Yuwl=uW9$@3jW^x#kuK;x&R;wtrLN)I6XZSi~SqxP2XCvLy%7xQ`E<^C49IESBe!eh=WhqHwvrp4x3ar ze^mOrmbA&wDHQ!V;yaZ&B6;6V)@-0He4Dm2$DAM@guk(=bz|SP*olz`cVYc4#v4L< zbBhP8=FZ#qu7i!fMqwIv^H*SPsmgdjg0*_C-5O?3;klAnnAp;izs1{PB187aTl4!y z!JAe3Vt?40z_Hj~QeMP`DP4rV_!hrXQ&7H{`*aFJ+Ey3-^e&D<>AXy%JLwU@(o|T- zI^f#B^+Pe+}J^`$!sJZ8cDcHcep!|r!byv#>$DPy|4RK}DTQ)Gvwqk93#tmb#LEe5jpewY04;q(L)hr{ z?cFsA^czK?)Rh6&iQktRZWaN!{jlzF0=|eQgz|z#kY2P>EC=-UxtZagjq#Ku8I7+b zSZPx?aW9$Ke%80K8x(UzJ<;K>qP*q;mS2_yQvLv#Fhgx1I-Z!1$IO(f#+$Eo5mpR% z-^8up`90b7TjLH_orNopsP_`4w?eqP*~fH)f5LS1Yxm!bW9w4J<_pei)H!vVs$qg1 z`a)MlMT3SK!aNrrJFpV^LPWT=rb6m4GOQWR5))a3_P^wyR!{oupBoMRs|+0>pL8sr z>_JQ_9SlNYoa3~_&MACzA{2n~Gn5004*Thu-&9G^1!NLtwGjEtu}$BtfZ0&90-~h1 zFM&b;vnc{B0YJp~DK|Co@88CMvj4GE->C*Ajh@1xCYKd&Av0_MkFpc22viCTx7=&{ zL{iWTEpIG8IXwjqygs|+EUv%(0d?yM$4m*|CT(m&?=v|=AYyn!!_~DQdDca(jzQD( zV2=UIkj8x^5y5u!RSa<1+C{FcjKfrl6>#%P=PfE~4JMC7&9rcTzQl+Gu>pqRKEqvb zHIFdzxzOu(iN{{-0i-*`;8hE#PZ<^s#>J#YA98oZ%zyVf*sa~(K7-L+>Yhi{NozhafSo!0W}{l_7o z9?iZ#_B22Hy;=g-eKkcH*5+!Ks>9|O;k<`}(Prh+r^Kr6Y+pTd7h2!hiB{O=pD(EA zXxJ-(8urDTUhr64|G8Yfi0YbqW*da$gvD`86p5AocJGLM^m+^Sv)su)Khy_D)obsKQ*4UTed zn*@5RrH*M)e@gX{Az|K5ySYaxnf%pgh|mEo*TG7{WNAP5?SwQK#8Z)eck!dj&*DjJ z^036QpP`|u9);2`1W+m^oEjtMRkWVL&9YFPH?f&H;Bc5keAzQ#Uff)oW2Ad<9dCL2 zTi{}9pgJcT8yoyt4^}kLL#y;a&?dPRIqveUS}0?CIbd3X@?fLDDY+7u=hfrxG|_5+ z*+zkx>bECw>%9}X=?fMn{8Romn4tHrKU~eA{J`dP{_*qK7>-hu%l1q zjpMSmufNgamVYgsdhp%&8CI2RmK_e$|c)%oAYXT{IsXtwY{8C8IeM<6(v zwiFD%Tbb$W&{x$P!;ikOdzXZLc1jdO6@vOKOt!1Vd4jJ-ZdfUmqAIgC^6Nj7mmq(Nc+T-6=>Ia*j|76)9-tWfywBni1NYUFP*HbBJV?MoXjeNO+uLs?naDJ1$)8y zsk*$I%(h)OnAd@FRvvS<_1T@7aL6<|GeL8*@Dqo&^y>)x{%wepsho z$twC%_{&jT&)dmg`%Lbk179HFCMhl%Kk}*l(~PV1L!WSx>C%=eE!1!3h$}7JELn(d z@Qp5@pi`~-je9D)(Y(-Avi+BwPced}C!yd6?BODlqjV2!TFbQb8*@53j3j zbA}->j;$8vo^3OuzY^L)FV>WROWwQD4k5c1TD25|$b*~au@a^0e-}lRhZ8Jg^OfDN z>vDbb{H=iXJTJbP!6{n5z1qUhpLqAi97wfD-fO^V-J& z<7$3Qc-G1qHO4Zy0Md4R4f!$UhLNT1uBANCckj2#mARzw=9J7Wl`3!|TKnVf-4M~3 z3yFZT=4Kk7p&w6yXhPE01(4P$P}HkP_m04KH;j<{o5I6o+MX|qPDwj%%QwtYlNhOV zG|u2OHH_#%ZlfqE`Uf~J0{}H<`hJj|xSLGYeld>u zKnDDO_v~z$(!kvwkNSzhw)IA%zmVxyFW-klbv*P{|26N=*s*p3yR{$EHn9mP{$NUT zc>a71SKFP+rW$ulyldPnNshUDd<&*N9DqGZZAq!oTX3$4X>81O;2jsj-fo0|K(v=Y zCTe(ff9(SiktL=H0*TIi1&4NtWMP&;=;PKI7fFjzl;B)DBi+AlKR#3pgC2ic2DWqi z^%+}A_eAF{+}~>ObTuK>G}6ZmF98kbv20j>$-(0 z{4)xWzIQ-JjJ8cW5)%Y){%uO4w?M`niHB)~A>sej^W z7*ronbB*RbB)AjK_|Qn;H1)g{G}jW|rddgJbRbPO!qoiMx&>VyPV`!pqHB9+r{iML zwe?%C7h(fJt8f#z8x-w^W6!1^f8hjZWEyNb+Z~-Pht};Z=29EryC4tV#38N_z5eg| zjgbGlAIbRtTL;V<|0SQ6iM(i$z19}JN05)jZrJ%)EC-y2pPo9do}7EjLQQ<-S*@}e zZ_$z%X&tw+McN!z$z#?VVNYOm$E}#XX5Q#!o)*@mh_%MpY37ibR45_0^v%(uN?Uz+ zKC=u~`Y^FgaS_ZD;?Xsp-SyYK5#R&fnPx~7I5^!N?bU9 zRd;L_{c?#tmx$#!^Fum-A`%loAC0J;FS6Z1awJ#64s3M_4QBA3MXmonS0Z;NLIG4k zaVr8v#W!x~!52&U9`A9-uAQ8iQA@{S=iKA5ZI>ndED!alfr9|h_uNyTf2|D2F|b+e zGBm6zdnrt())})EJE#*01!^v(V*!?Q@bOC(ldlC%uyND5OrrWoV^3-37XjaRqmdvq zvVSk@#)s7aQ@XsUYS8-0^u9>aa)Y^fUS*%@gj+oaZQO+{MHj%iAu!eX@g01x0&zPHFB5MkgOFMw-l$}L4(c_>dKw7j@@VdH%P z>o{iZJ=;R`V=pd(9On0nrU9C)=Z{E%QA15X$UgWVt(<8%lQR~gF? zvN!0EB5Px5EECF3G?OK=CDm!HSw>PcLiXh$g~S*&Wt1aZ_An0qqZo_{!<^f>uK)7t z|KgnU_IdGK&vReD=ed9P_xJsN%uIV^HjY;tLh1*6z)VJQ%>i67`GFyzMe2ZO#Pu>KE>m>u;kD>q2F4JhKI4gR{ci$b42ag^N z8>B+gl};zK!i&qwvZH)i6TI;(4YNuSgv?%f@r3cE@%&BOgbZ(qQ&m4tXqy_a3^-D9g8~r9}vjC*8ca^K6u{r!=^Fm zng!pdwX%DxNpEqS?d^{%u2ru924b1(h)-{n9D6>onDu3~)P1d5fUg*;x0US+jn;qs z7B?EGy|8NQkOi5v-~J@7PJ=(?!tX^BUW%FPauv*6Wj{NELhj`Wl6;I!lXW`w|H0MS9mFNHwh> zgDGt-mFWz|EEj_!PsOA#!kup&Ao+cmle7+4qM#LmeUH&VJ@qY~lw(%5fnu0LaE5Bl za&Hi%V)114%K-xOT2o+@k42O0Y+!cA|7CleyJdP!7#5?9p`3&1|N47>BkT*St^My~ zK>jCX@z;Z|TpF|xW!S1O4uh$6b0K6opll7nU~v&@$9VrXsN^4c!vBX!Ip8h^cnRQN z4H{LzLA&YJuA2hv-&}+46$qJFu#~bMqJKp@cW1O5G%{e62rGp1DhpE7(kd*`M6Z#C z7^pu~a_jPyBLNar4>1U-Opxndap>h~gIn&-|7C&=l$00(;MbVXH;i0ah}r@_${oG~ zhl7$3ESKkv)2XSEvlDqUgD1tN0u&aQy~@yLHaEfWS|zy#X_0CRhnaH=*QX@CoLfd+L0NigOrhldn3fYA$f5YqE~Zee&0B{gpoiaowBAQJfT zrkN!O($&@p#9mrA@U${mN_V|_HCHWx!RT_{tcG5y++6QuQx$7L51db>4(?N-E#n*K z=0U7M5vadoK{~1r(F*J-Sg;HRSF=|X4tE+M-Wv~Vo}tR~(bN}A#POZ(j_I}!4ptQV zg&YBa1m$U>tq8e=U$ptm@4qqCOAGf9U{;P6=S4E&XD&(z@ql#~-8uSCW7kRyWl{jyX+LAdgb`hUBTZS(^vY zJ`N7}Ol_;)hOaTLKBj=bb!G~~yGB9gCQg4QoN0uvd5qL2x5&tq~e9S|TAsVgJI?*p5a6c#nL))QAtm_4{W@CmfUX6)veO^D$DiCsrX#jhgo-qn?`MZk)ySFbtzQk^7PwkB1SBuN)cPv{ke#=Kw>ENwhoaV{Z_>h>J(a-- zoM2-IS<&5i6UPJ9Db1*cp};xzP9LWl3%(>xzvL+r@!nvZ8}1apP{lz~#2(h-SP)_` zfChQ`(2CGgQbfM;#Tzs4d*?fHTr(p@Pz0M!V=f4ZXs%z%wx&`sZ;<0syce*8q2~lc z$$R{)YWSlpUaGzt3ekV;dDbWAH=|J?z=J(!{A*aT?ighmWgn4lX{4=_mwIDAXrS0^ zHbAx1htN3>W5T17xJvzm*H6$8*#jV}I1G>|;ZrWuB5TxGi18&#i?-skTCN1~tc^Ch zs(yNWS1NZ@BV1tf>IwyYpc4vg9<$ykc7awgkj30ZUQxlYnkFFNQ%zHGoL9n1Th>sl zN5rwBC;2&5a7i_xNiSVhUnN;S%E3=jFs6>w|U`5+bfJUwIrge*`{=HSO)pCDA{#DG@ fKfHS_aeoN&3&Gk5yq5zsP?))?_30{O_xL{m-<(m2 literal 0 HcmV?d00001 diff --git a/tests/snapshots/stax/test_sign_long_raw_msg/part1/00003.png b/tests/snapshots/stax/test_sign_long_raw_msg/part1/00003.png new file mode 100644 index 0000000000000000000000000000000000000000..78bbaaf73f8284e38b5e4bb9ff97e8af5b0e774b GIT binary patch literal 8440 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 N%+0JX)n9N={5R*mQaS(t literal 0 HcmV?d00001 diff --git a/tests/snapshots/stax/test_sign_long_raw_msg/part1/00004.png b/tests/snapshots/stax/test_sign_long_raw_msg/part1/00004.png new file mode 100644 index 0000000000000000000000000000000000000000..c1a8fd4eb09009370b79a8e7d92355e84bad3426 GIT binary patch literal 5084 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 aM-?p9tIK=81m65A*k5$IKsoR8<9`8h#`-t_ literal 0 HcmV?d00001 diff --git a/tests/snapshots/stax/test_sign_short_raw_msg/00001.png b/tests/snapshots/stax/test_sign_short_raw_msg/00001.png new file mode 100644 index 0000000000000000000000000000000000000000..5b0025500aafa38f7f4155cd9a3b3c408710a144 GIT binary patch literal 8186 zcmeI1c{JPk-p6&HZnV`_tIBjb=+xHMT7>DM(bh5@LM)*u#u79YL4?~`c!sLBT1t?a z+A2Y8O-LHF8A}laG&-*H8r(^H=VElsHV2Kfc-yJh63uOHfnOdw28t70<*XAy=3*Wy`Vp zfr(z)J^nLlZ^@CDN1XTmu>HB3{`Y&!e*NL9|J8G6OoJx$Y;WYmp8793xZ4t46KMXm zU!ErJ>Aj%Tr3C6?ysugcdP_X8N9{sh`}X&Tpx>X^zW=Lhcee$7W&HJlhr50~Q}?$E zJC7eq|5tvw%q-RT`k9_%s=fSBE0NchhD(ylWU}7J-xe*#%NMSFbxq@c=lB4Mi%Ts` zH+NyhX(s=_nEpR$%a)mN6qy^7)9O&{*4ywF4r@M6pyssSR%|__WYmpCa1r!6CV_ELkAhoeF8mQcXHokPC!AanR+F1L-#I?ilsCyG6ybRd5w>(hsJ}SOJr})WirB8nEO<21x=Vh z6{)iYNR|Z>W_CQw1B|fI$?FaE$s-J(UsE84fe&#RdWIel#5YOEf

>3_PCyVo4|* zQU@PD^`H}B4*Z)u6K`81uzf?bw$kJ2B>q9%U;Ssw?_Q7>wdA3yMOP#Qg0#_DSE%A` z8D?|0quO}x2DuXg?z3>?{N7jR5NxwOJ}isHC+Zp3IHd1RQb(VHn?rpnZd2f#CRuR( zf_lb-Q<5xK)&bPUXz)A}I+j8U&~kd3^EuAO-q8`q&wU)NZa>1_ht&zGc%@pk5M#pg%I(nj)iK<_83PK@d#Hk%dFdsM&a?1VtzR@jc< z0or<|BkWNO`0HZ}{p>PW`LoIZy;3v=SpDOgT0zW2`OyVkcYap+LntaXLhS|mp6nAM z_MCOx8($>2;cQm6V~9fKfXq(^+vr?=9II|W4oik|gd}qH8JJtdcV4L==3g2}v$h6f zAR=0JG~#}jRKw!itu$J`F3Us}9$o8X@1sCAF8iL4|KlBBJaA59`|DHi;= zKFauC1#7m*KhpO*bZYfF*oUiSb`BxBuXFX10R`R>S|!G?-g59}JOL)Ls2gJT%Et=1D)H8s28x_QY=lc7*gFn19AA$Ld zU{nhxZOe>@8H!h-2V2-rh_&`bi^osZCiYOWPEfSq(qu*9^4%WZq%qRBU=$`;RVwXu zh_mj>nf|%%;AtjQ`@(Uj`T(NG^U7xtK1&_{80oiC2&DWXEa1Ovu#7oL63YTmF_j`8 zI*M4HH$`7OA)RHnMIR5VhXR6{e5d7fhmCZ2+Y!9Hx*BhzQ&Lj05?SSMY&g&zjI#~N z>iEXw940ljzW|aq8*h7h{Q=l&kFH2iVpHgSw_?A6NmSqd>cNe2H2VH)yVzk2NF|Nx z{N<)xCm6=&{^FihmMmSf!n)eN^*6Sh`8gN|3c)hMtgz)RvL?@0(xkrqg*$TALdYD@ z`uY#riXxvQGREu+!o0WVc-<$Fcb~ z&NtOx#BAyWABLvYNXY(Yz6mVb_kT&2yY3f&x~Zvq5GPz(TC>D#s zdwybj(s<%|Nz!Jlypy$hx}PJo5|Sbc1KUz*t*sMpC&3tglc81)2t+N|&wZOQtg8Jx zaPMIV?C(yfH&evxt)`Q6NE(eci^?c|nxCI0c%4?0ZVq@b;bIM7hza@xNS;{y{1U3tbHs}raX+oi%6?OPb8kYut3ER zWKA~wP5TtJWw{~U{uy7z4-fU3iztnmG~v?+OUIitUYIpXXk{sf9|zvt zSVPWo;PjuUsA0#n&Au(&^o@g2Y01gAwqCjz?EWPsjl2|u4EO6dJB-Jlhat80jL-zW zMD}H^WX(wFYukf8>KXLOxb7=HN1af~n{#g*9UbQfrs58doN#3o?PZvU@UyIE97O>S zkz!s8b>t0CEcrg79=eK{)P-!x*9g*{Xe+-OFS?3Xw=TN-xdDbm{|pNCNr?5Dh`hEr zowCtlX2N#asujrZnA^Fs9<{tf)yq;!k^^!--0K7RY^cYK(&arR%3{8)j=C%-4Y(O* zOHnnp;2Rtgkh{)hRz%E6WC>Iu_vYK1LRVIqZ>C^wtSiky>2+#F4@IoBJm9UtW!CT` zIacmhwVdiXLI;-&KM2<~n-K=oNGunx%o-2ELDO20wK?Y7g@)pzT@{~1v@=`x$vQ_8 z%*3L?zx{d9dakXxmISBb`t2HZmi8C6_|_nBQB-b1ID<$8Y3w$6`%Td)Y2Dy_Y*vma zEBo!mtx)7a7C)tJ8u%^Lct!YLmCA#S$GHlVx(fot6Hi?z3V+l52+nBqT>oj_yX+lC zyjzauLF2GQ45M;A7UFGI6A%#KprenuVou#Qu)iWIQY?yWSg0-bZd114SkP>2lR$E_p*-NILU<^ z)itA|9^`|+m2S?tSF#r4$FMt3dWc^JE@uhkL*V(x4$t|8VYr4wIS^3bU?Ge&Y+=5~ne*++gew-Gl4x>GW&LPr?Kgrq(%m`xOo;)Mo^VVb9tJ z`mo^yH!P6HAP}FteE8;*bhVQ#hgSYI z(YIwUSKB<#WHRBLRA{tqabBowSC<4gY{5vNnq&qyj@rwi&H4|Kw_RC)rP0WG5qi1U zt?loL$%Pf)^)}$~M4~+Pu@#W!D%*5iSwl$GAJ?YWcaE40Be^uh7ztijfyYnGS`@gn zDn9~=e?$QIeZnwb5Y?9JkzL3LtIE)?*}Sw}ke95gn4h1oi1>#;*RXxH^}4}WE32b4 z=Vy*4ly{Xw0*acx#2PrqUif047H-Mm(Mdu@Fr4EBL5>>x?OV{Wb_~3&%_t|2kzBVx z$zlB#cxojL*a+2n6#@PUt$l^0l!7aXb=2JH7 zjGlJ7CV9KNyVDPHNH8LsD`@*iA%96T1DhXu8Oun<=2Yohl8k$YKE+Iaxc5wfpFi~i z^~{h97OgLkMiDL1oP@^FRm26=A?laqrH%SeS_k>i&(^R779f8J1ja_f@6cW=NEGlV&{yI`+((& za>@v*IGY3eQRSw7B{<#nZs08TF+@Xa6206HGs+W&Yj(-l%BHaxatm&y%6ITkBAK(6 z(99FFu1{uU+w$q$RIf-+B9+38kt#4`;dmzSE>Fmt(P&_FaYay1X{n&aAonI}^?AB( z2W~XCx2*g`MD-8`lruCaB$;C?k1oJlp~gR^8O|>4db4`zoXVOBf-R*}U9+`2L$x)4 zVvQ#zUiM7iIdZoA{$B&+#{rJ?7*E}_>>>}nTUx^d?>zbOMLbCX!<#T1)_5}(L&__a z>aC>63Z^fMNmLN)_3EoTlZ=x`90FJtRk&xTO%fvgy&w?nA%9ZhR3D>ZbxLM*nWmWR zX)ubCl?-02d?*_re`CeRYC>}?-a5UcsA-|{O%oz1wn!c&>wK~U(lx-p7q!0TSiN=W z;o1d&#bkfScU*BLNLV+daW*=S)!mpx`}3Rk7_=x^KfoZaIsCN7`?gNkpd1o=_~Xe+ z`PYkP$__p0O*{KBS7);l=2M-9dGBbLPp|br)?7;88TC!^-9gp6bhfOZU~CfcXG*SU zDm3%E#m6^p;zi05W^}8+Dd4`W-OXxejb<;u39vsHD=Uuh6gfQb+b#$~@X8cZscnv$ zP#TK0uR3@bCa#xz9y{RosW zO1eg${H#Z-Q`0 zfINV34G#d0-FJ&?_bhn4l2!aMRcMY!Pd07D=`{5p9j%;u8!2R}&hwm^Fw0Zv`z!w8O zxh1~7%!1_aWzK`i-51$gaT1GLLerkM);y*aUppeWp6VbN@(hXe1Z>8Q@>!&=)_o1f z1Zpu_CkNn)E3vYw?cAK{fc2*I33YeINlZqirT?5uscBwV!wr#@C0~rbK1B|8-bkby zDvMDDW1Z~8cYYy{?Ca3}gVImoK6%q;A#Rv$*RK8#V-MaK`m}S?Yp!m)v&O5W)jRFe zi$VWP1pg>4^HpMMYU*l`TFMgcA6~RnW5?e^(trI|^Z$K+kF&9Gl`NG0txGXKu;+9B zPn>m`ENLUzCl3kph9H+q07#wUV3rwdTP#YT_G%oS(u9)l+vxmQtpj1N#gM7Sq;&;G z-bJ(XfpY*d{puWGV0%|;k?%qe>}|Wsve?>Gh(mvG1n!7IljB)_dh9JIkqvlYC18${ zX{}LCaTh_=rwDld?5w_u3J0tYaEI|*>_H&FI$#nqkg&kIW6BphM})|XR3r=l$!S|E z^0`dF4u8?=0gW#VIX}CjGZsrp1m7mX?Udqz)9d?mxDRwg0C$mVP!=5OQ=;deV{DcB zl|3SZwsKVBeLZf?K1(uO151L=LQ?exwUzp{HMjgyQ`WYW@`83e3-69mf(`Qp( zq9Lm(C!m0l`}8}s#)~GfTGW5PVNkTlj?am^S0D3ieRcc7LPQmw|I^*!PDMdMV;3imMjRh_STtd7R7HAa=N50U6Un+=4U252yqz{Hb7MGBAmt;kc zjPuf5obE(hVS!O%a;l7bQxdsqw@wdER2gkr*L7}PZ%zl+=*Q~MHm9rz>dD784h$TjKi231p^YjcA4YlqgK|b0QixvHRtV_fyF6cQao}%8J#$LcO1}SyGiHqB| zfOG^@0BqJ`6B=>j`0c^2BZU<=t@q{B=JZz9S`V3IzCs5(a*8zPf2jw;c-HunSh{F! zcktTd#Tc?M@rz~=;<*RwjqxCsJ*%1LGAXMp0ZcNSq=9Akw&T6i|=n9~=syL!#D z^1wA&--p$wOtdD{I?v!IR-2?tZC)aaw*`&qjS3Sg<=^R5^Z`S*wok@w#9bV^_9!CN z*Op_!NNtNPH0W~W>(7oZU+e&wax%@h7id6kElcK^9zHC;KfU5N5BQJh)Sjsmoy+zZ z6iX2;Oa1H-WU-cCs?{w(UthXi0Uv}3SdA5rH@v@gG2A~q+f)ImW_MuH&H3)&%N_mI z>&`1x9H0kvR%iE!rK77uNBCZ`5ic63K)8XcI+}D1kqS`$;$lRLf63VV23%s(N(-3|YH#dR zpKZ0$kc^78+xlvyrx=K55u(I%X~9JDl(VTzRwsDhxpOqDV`^b+)jVTWVUF6{WqoE3 zIN)9P6pX=a8s+JAI2OK>09zU%Ay$QQrPr@7l)9r z`88KCD`RYlPWkXGrFl?Q*seYLE1&}N5ORtG__!S<5d>Sd9ksvbPND} zOO3c)Uleg>l8X$7P?&wUa{r=JGqO5fNw?8T6*?_&7#q+f*zxu!w9Z|hJesJpV02cH z9evdnA5;(YT-Vq0auV*Oc7johY0Vc}d{xgG$Yhfbqf`wHf_ zrEL5)u*?LYP*ZxX{eUDie-y4qzfb|SJvOb^{?QW0WSL|!!XB*Vb%f(Y?TMlzsr$oI z8zq`xvrnY(nS<3tvHGLv_W+*1d$O+!{`}v9lR?@5 literal 0 HcmV?d00001 diff --git a/tests/snapshots/stax/test_sign_short_raw_msg/00002.png b/tests/snapshots/stax/test_sign_short_raw_msg/00002.png new file mode 100644 index 0000000000000000000000000000000000000000..78bbaaf73f8284e38b5e4bb9ff97e8af5b0e774b GIT binary patch literal 8440 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 N%+0JX)n9N={5R*mQaS(t literal 0 HcmV?d00001 diff --git a/tests/snapshots/stax/test_sign_short_raw_msg/00003.png b/tests/snapshots/stax/test_sign_short_raw_msg/00003.png new file mode 100644 index 0000000000000000000000000000000000000000..c1a8fd4eb09009370b79a8e7d92355e84bad3426 GIT binary patch literal 5084 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 Date: Tue, 13 Feb 2024 14:05:22 +0200 Subject: [PATCH 28/32] Add validation for Aptos BIP32 path --- src/address.c | 19 +++++++++++++++++++ src/address.h | 13 +++++++++++++ src/handler/get_public_key.c | 6 ++++++ src/handler/sign_tx.c | 6 ++++++ 4 files changed, 44 insertions(+) diff --git a/src/address.c b/src/address.c index 4d0c98e..c13eb30 100644 --- a/src/address.c +++ b/src/address.c @@ -57,3 +57,22 @@ bool address_from_pubkey(const uint8_t public_key[static 32], uint8_t *out, size return true; } + +bool validate_aptos_bip32_path(const uint32_t *path, size_t path_len) { + // m/purpose'/coin_type'/account'/change/address_index + // m/44' /637' /0' /0' /0' + const uint32_t aptos_prefix[2] = {0x8000002C, 0x8000027D}; + + // A 3-element HD path limit (`m/44'/637'/x'`) is enforced for: + // 1. BIP44 compliance, ensuring proper structure (`m/44'/637'` - purpose and coin type). + // 2. Operational flexibility, allowing basic account-level (`x'`) fund segregation. + // 3. A balance between security and usability, preventing the potential privacy and security + // risks associated with using an overly simple path (e.g., `m/44'/637'`), while not + // requiring the full 5-element path that may be unnecessary for users seeking + // straightforward wallet functionality. + if (path_len < 3) { + return false; + } + + return memcmp(path, aptos_prefix, sizeof(aptos_prefix)) == 0; +} diff --git a/src/address.h b/src/address.h index e676996..c81bc8b 100644 --- a/src/address.h +++ b/src/address.h @@ -21,3 +21,16 @@ * */ bool address_from_pubkey(const uint8_t public_key[static 32], uint8_t *out, size_t out_len); + +/** + * Validates BIP32 derivation path for Aptos. + * + * @param[in] path + * Pointer to an array of uint32_t representing the BIP32 path. + * @param[in] path_len + * The number of elements in the `path` array. Must be at least 3 for the function to succeed. + * + * @return true if success, false otherwise. + * + */ +bool validate_aptos_bip32_path(const uint32_t *path, size_t path_len); diff --git a/src/handler/get_public_key.c b/src/handler/get_public_key.c index f163e43..b0bdcf9 100644 --- a/src/handler/get_public_key.c +++ b/src/handler/get_public_key.c @@ -30,6 +30,7 @@ #include "../types.h" #include "../sw.h" #include "../crypto.h" +#include "../address.h" #include "../ui/display.h" #include "../helper/send_response.h" @@ -46,6 +47,11 @@ int handler_get_public_key(buffer_t *cdata, bool display) { return io_send_sw(SW_WRONG_DATA_LENGTH); } + if (!validate_aptos_bip32_path(G_context.bip32_path, G_context.bip32_path_len)) { + G_context.req_type = REQUEST_UNDEFINED; + return io_send_sw(SW_GET_PUB_KEY_FAIL); + } + // derive private key according to BIP32 path cx_err_t error = crypto_derive_private_key(&private_key, G_context.pk_info.chain_code, diff --git a/src/handler/sign_tx.c b/src/handler/sign_tx.c index df41375..2850752 100644 --- a/src/handler/sign_tx.c +++ b/src/handler/sign_tx.c @@ -28,6 +28,7 @@ #include "../sw.h" #include "../globals.h" #include "../crypto.h" +#include "../address.h" #include "../ui/display.h" #include "../transaction/types.h" #include "../transaction/deserialize.h" @@ -50,6 +51,11 @@ int handler_sign_tx(buffer_t *cdata, uint8_t chunk, bool more) { return io_send_sw(SW_WRONG_DATA_LENGTH); } + if (!validate_aptos_bip32_path(G_context.bip32_path, G_context.bip32_path_len)) { + G_context.req_type = REQUEST_UNDEFINED; + return io_send_sw(SW_GET_PUB_KEY_FAIL); + } + return io_send_sw(SW_OK); } else { // parse transaction if (G_context.req_type != CONFIRM_TRANSACTION) { From ae9f33aaf505901134879fe9ecb64e9746585062 Mon Sep 17 00:00:00 2001 From: vldmkr Date: Tue, 13 Feb 2024 15:27:21 +0200 Subject: [PATCH 29/32] Fix fuzzer --- fuzzing/extra/TxParser.cmake | 19 ++++++++++++------- fuzzing/fuzz_tx_parser.cc | 8 +++++--- 2 files changed, 17 insertions(+), 10 deletions(-) diff --git a/fuzzing/extra/TxParser.cmake b/fuzzing/extra/TxParser.cmake index 221d127..74f2fa6 100644 --- a/fuzzing/extra/TxParser.cmake +++ b/fuzzing/extra/TxParser.cmake @@ -11,20 +11,25 @@ set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -Werror -Wall -Wextra -Wno-unused-function -DFUZZ -pedantic -g -O0" ) +set(BOLOS_SDK $ENV{BOLOS_SDK}) + add_library(txparser SHARED ${CMAKE_CURRENT_SOURCE_DIR}/../src/bcs/init.c ${CMAKE_CURRENT_SOURCE_DIR}/../src/bcs/decoder.c ${CMAKE_CURRENT_SOURCE_DIR}/../src/bcs/utf8.c - ${CMAKE_CURRENT_SOURCE_DIR}/../src/common/bip32.c - ${CMAKE_CURRENT_SOURCE_DIR}/../src/common/varint.c - ${CMAKE_CURRENT_SOURCE_DIR}/../src/common/read.c - ${CMAKE_CURRENT_SOURCE_DIR}/../src/common/write.c - ${CMAKE_CURRENT_SOURCE_DIR}/../src/common/buffer.c - ${CMAKE_CURRENT_SOURCE_DIR}/../src/common/format.c ${CMAKE_CURRENT_SOURCE_DIR}/../src/transaction/utils.c ${CMAKE_CURRENT_SOURCE_DIR}/../src/transaction/deserialize.c + ${BOLOS_SDK}/lib_standard_app/format.c + ${BOLOS_SDK}/lib_standard_app/buffer.c + ${BOLOS_SDK}/lib_standard_app/varint.c + ${BOLOS_SDK}/lib_standard_app/read.c + ${BOLOS_SDK}/lib_standard_app/write.c + ${BOLOS_SDK}/lib_standard_app/bip32.c ) set_target_properties(txparser PROPERTIES SOVERSION 1) -target_include_directories(txparser PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../src) +target_include_directories(txparser PUBLIC + ${CMAKE_CURRENT_SOURCE_DIR}/../src + ${BOLOS_SDK}/lib_standard_app +) diff --git a/fuzzing/fuzz_tx_parser.cc b/fuzzing/fuzz_tx_parser.cc index df4bf5c..7694597 100644 --- a/fuzzing/fuzz_tx_parser.cc +++ b/fuzzing/fuzz_tx_parser.cc @@ -5,13 +5,15 @@ extern "C" { #include "bcs/init.h" -#include "common/buffer.h" -#include "common/format.h" +#include "buffer.h" +#include "format.h" #include "transaction/deserialize.h" #include "transaction/utils.h" #include "transaction/types.h" } +#define DEBUG 0 + extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { buffer_t buf = {.ptr = data, .size = size, .offset = 0}; transaction_t tx; @@ -21,7 +23,7 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { transaction_init(&tx); status = transaction_deserialize(&buf, &tx); - if (status == PARSING_OK && tx.tx_variant == TX_RAW && + if (DEBUG && status == PARSING_OK && tx.tx_variant == TX_RAW && tx.payload_variant == PAYLOAD_ENTRY_FUNCTION) { printf("\nTransaction size: %lu\n", size); printf("chain_id: %d\n", tx.chain_id); From 57e4c93462810e2642198f6d626af0a7447ba059 Mon Sep 17 00:00:00 2001 From: vldmkr Date: Tue, 13 Feb 2024 15:30:53 +0200 Subject: [PATCH 30/32] Delete the commented code --- src/bcs/decoder.c | 89 ----------------------------------------------- src/bcs/utf8.c | 1 - 2 files changed, 90 deletions(-) diff --git a/src/bcs/decoder.c b/src/bcs/decoder.c index 3a78607..fb42c98 100644 --- a/src/bcs/decoder.c +++ b/src/bcs/decoder.c @@ -225,92 +225,3 @@ bool bcs_read_type_tag_fixed(buffer_t *buffer, type_tag_t *ty_val) { return false; } } - -/* TODO: optimize memory handling before use -bool bcs_read_type_tag_vector(buffer_t *buffer, type_tag_t *vector_val) { - if (!bcs_read_u32_from_uleb128(buffer, (uint32_t *) vector_val->size)) { - return false; - } - vector_val->value = (type_tag_t *) malloc(sizeof(type_tag_t) * vector_val->size); - for (size_t i = 0; i < vector_val->size; i++) { - if (!bcs_read_u32_from_uleb128(buffer, (uint32_t *) (*(type_tag_t *) -vector_val->value).type_tag)) { return false; - } - if ((*(type_tag_t *) vector_val->value).type_tag < TYPE_TAG_VECTOR) { - if (!bcs_read_type_tag_fixed(buffer, &(*(type_tag_t *) vector_val->value))) { - return false; - } - } else if ((*(type_tag_t *) vector_val->value).type_tag == TYPE_TAG_VECTOR) { - if (!bcs_read_type_tag_vector(buffer, &(*(type_tag_t *) vector_val->value))) { - return false; - } - } else if ((*(type_tag_t *) vector_val->value).type_tag == TYPE_TAG_STRUCT) { - (*(type_tag_t *) vector_val->value).size = sizeof(type_tag_struct_t); - (*(type_tag_t *) vector_val->value).value = (type_tag_struct_t *) -malloc(sizeof(type_tag_struct_t)); type_tag_struct_init((*(type_tag_t *) vector_val->value).value); - - if (!bcs_read_type_tag_struct(buffer, (*(type_tag_t *) vector_val->value).value)) { - return false; - } - } - } - return true; -} -*/ - -/* TODO: optimize memory handling before use -bool bcs_read_type_tag_struct(buffer_t *buffer, type_tag_struct_t *ty_struct) { - if (!bcs_read_fixed_bytes(buffer, (uint8_t *) &ty_struct->address, ADDRESS_LEN)) { - return false; - } - if (!bcs_read_u32_from_uleb128(buffer, (uint32_t *) &ty_struct->module_name.len)) { - return false; - } - ty_struct->module_name.bytes = (uint8_t *) malloc(sizeof(uint8_t) * ty_struct->module_name.len); - if (!bcs_read_fixed_bytes(buffer, (uint8_t *) &ty_struct->module_name.bytes, -ty_struct->module_name.len)) { return false; - } - if (!bcs_read_u32_from_uleb128(buffer, (uint32_t *) &ty_struct->name.len)) { - return false; - } - ty_struct->name.bytes = (uint8_t *) malloc(sizeof(uint8_t) * ty_struct->name.len); - if (!bcs_read_fixed_bytes(buffer, (uint8_t *) &ty_struct->name.bytes, ty_struct->name.len)) { - return false; - } - if (!bcs_read_u32_from_uleb128(buffer, (uint32_t *) &ty_struct->type_args_size)) { - return false; - } - if (ty_struct->type_args_size > 0) { - ty_struct->type_args = (type_tag_t *) malloc(sizeof(type_tag_t) * -ty_struct->type_args_size); for (size_t i = 0; i < ty_struct->type_args_size; i++) { - ty_struct->type_args[i].type_tag = 0; - ty_struct->type_args[i].size = 0; - ty_struct->type_args[i].value = NULL; - - if (!bcs_read_u32_from_uleb128(buffer, (uint32_t *) &ty_struct->type_args[i].type_tag)) -{ return false; - } - if (ty_struct->type_args[i].type_tag < TYPE_TAG_VECTOR) { - if (!bcs_read_type_tag_fixed(buffer, (type_tag_t *) &ty_struct->type_args[i].value)) -{ return false; - } - } else if (ty_struct->type_args[i].type_tag == TYPE_TAG_VECTOR) { - if (!bcs_read_type_tag_vector(buffer, &ty_struct->type_args[i])) { - return false; - } - } else if (ty_struct->type_args[i].type_tag == TYPE_TAG_STRUCT) { - ty_struct->type_args[i].size = sizeof(type_tag_struct_t); - ty_struct->type_args[i].value = (type_tag_struct_t *) -malloc(sizeof(type_tag_struct_t)); type_tag_struct_init(ty_struct->type_args[i].value); - - if (!bcs_read_type_tag_struct(buffer, ty_struct->type_args[i].value)) { - return false; - } - } else { - return false; - } - } - } - return true; -} -*/ diff --git a/src/bcs/utf8.c b/src/bcs/utf8.c index bc486f0..b19aef1 100644 --- a/src/bcs/utf8.c +++ b/src/bcs/utf8.c @@ -79,7 +79,6 @@ int try_utf8_to_ascii(const uint8_t *in, return -1; } } - // out[out_len++] = '\0'; if (out_is_utf8) { *out_is_utf8 = is_utf8; From a8b8ffa468b9ff601c7008266d4dc8e8603a0bb4 Mon Sep 17 00:00:00 2001 From: vldmkr Date: Tue, 13 Feb 2024 22:13:45 +0200 Subject: [PATCH 31/32] Add fixes: - Fix clang static analyzer warnings - Fix formatting - Disable blind signing after passing the test that activated it --- src/transaction/deserialize.c | 10 ++++++---- src/ui/bagl_display.c | 11 ++++++----- src/ui/nbgl_display_message.c | 11 ++++++----- tests/test_sign_cmd.py | 30 +++++++++++++++++++++++++++--- 4 files changed, 45 insertions(+), 17 deletions(-) diff --git a/src/transaction/deserialize.c b/src/transaction/deserialize.c index dbad298..bb6e79a 100644 --- a/src/transaction/deserialize.c +++ b/src/transaction/deserialize.c @@ -24,8 +24,11 @@ parser_status_e transaction_deserialize(buffer_t *buf, transaction_t *tx) { case TX_RAW: return tx_raw_deserialize(buf, tx); case TX_RAW_WITH_DATA: - case TX_MESSAGE: + break; case TX_RAW_MESSAGE: + break; // Since the raw message is processed before display without direct transaction + // buffer reads, null-termination concerns are mitigated. + case TX_MESSAGE: // To make sure the message is a null-terminated string if (buf->size == MAX_TRANSACTION_LEN && buf->ptr[MAX_TRANSACTION_LEN - 1] != 0) { return WRONG_LENGTH_ERROR; @@ -132,9 +135,8 @@ parser_status_e tx_variant_deserialize(buffer_t *buf, transaction_t *tx) { buf->offset = 0; // Try to display the message as UTF8 if possible - tx->tx_variant = transaction_utils_check_encoding(buf->ptr, buf->size) - ? TX_MESSAGE - : TX_RAW_MESSAGE; + tx->tx_variant = + transaction_utils_check_encoding(buf->ptr, buf->size) ? TX_MESSAGE : TX_RAW_MESSAGE; return PARSING_OK; } diff --git a/src/ui/bagl_display.c b/src/ui/bagl_display.c index 7196060..c9484e7 100644 --- a/src/ui/bagl_display.c +++ b/src/ui/bagl_display.c @@ -414,13 +414,14 @@ int ui_display_raw_message() { memset(g_struct, 0, sizeof(g_struct)); const bool short_enough = sizeof(g_struct) >= 2 * G_context.tx_info.raw_tx_len + 1; if (short_enough) { - format_hex(G_context.tx_info.raw_tx, G_context.tx_info.raw_tx_len, - g_struct, sizeof(g_struct)); + format_hex(G_context.tx_info.raw_tx, + G_context.tx_info.raw_tx_len, + g_struct, + sizeof(g_struct)); } else { const size_t cropped_bytes_len = (sizeof(g_struct) - sizeof(DOTS)) / 2; - format_hex(G_context.tx_info.raw_tx, cropped_bytes_len, - g_struct, sizeof(g_struct)); - strcpy(g_struct + cropped_bytes_len * 2, DOTS); + format_hex(G_context.tx_info.raw_tx, cropped_bytes_len, g_struct, sizeof(g_struct)); + strncpy(g_struct + cropped_bytes_len * 2, DOTS, sizeof(DOTS)); } PRINTF("Message: %s\n", g_struct); diff --git a/src/ui/nbgl_display_message.c b/src/ui/nbgl_display_message.c index a7bb416..d04d1cb 100755 --- a/src/ui/nbgl_display_message.c +++ b/src/ui/nbgl_display_message.c @@ -111,13 +111,14 @@ int ui_display_raw_message() { memset(g_struct, 0, sizeof(g_struct)); const bool short_enough = sizeof(g_struct) >= 2 * G_context.tx_info.raw_tx_len + 1; if (short_enough) { - format_hex(G_context.tx_info.raw_tx, G_context.tx_info.raw_tx_len, - g_struct, sizeof(g_struct)); + format_hex(G_context.tx_info.raw_tx, + G_context.tx_info.raw_tx_len, + g_struct, + sizeof(g_struct)); } else { const size_t cropped_bytes_len = (sizeof(g_struct) - sizeof(DOTS)) / 2; - format_hex(G_context.tx_info.raw_tx, cropped_bytes_len, - g_struct, sizeof(g_struct)); - strcpy(g_struct + cropped_bytes_len * 2, DOTS); + format_hex(G_context.tx_info.raw_tx, cropped_bytes_len, g_struct, sizeof(g_struct)); + strncpy(g_struct + cropped_bytes_len * 2, DOTS, sizeof(DOTS)); } if (!short_enough) { diff --git a/tests/test_sign_cmd.py b/tests/test_sign_cmd.py index 529b2a9..7c9b663 100644 --- a/tests/test_sign_cmd.py +++ b/tests/test_sign_cmd.py @@ -3,11 +3,35 @@ from application_client.aptos_command_sender import AptosCommandSender, Errors from application_client.aptos_response_unpacker import unpack_get_public_key_response, unpack_sign_tx_response from ragger.error import ExceptionRAPDU -from ragger.navigator import NavInsID +from ragger.navigator import NavInsID, NavIns from utils import ROOT_SCREENSHOT_PATH, check_signature_validity # In this tests we check the behavior of the device when asked to sign a transaction +# This fixture is used to disable the blind signing after a test that enabled it +@pytest.fixture +def disable_blind_signing(firmware, backend, navigator): + yield + + if firmware.device.startswith("nano"): + backend.right_click() + backend.both_click() + backend.right_click() + backend.both_click() + backend.left_click() + backend.both_click() + backend.right_click() + backend.both_click() + else: + instructions = [ + NavInsID.USE_CASE_HOME_SETTINGS, + NavInsID.USE_CASE_SETTINGS_NEXT, + NavIns(NavInsID.TOUCH, (200, 113)), + NavInsID.USE_CASE_CHOICE_REJECT, + NavInsID.USE_CASE_SETTINGS_MULTI_PAGE_EXIT + ] + navigator.navigate(instructions, screen_change_before_first_instruction=False) + # 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 @@ -53,7 +77,7 @@ def test_sign_tx_short_tx(firmware, backend, navigator, test_name): # In this test we send to the device a transaction to sign and validate it on screen # The transaction will be sent in multiple chunks # Also, this transaction has a request for blind signing activation -def test_blind_sign_tx_long_tx(firmware, backend, navigator, test_name): +def test_blind_sign_tx_long_tx(firmware, backend, navigator, test_name, disable_blind_signing): # Use the app interface instead of raw interface client = AptosCommandSender(backend) path: str = "m/44'/637'/1'/0'/0'" @@ -211,7 +235,7 @@ def test_sign_short_raw_msg(firmware, backend, navigator, test_name): # In this test we send to the device a message to sign and validate it on screen # We will ensure that the displayed information is correct by using screenshots comparison -def test_sign_long_raw_msg(firmware, backend, navigator, test_name): +def test_sign_long_raw_msg(firmware, backend, navigator, test_name, disable_blind_signing): # Use the app interface instead of raw interface client = AptosCommandSender(backend) # The path used for this entire test From e9c6a41c3125239b0279fe3df233f19a4bb25b7f Mon Sep 17 00:00:00 2001 From: Sarah Gliner <105934250+sgliner-ledger@users.noreply.github.com> Date: Tue, 27 Feb 2024 17:24:53 +0100 Subject: [PATCH 32/32] [auto] Update screenshot --- .github/PULL_REQUEST_TEMPLATE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 98b720f..f2fb620 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -4,5 +4,5 @@ - [ ] Target branch is `develop` - [ ] Application version has been bumped -