From 02cdc23751ac53200c93e97f1a17b461149af28c Mon Sep 17 00:00:00 2001 From: Francois Beutin Date: Fri, 30 Jun 2023 14:05:46 +0200 Subject: [PATCH 1/6] Rename called_from_swap to G_called_from_swap --- src/eth_plugin_handler.c | 2 +- src/handle_swap_sign_transaction.c | 2 +- src/main.c | 4 ++-- src/shared_context.h | 2 +- src_features/getEth2PublicKey/cmd_getEth2PublicKey.c | 2 +- src_features/getPublicKey/cmd_getPublicKey.c | 2 +- src_features/signTx/logic_signTx.c | 12 ++++++------ src_features/signTx/ui_common_signTx.c | 2 +- 8 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/eth_plugin_handler.c b/src/eth_plugin_handler.c index 29e965f..8baa253 100644 --- a/src/eth_plugin_handler.c +++ b/src/eth_plugin_handler.c @@ -149,7 +149,7 @@ eth_plugin_result_t eth_plugin_perform_init(uint8_t *contractAddress, } // Do not handle a plugin if running in swap mode - if (called_from_swap && (contractAddress != NULL)) { + if (G_called_from_swap && (contractAddress != NULL)) { PRINTF("eth_plug_init aborted in swap mode\n"); return 0; } diff --git a/src/handle_swap_sign_transaction.c b/src/handle_swap_sign_transaction.c index 3a7fcd0..ddb32ec 100644 --- a/src/handle_swap_sign_transaction.c +++ b/src/handle_swap_sign_transaction.c @@ -54,7 +54,7 @@ bool copy_transaction_parameters(create_transaction_parameters_t* sign_transacti void handle_swap_sign_transaction(chain_config_t* config) { chainConfig = config; reset_app_context(); - called_from_swap = true; + G_called_from_swap = true; io_seproxyhal_init(); if (N_storage.initialized != 0x01) { diff --git a/src/main.c b/src/main.c index 6967042..b11b39d 100644 --- a/src/main.c +++ b/src/main.c @@ -52,7 +52,7 @@ cx_sha3_t global_sha3; uint8_t appState; uint16_t apdu_response_code; -bool called_from_swap; +bool G_called_from_swap; pluginType_t pluginType; #ifdef HAVE_STARKWARE bool quantumSet; @@ -77,7 +77,7 @@ chain_config_t *chainConfig = NULL; void reset_app_context() { // PRINTF("!!RESET_APP_CONTEXT\n"); appState = APP_STATE_IDLE; - called_from_swap = false; + G_called_from_swap = false; pluginType = OLD_INTERNAL; #ifdef HAVE_STARKWARE quantumSet = false; diff --git a/src/shared_context.h b/src/shared_context.h index c2fc66a..f83320c 100644 --- a/src/shared_context.h +++ b/src/shared_context.h @@ -213,7 +213,7 @@ extern strings_t strings; extern cx_sha3_t global_sha3; extern const internalStorage_t N_storage_real; -extern bool called_from_swap; +extern bool G_called_from_swap; typedef enum { EXTERNAL, // External plugin, set by setExternalPlugin. diff --git a/src_features/getEth2PublicKey/cmd_getEth2PublicKey.c b/src_features/getEth2PublicKey/cmd_getEth2PublicKey.c index 853d834..b1b38d5 100644 --- a/src_features/getEth2PublicKey/cmd_getEth2PublicKey.c +++ b/src_features/getEth2PublicKey/cmd_getEth2PublicKey.c @@ -49,7 +49,7 @@ void handleGetEth2PublicKey(uint8_t p1, unsigned int *tx) { bip32_path_t bip32; - if (!called_from_swap) { + if (!G_called_from_swap) { reset_app_context(); } if ((p1 != P1_CONFIRM) && (p1 != P1_NON_CONFIRM)) { diff --git a/src_features/getPublicKey/cmd_getPublicKey.c b/src_features/getPublicKey/cmd_getPublicKey.c index 07bab1d..bc8bac6 100644 --- a/src_features/getPublicKey/cmd_getPublicKey.c +++ b/src_features/getPublicKey/cmd_getPublicKey.c @@ -16,7 +16,7 @@ void handleGetPublicKey(uint8_t p1, bip32_path_t bip32; cx_ecfp_private_key_t privateKey; - if (!called_from_swap) { + if (!G_called_from_swap) { reset_app_context(); } diff --git a/src_features/signTx/logic_signTx.c b/src_features/signTx/logic_signTx.c index 7d8cd37..f42addf 100644 --- a/src_features/signTx/logic_signTx.c +++ b/src_features/signTx/logic_signTx.c @@ -424,8 +424,8 @@ void finalizeParsing(bool direct) { } // User has just validated a swap but ETH received apdus about a non standard plugin / contract - if (called_from_swap && !use_standard_UI) { - PRINTF("ERR_SILENT_MODE_CHECK_FAILED, called_from_swap\n"); + if (G_called_from_swap && !use_standard_UI) { + PRINTF("ERR_SILENT_MODE_CHECK_FAILED, G_called_from_swap\n"); THROW(ERR_SILENT_MODE_CHECK_FAILED); } @@ -447,7 +447,7 @@ void finalizeParsing(bool direct) { sizeof(displayBuffer), &global_sha3, chainConfig->chainId); - if (called_from_swap) { + if (G_called_from_swap) { // Ensure the values are the same that the ones that have been previously validated if (strcasecmp_workaround(strings.common.fullAddress, displayBuffer) != 0) { PRINTF("ERR_SILENT_MODE_CHECK_FAILED, address check failed\n"); @@ -466,7 +466,7 @@ void finalizeParsing(bool direct) { ticker, displayBuffer, sizeof(displayBuffer)); - if (called_from_swap) { + if (G_called_from_swap) { // Ensure the values are the same that the ones that have been previously validated if (strcmp(strings.common.fullAmount, displayBuffer) != 0) { PRINTF("ERR_SILENT_MODE_CHECK_FAILED, amount check failed\n"); @@ -484,7 +484,7 @@ void finalizeParsing(bool direct) { &tmpContent.txContent.startgas, displayBuffer, sizeof(displayBuffer)); - if (called_from_swap) { + if (G_called_from_swap) { // Ensure the values are the same that the ones that have been previously validated if (strcmp(strings.common.maxFee, displayBuffer) != 0) { PRINTF("ERR_SILENT_MODE_CHECK_FAILED, fees check failed\n"); @@ -510,7 +510,7 @@ void finalizeParsing(bool direct) { // If called from swap, the user as already validated a standard transaction // We have already checked the fields of this transaction above - no_consent_check = called_from_swap && use_standard_UI; + no_consent_check = G_called_from_swap && use_standard_UI; #ifdef NO_CONSENT no_consent_check = true; diff --git a/src_features/signTx/ui_common_signTx.c b/src_features/signTx/ui_common_signTx.c index ef8171f..fec6ca8 100644 --- a/src_features/signTx/ui_common_signTx.c +++ b/src_features/signTx/ui_common_signTx.c @@ -61,7 +61,7 @@ unsigned int io_seproxyhal_touch_tx_ok(__attribute__((unused)) const bagl_elemen G_io_apdu_buffer[tx++] = 0x00; // Send back the response, do not restart the event loop io_exchange(CHANNEL_APDU | IO_RETURN_AFTER_TX, tx); - if (called_from_swap) { + if (G_called_from_swap) { os_sched_exit(0); } reset_app_context(); From 6ec26db05377eb92dda499a6a375fe4183fea443 Mon Sep 17 00:00:00 2001 From: Francois Beutin Date: Fri, 30 Jun 2023 14:06:09 +0200 Subject: [PATCH 2/6] Add Spinner when starting in Swap mode on Stax --- src/handle_swap_sign_transaction.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/handle_swap_sign_transaction.c b/src/handle_swap_sign_transaction.c index ddb32ec..16c8b7f 100644 --- a/src/handle_swap_sign_transaction.c +++ b/src/handle_swap_sign_transaction.c @@ -4,6 +4,9 @@ #include "handle_swap_sign_transaction.h" #include "shared_context.h" #include "utils.h" +#ifdef HAVE_NBGL +#include "utils.h" +#endif // HAVE_NBGL bool copy_transaction_parameters(create_transaction_parameters_t* sign_transaction_params, chain_config_t* config) { @@ -52,6 +55,11 @@ bool copy_transaction_parameters(create_transaction_parameters_t* sign_transacti } void handle_swap_sign_transaction(chain_config_t* config) { + UX_INIT(); +#ifdef HAVE_NBGL + nbgl_useCaseSpinner("Signing"); +#endif // HAVE_NBGL + chainConfig = config; reset_app_context(); G_called_from_swap = true; @@ -67,13 +75,6 @@ void handle_swap_sign_transaction(chain_config_t* config) { nvm_write((void*) &N_storage, (void*) &storage, sizeof(internalStorage_t)); } -#ifdef HAVE_BAGL - UX_INIT(); -#endif // HAVE_BAGL -#ifdef HAVE_NBGL - nbgl_objInit(); -#endif // HAVE_NBGL - USB_power(0); USB_power(1); // ui_idle(); From 8082bd7f8b936c534de6f0694652323f235a9fa5 Mon Sep 17 00:00:00 2001 From: Francois Beutin Date: Fri, 30 Jun 2023 17:47:22 +0200 Subject: [PATCH 3/6] Return in Exchange after a successful swap --- src/handle_swap_sign_transaction.c | 15 +++++- src/handle_swap_sign_transaction.h | 5 +- src/swap_lib_calls.h | 74 +++++++++++++++----------- src_features/signTx/ui_common_signTx.c | 15 +++++- 4 files changed, 73 insertions(+), 36 deletions(-) diff --git a/src/handle_swap_sign_transaction.c b/src/handle_swap_sign_transaction.c index 16c8b7f..604b8a2 100644 --- a/src/handle_swap_sign_transaction.c +++ b/src/handle_swap_sign_transaction.c @@ -5,9 +5,12 @@ #include "shared_context.h" #include "utils.h" #ifdef HAVE_NBGL -#include "utils.h" +#include "nbgl_use_case.h" #endif // HAVE_NBGL +// Save the BSS address where we will write the return value when finished +static uint8_t* G_swap_sign_return_value_address; + bool copy_transaction_parameters(create_transaction_parameters_t* sign_transaction_params, chain_config_t* config) { // first copy parameters to stack, and then to global data. @@ -49,11 +52,21 @@ bool copy_transaction_parameters(create_transaction_parameters_t* sign_transacti stack_data.maxFee, sizeof(stack_data.maxFee)); + // Full reset the global variables os_explicit_zero_BSS_segment(); + // Keep the address at which we'll reply the signing status + G_swap_sign_return_value_address = &sign_transaction_params->result; + // Commit the values read from exchange to the clean global space + memcpy(&strings.common, &stack_data, sizeof(stack_data)); return true; } +void __attribute__((noreturn)) finalize_exchange_sign_transaction(bool is_success) { + *G_swap_sign_return_value_address = is_success; + os_lib_end(); +} + void handle_swap_sign_transaction(chain_config_t* config) { UX_INIT(); #ifdef HAVE_NBGL diff --git a/src/handle_swap_sign_transaction.h b/src/handle_swap_sign_transaction.h index 21b52c3..d34a6d8 100644 --- a/src/handle_swap_sign_transaction.h +++ b/src/handle_swap_sign_transaction.h @@ -1,5 +1,4 @@ -#ifndef _HANDLE_SWAP_SIGN_TRANSACTION_H_ -#define _HANDLE_SWAP_SIGN_TRANSACTION_H_ +#pragma once #include "swap_lib_calls.h" #include "chainConfig.h" @@ -9,4 +8,4 @@ bool copy_transaction_parameters(create_transaction_parameters_t* sign_transacti void handle_swap_sign_transaction(chain_config_t* config); -#endif // _HANDLE_SWAP_SIGN_TRANSACTION_H_ \ No newline at end of file +void __attribute__((noreturn)) finalize_exchange_sign_transaction(bool is_success); diff --git a/src/swap_lib_calls.h b/src/swap_lib_calls.h index 4fd0284..2870347 100644 --- a/src/swap_lib_calls.h +++ b/src/swap_lib_calls.h @@ -1,9 +1,15 @@ -#ifndef _SWAP_LIB_CALLS_H_ -#define _SWAP_LIB_CALLS_H_ +#pragma once + +/* This file is the shared API between Exchange and the apps started in Library mode for Exchange + * + * DO NOT MODIFY THIS FILE IN APPLICATIONS OTHER THAN EXCHANGE + * On modification in Exchange, forward the changes to all applications supporting Exchange + */ #include "stdbool.h" #include "chainConfig.h" #include "shared_context.h" +#include "stdint.h" #define RUN_APPLICATION 1 @@ -13,19 +19,27 @@ #define GET_PRINTABLE_AMOUNT 4 +/* + * Amounts are stored as bytes, with a max size of 16 (see protobuf + * specifications). Max 16B integer is 340282366920938463463374607431768211455 + * in decimal, which is a 32-long char string. + * The printable amount also contains spaces, the ticker symbol (with variable + * size, up to 12 in Ethereum for instance) and a terminating null byte, so 50 + * bytes total should be a fair maximum. + */ #define MAX_PRINTABLE_AMOUNT_SIZE 50 // structure that should be send to specific coin application to get address typedef struct check_address_parameters_s { // IN - const unsigned char* const coin_configuration; - const unsigned char coin_configuration_length; + uint8_t *coin_configuration; + uint8_t coin_configuration_length; // serialized path, segwit, version prefix, hash used, dictionary etc. - // fields and serialization format depends on spesific coin app - const unsigned char* const address_parameters; - const unsigned char address_parameters_length; - const char* const address_to_check; - const char* const extra_id_to_check; + // fields and serialization format depends on specific coin app + uint8_t *address_parameters; + uint8_t address_parameters_length; + char *address_to_check; + char *extra_id_to_check; // OUT int result; } check_address_parameters_t; @@ -33,37 +47,37 @@ typedef struct check_address_parameters_s { // structure that should be send to specific coin application to get printable amount typedef struct get_printable_amount_parameters_s { // IN - const unsigned char* const coin_configuration; - const unsigned char coin_configuration_length; - const unsigned char* const amount; - const unsigned char amount_length; - const bool is_fee; + uint8_t *coin_configuration; + uint8_t coin_configuration_length; + uint8_t *amount; + uint8_t amount_length; + bool is_fee; // OUT char printable_amount[MAX_PRINTABLE_AMOUNT_SIZE]; - // int result; } get_printable_amount_parameters_t; typedef struct create_transaction_parameters_s { - const unsigned char* const coin_configuration; - const unsigned char coin_configuration_length; - const unsigned char* const amount; - const unsigned char amount_length; - const unsigned char* const fee_amount; - const unsigned char fee_amount_length; - const char* const destination_address; - const char* const destination_address_extra_id; + // IN + uint8_t *coin_configuration; + uint8_t coin_configuration_length; + uint8_t *amount; + uint8_t amount_length; + uint8_t *fee_amount; + uint8_t fee_amount_length; + char *destination_address; + char *destination_address_extra_id; + // OUT + uint8_t result; } create_transaction_parameters_t; typedef struct libargs_s { unsigned int id; unsigned int command; - chain_config_t* chain_config; + chain_config_t *chain_config; union { - check_address_parameters_t* check_address; - create_transaction_parameters_t* create_transaction; - get_printable_amount_parameters_t* get_printable_amount; - caller_app_t* caller_app; + check_address_parameters_t *check_address; + create_transaction_parameters_t *create_transaction; + get_printable_amount_parameters_t *get_printable_amount; + caller_app_t *caller_app; }; } libargs_t; - -#endif // _SWAP_LIB_CALLS_H_ diff --git a/src_features/signTx/ui_common_signTx.c b/src_features/signTx/ui_common_signTx.c index fec6ca8..e57bb21 100644 --- a/src_features/signTx/ui_common_signTx.c +++ b/src_features/signTx/ui_common_signTx.c @@ -2,12 +2,14 @@ #include "shared_context.h" #include "utils.h" #include "common_ui.h" +#include "handle_swap_sign_transaction.h" unsigned int io_seproxyhal_touch_tx_ok(__attribute__((unused)) const bagl_element_t *e) { uint8_t privateKeyData[INT256_LENGTH]; uint8_t signature[100]; cx_ecfp_private_key_t privateKey; uint32_t tx = 0; + int err; io_seproxyhal_io_heartbeat(); os_perso_derive_node_bip32(CX_CURVE_256K1, tmpCtx.transactionContext.bip32.path, @@ -59,10 +61,19 @@ unsigned int io_seproxyhal_touch_tx_ok(__attribute__((unused)) const bagl_elemen tx = 65; G_io_apdu_buffer[tx++] = 0x90; G_io_apdu_buffer[tx++] = 0x00; + // Send back the response, do not restart the event loop - io_exchange(CHANNEL_APDU | IO_RETURN_AFTER_TX, tx); + err = io_exchange(CHANNEL_APDU | IO_RETURN_AFTER_TX, tx); if (G_called_from_swap) { - os_sched_exit(0); + PRINTF("G_called_from_swap\n"); + + // If we are in swap mode and have validated a TX, we send it and immediately quit + if (err == 0) { + finalize_exchange_sign_transaction(true); + } else { + PRINTF("Unrecoverable\n"); + os_sched_exit(-1); + } } reset_app_context(); // Display back the original UX From f26edc2fefed8846668393324c847c7f57d63eea Mon Sep 17 00:00:00 2001 From: Francois Beutin Date: Tue, 4 Jul 2023 15:00:31 +0200 Subject: [PATCH 4/6] Update LNX snapshots on ragger tests --- .../nanox/domain_name_non_mainnet/00004.png | Bin 436 -> 434 bytes .../nanox/domain_name_non_mainnet/00006.png | Bin 382 -> 381 bytes .../nanox/domain_name_verbose_False/00003.png | Bin 436 -> 434 bytes .../nanox/domain_name_verbose_False/00005.png | Bin 382 -> 381 bytes .../nanox/domain_name_verbose_True/00004.png | Bin 436 -> 434 bytes .../nanox/domain_name_verbose_True/00006.png | Bin 382 -> 381 bytes .../nanox/domain_name_wrong_addr/00003.png | Bin 436 -> 434 bytes .../nanox/domain_name_wrong_addr/00005.png | Bin 382 -> 381 bytes 8 files changed, 0 insertions(+), 0 deletions(-) diff --git a/tests/ragger/snapshots/nanox/domain_name_non_mainnet/00004.png b/tests/ragger/snapshots/nanox/domain_name_non_mainnet/00004.png index 70c1b9a68f5fb1ee090966199cb58a891b0a5ad4..1bcb78761fd15fd94377813eb932cf0245af596a 100644 GIT binary patch delta 408 zcmV;J0cZZS1F{2F1DKvCMsPT2pF*h@b=W(ZFuMUoTW^X0)U z5P@Z^5C8xG0CPX~L#C9Dix}gmPPWA(+<9tS61s_m_1%cLUPPW6M&rla%w{Fpx} z&q;1cE+k_ue}BamS1iWeiu#wZ@IhAHWpZsY49Y1;eF22C?^eyUElY3RSJYnjO+jr~ z?MtEIwhQ1A>#jNlZJ*he!(1-em#4B!7EJL_t(|obA|Al7k=&fML4Rn{fXlahH8?WLOd)Z3)=*|DGJQ zK!Zk12mk;8z;ciEL#C9DgBWA0}S2_?g`BFMRCt|E^k7p52;f#)qiyEnvQjTW+VcCz`SPts&Z+`}^n1bXp5zc$RwI2DJ zs)w>GwXr(8ehs!QK$T47of{gFdUce1+{#_m=!@52a|*JD_@#wWgV>4euKW`&n1aew zlc_K2e#okRj*HdCy)R(^0Dyb)t%mjsFJ)u(#U!_boi9~+YS_}L$jYgH@!quc#nj*C zcgk~?Q&akt|BC2V|zj4-;J5hht#0pj z^#9@1sLK;CE54XuefJROGCRgZUbWXBk9~WeThLU0Q`4iWuO>iVr1K`D#hTWitG2LJbl{xH#~Rq+?=K-+vfC})E&6F z@5lAeSDtRMVcZx!aqGa5zhIs*He8&r_HtpZV5M#|^ ydh?e5zlAMgw-$Yhy2~hY*m8O9PiA<4-2TmASuS-mz3kmhkeH{dpUXO@geCwORjDih delta 355 zcmV-p0i6E*0{#M!B!5LoL_t(|obB0Lj>8}fKv7h6C+vSo*-Jl=BFejIj2*b=t7QrS z431!&0{{R30000000000t2mD1&x+StxcuCugjtw2gZ3x=t=)mIIr82&3gasIFTM9k ztvJ}>Yq8eI6W5XNfa2$NVK)~Iw$m+~VCoJy*I=?9Z*2eG27f1*or0w2C%&Rd-3tH!000000001BFCQGdAO*0P-ogL?002ovPDHLkV1g;M BtF1DKvCMsPT2pF*h@b=W(ZFuMUoTW^X0)U z5P@Z^5C8xG0CPX~L#C9Dix}gmPPWA(+<9tS61s_m_1%cLUPPW6M&rla%w{Fpx} z&q;1cE+k_ue}BamS1iWeiu#wZ@IhAHWpZsY49Y1;eF22C?^eyUElY3RSJYnjO+jr~ z?MtEIwhQ1A>#jNlZJ*he!(1-em#4B!7EJL_t(|obA|Al7k=&fML4Rn{fXlahH8?WLOd)Z3)=*|DGJQ zK!Zk12mk;8z;ciEL#C9DgBWA0}S2_?g`BFMRCt|E^k7p52;f#)qiyEnvQjTW+VcCz`SPts&Z+`}^n1bXp5zc$RwI2DJ zs)w>GwXr(8ehs!QK$T47of{gFdUce1+{#_m=!@52a|*JD_@#wWgV>4euKW`&n1aew zlc_K2e#okRj*HdCy)R(^0Dyb)t%mjsFJ)u(#U!_boi9~+YS_}L$jYgH@!quc#nj*C zcgk~?Q&akt|BC2V|zj4-;J5hht#0pj z^#9@1sLK;CE54XuefJROGCRgZUbWXBk9~WeThLU0Q`4iWuO>iVr1K`D#hTWitG2LJbl{xH#~Rq+?=K-+vfC})E&6F z@5lAeSDtRMVcZx!aqGa5zhIs*He8&r_HtpZV5M#|^ ydh?e5zlAMgw-$Yhy2~hY*m8O9PiA<4-2TmASuS-mz3kmhkeH{dpUXO@geCwORjDih delta 355 zcmV-p0i6E*0{#M!B!5LoL_t(|obB0Lj>8}fKv7h6C+vSo*-Jl=BFejIj2*b=t7QrS z431!&0{{R30000000000t2mD1&x+StxcuCugjtw2gZ3x=t=)mIIr82&3gasIFTM9k ztvJ}>Yq8eI6W5XNfa2$NVK)~Iw$m+~VCoJy*I=?9Z*2eG27f1*or0w2C%&Rd-3tH!000000001BFCQGdAO*0P-ogL?002ovPDHLkV1g;M BtF1DKvCMsPT2pF*h@b=W(ZFuMUoTW^X0)U z5P@Z^5C8xG0CPX~L#C9Dix}gmPPWA(+<9tS61s_m_1%cLUPPW6M&rla%w{Fpx} z&q;1cE+k_ue}BamS1iWeiu#wZ@IhAHWpZsY49Y1;eF22C?^eyUElY3RSJYnjO+jr~ z?MtEIwhQ1A>#jNlZJ*he!(1-em#4B!7EJL_t(|obA|Al7k=&fML4Rn{fXlahH8?WLOd)Z3)=*|DGJQ zK!Zk12mk;8z;ciEL#C9DgBWA0}S2_?g`BFMRCt|E^k7p52;f#)qiyEnvQjTW+VcCz`SPts&Z+`}^n1bXp5zc$RwI2DJ zs)w>GwXr(8ehs!QK$T47of{gFdUce1+{#_m=!@52a|*JD_@#wWgV>4euKW`&n1aew zlc_K2e#okRj*HdCy)R(^0Dyb)t%mjsFJ)u(#U!_boi9~+YS_}L$jYgH@!quc#nj*C zcgk~?Q&akt|BC2V|zj4-;J5hht#0pj z^#9@1sLK;CE54XuefJROGCRgZUbWXBk9~WeThLU0Q`4iWuO>iVr1K`D#hTWitG2LJbl{xH#~Rq+?=K-+vfC})E&6F z@5lAeSDtRMVcZx!aqGa5zhIs*He8&r_HtpZV5M#|^ ydh?e5zlAMgw-$Yhy2~hY*m8O9PiA<4-2TmASuS-mz3kmhkeH{dpUXO@geCwORjDih delta 355 zcmV-p0i6E*0{#M!B!5LoL_t(|obB0Lj>8}fKv7h6C+vSo*-Jl=BFejIj2*b=t7QrS z431!&0{{R30000000000t2mD1&x+StxcuCugjtw2gZ3x=t=)mIIr82&3gasIFTM9k ztvJ}>Yq8eI6W5XNfa2$NVK)~Iw$m+~VCoJy*I=?9Z*2eG27f1*or0w2C%&Rd-3tH!000000001BFCQGdAO*0P-ogL?002ovPDHLkV1g;M BtF1DKvCMsPT2pF*h@b=W(ZFuMUoTW^X0)U z5P@Z^5C8xG0CPX~L#C9Dix}gmPPWA(+<9tS61s_m_1%cLUPPW6M&rla%w{Fpx} z&q;1cE+k_ue}BamS1iWeiu#wZ@IhAHWpZsY49Y1;eF22C?^eyUElY3RSJYnjO+jr~ z?MtEIwhQ1A>#jNlZJ*he!(1-em#4B!7EJL_t(|obA|Al7k=&fML4Rn{fXlahH8?WLOd)Z3)=*|DGJQ zK!Zk12mk;8z;ciEL#C9DgBWA0}S2_?g`BFMRCt|E^k7p52;f#)qiyEnvQjTW+VcCz`SPts&Z+`}^n1bXp5zc$RwI2DJ zs)w>GwXr(8ehs!QK$T47of{gFdUce1+{#_m=!@52a|*JD_@#wWgV>4euKW`&n1aew zlc_K2e#okRj*HdCy)R(^0Dyb)t%mjsFJ)u(#U!_boi9~+YS_}L$jYgH@!quc#nj*C zcgk~?Q&akt|BC2V|zj4-;J5hht#0pj z^#9@1sLK;CE54XuefJROGCRgZUbWXBk9~WeThLU0Q`4iWuO>iVr1K`D#hTWitG2LJbl{xH#~Rq+?=K-+vfC})E&6F z@5lAeSDtRMVcZx!aqGa5zhIs*He8&r_HtpZV5M#|^ ydh?e5zlAMgw-$Yhy2~hY*m8O9PiA<4-2TmASuS-mz3kmhkeH{dpUXO@geCwORjDih delta 355 zcmV-p0i6E*0{#M!B!5LoL_t(|obB0Lj>8}fKv7h6C+vSo*-Jl=BFejIj2*b=t7QrS z431!&0{{R30000000000t2mD1&x+StxcuCugjtw2gZ3x=t=)mIIr82&3gasIFTM9k ztvJ}>Yq8eI6W5XNfa2$NVK)~Iw$m+~VCoJy*I=?9Z*2eG27f1*or0w2C%&Rd-3tH!000000001BFCQGdAO*0P-ogL?002ovPDHLkV1g;M Bt Date: Tue, 4 Jul 2023 15:22:32 +0200 Subject: [PATCH 5/6] Use latest version for Speculos and Ragger --- .github/workflows/ci-workflow.yml | 3 ++- tests/ragger/requirements.txt | 2 +- tests/speculos/README.md | 5 ++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ci-workflow.yml b/.github/workflows/ci-workflow.yml index 4c9118a..d5cf795 100644 --- a/.github/workflows/ci-workflow.yml +++ b/.github/workflows/ci-workflow.yml @@ -128,6 +128,7 @@ jobs: jobs-e2e-speculos-tests: name: Speculos tests strategy: + fail-fast: false matrix: model: ["nanosp", "nanos", "nanox"] @@ -153,7 +154,7 @@ jobs: run: | cd tests/speculos sudo apt-get update && sudo apt-get install -y qemu-user-static - pip install --extra-index-url https://test.pypi.org/simple/ -r requirements.txt + pip install -r requirements.txt - name: Run speculos tests run: | diff --git a/tests/ragger/requirements.txt b/tests/ragger/requirements.txt index 818749b..34213d6 100644 --- a/tests/ragger/requirements.txt +++ b/tests/ragger/requirements.txt @@ -1,4 +1,4 @@ -ragger[speculos]>=1.7.0,<1.8.0 +ragger[speculos] pytest ecdsa simple-rlp diff --git a/tests/speculos/README.md b/tests/speculos/README.md index c3bb346..68d1468 100644 --- a/tests/speculos/README.md +++ b/tests/speculos/README.md @@ -11,9 +11,8 @@ These tests are implemented in Python with the `SpeculosClient` interface which Python dependencies are listed in [requirements.txt](requirements.txt) ```shell -python3 -m pip install --extra-index-url https://test.pypi.org/simple/ -r requirements.txt +python3 -m pip install -r requirements.txt ``` -> The extra index allows to fetch the latest version of Speculos. ## Usage @@ -47,4 +46,4 @@ pytest --model nanox --path ./elfs/nanox.elf # Execute specific test: pytest --model nanox --path ./elfs/nanox.elf test_pubkey_cmd.py -``` \ No newline at end of file +``` From 120052a07a1a3e1594f8f44353a0efcc8ff9ccea Mon Sep 17 00:00:00 2001 From: Francois Beutin Date: Tue, 4 Jul 2023 15:39:05 +0200 Subject: [PATCH 6/6] Split LNX and LNS+ snapshots --- tests/ragger/snapshots/nanosp | 1 - .../nanosp/domain_name_non_mainnet/00000.png | Bin 0 -> 414 bytes .../nanosp/domain_name_non_mainnet/00001.png | Bin 0 -> 368 bytes .../nanosp/domain_name_non_mainnet/00002.png | Bin 0 -> 585 bytes .../nanosp/domain_name_non_mainnet/00003.png | Bin 0 -> 383 bytes .../nanosp/domain_name_non_mainnet/00004.png | Bin 0 -> 436 bytes .../nanosp/domain_name_non_mainnet/00005.png | Bin 0 -> 472 bytes .../nanosp/domain_name_non_mainnet/00006.png | Bin 0 -> 382 bytes .../nanosp/domain_name_verbose_False/00000.png | Bin 0 -> 414 bytes .../nanosp/domain_name_verbose_False/00001.png | Bin 0 -> 368 bytes .../nanosp/domain_name_verbose_False/00002.png | Bin 0 -> 394 bytes .../nanosp/domain_name_verbose_False/00003.png | Bin 0 -> 436 bytes .../nanosp/domain_name_verbose_False/00004.png | Bin 0 -> 472 bytes .../nanosp/domain_name_verbose_False/00005.png | Bin 0 -> 382 bytes .../nanosp/domain_name_verbose_True/00000.png | Bin 0 -> 414 bytes .../nanosp/domain_name_verbose_True/00001.png | Bin 0 -> 368 bytes .../nanosp/domain_name_verbose_True/00002.png | Bin 0 -> 394 bytes .../nanosp/domain_name_verbose_True/00003.png | Bin 0 -> 585 bytes .../nanosp/domain_name_verbose_True/00004.png | Bin 0 -> 436 bytes .../nanosp/domain_name_verbose_True/00005.png | Bin 0 -> 472 bytes .../nanosp/domain_name_verbose_True/00006.png | Bin 0 -> 382 bytes .../nanosp/domain_name_wrong_addr/00000.png | Bin 0 -> 414 bytes .../nanosp/domain_name_wrong_addr/00001.png | Bin 0 -> 368 bytes .../nanosp/domain_name_wrong_addr/00002.png | Bin 0 -> 588 bytes .../nanosp/domain_name_wrong_addr/00003.png | Bin 0 -> 436 bytes .../nanosp/domain_name_wrong_addr/00004.png | Bin 0 -> 472 bytes .../nanosp/domain_name_wrong_addr/00005.png | Bin 0 -> 382 bytes 27 files changed, 1 deletion(-) delete mode 120000 tests/ragger/snapshots/nanosp create mode 100644 tests/ragger/snapshots/nanosp/domain_name_non_mainnet/00000.png create mode 100644 tests/ragger/snapshots/nanosp/domain_name_non_mainnet/00001.png create mode 100644 tests/ragger/snapshots/nanosp/domain_name_non_mainnet/00002.png create mode 100644 tests/ragger/snapshots/nanosp/domain_name_non_mainnet/00003.png create mode 100644 tests/ragger/snapshots/nanosp/domain_name_non_mainnet/00004.png create mode 100644 tests/ragger/snapshots/nanosp/domain_name_non_mainnet/00005.png create mode 100644 tests/ragger/snapshots/nanosp/domain_name_non_mainnet/00006.png create mode 100644 tests/ragger/snapshots/nanosp/domain_name_verbose_False/00000.png create mode 100644 tests/ragger/snapshots/nanosp/domain_name_verbose_False/00001.png create mode 100644 tests/ragger/snapshots/nanosp/domain_name_verbose_False/00002.png create mode 100644 tests/ragger/snapshots/nanosp/domain_name_verbose_False/00003.png create mode 100644 tests/ragger/snapshots/nanosp/domain_name_verbose_False/00004.png create mode 100644 tests/ragger/snapshots/nanosp/domain_name_verbose_False/00005.png create mode 100644 tests/ragger/snapshots/nanosp/domain_name_verbose_True/00000.png create mode 100644 tests/ragger/snapshots/nanosp/domain_name_verbose_True/00001.png create mode 100644 tests/ragger/snapshots/nanosp/domain_name_verbose_True/00002.png create mode 100644 tests/ragger/snapshots/nanosp/domain_name_verbose_True/00003.png create mode 100644 tests/ragger/snapshots/nanosp/domain_name_verbose_True/00004.png create mode 100644 tests/ragger/snapshots/nanosp/domain_name_verbose_True/00005.png create mode 100644 tests/ragger/snapshots/nanosp/domain_name_verbose_True/00006.png create mode 100644 tests/ragger/snapshots/nanosp/domain_name_wrong_addr/00000.png create mode 100644 tests/ragger/snapshots/nanosp/domain_name_wrong_addr/00001.png create mode 100644 tests/ragger/snapshots/nanosp/domain_name_wrong_addr/00002.png create mode 100644 tests/ragger/snapshots/nanosp/domain_name_wrong_addr/00003.png create mode 100644 tests/ragger/snapshots/nanosp/domain_name_wrong_addr/00004.png create mode 100644 tests/ragger/snapshots/nanosp/domain_name_wrong_addr/00005.png diff --git a/tests/ragger/snapshots/nanosp b/tests/ragger/snapshots/nanosp deleted file mode 120000 index da13a6a..0000000 --- a/tests/ragger/snapshots/nanosp +++ /dev/null @@ -1 +0,0 @@ -nanox/ \ No newline at end of file diff --git a/tests/ragger/snapshots/nanosp/domain_name_non_mainnet/00000.png b/tests/ragger/snapshots/nanosp/domain_name_non_mainnet/00000.png new file mode 100644 index 0000000000000000000000000000000000000000..487ea10fcfeb2f3e6b79239459672251d49addd7 GIT binary patch literal 414 zcmV;P0b%}$P)vpO}&+|8}fC)JNq`>?#dJ%s{^>GN_4usXQirk{^@^BA?p!El9&T9q~zMsh2=YdLB`_ONiP zKy6XlUGFZ>Cn7mP3u*fn&`6tH9gqo;^MN#J@G-NZG(W*iG}t#e1Fb- zKV8KTt0a`{lX$B4$~o~B?x*6e)~<@4Iz4h@Jmb~b5&vc;g`2H9{psfXevRGF%X%)F z{W^G1#bn40-weR!F*3L+ubT($m0wc}!uNKw0-sV5H z;CF7g9MJJ=+rKjGEBl+3>A2QyMfKUZ+;mUbm;0)$KRWh$yq((D^ZhGdwuD|?hi~Df z@|&)@8Hr8?_0j7y!?>j6!~H8~TztJ`f#FwsF1bzDbkz>zesQ*DR9hWnx9on|hmN^& zyJ|dM`zN>MP3ZiWI3+;%Z?hr$v=dI#e(*&r?E!in863#FcU<{Z?XiYs!60EzS3j3^ HP6 literal 0 HcmV?d00001 diff --git a/tests/ragger/snapshots/nanosp/domain_name_non_mainnet/00002.png b/tests/ragger/snapshots/nanosp/domain_name_non_mainnet/00002.png new file mode 100644 index 0000000000000000000000000000000000000000..6a5a9d64a202a062cb8bb576a84ba653e232345c GIT binary patch literal 585 zcmV-P0=E5$P)Fdu z__dw@MOS{tr(OJ6PoPLP9@*UxLb&ZA1lC4xvBG!qQ&wg@Ymi`OA5aK9q=YC=*Fi;`yDjPzxkl=%^cJKW8Rm7R%x^V000000G!J| X8HZ1szRqx300000NkvXXu0mjfUbPWB literal 0 HcmV?d00001 diff --git a/tests/ragger/snapshots/nanosp/domain_name_non_mainnet/00003.png b/tests/ragger/snapshots/nanosp/domain_name_non_mainnet/00003.png new file mode 100644 index 0000000000000000000000000000000000000000..93112b3ab44e4f2fda4db252509cc196086ddfe4 GIT binary patch literal 383 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|@9fba4!+nDh2#BHtkep0-4j zdo91^SC)S~p49BHJ!?zqFT4F}f!k|X&9XH?T6cI~>vT=AUa|Gn>9-c2n3T?2l%BQS zJHI32Y~4xS-%MQ{J(o9}-F0o1{_c;TY$hImeCf=`w=R#5oR8(wUdQ0;viM5LE9Xi* zx5AL5KPO65B8nKxj6S`wygYT|{7u*L_w1ovS;^lz1}|X7OvSf z+x3+G0T1WQ@`Ys={_`GvYk(e{b*WT#)t^JoP z;)!4C*^OBcSXHTQ3DBky85}Sb4q9e0CCc*{Qv*} literal 0 HcmV?d00001 diff --git a/tests/ragger/snapshots/nanosp/domain_name_non_mainnet/00004.png b/tests/ragger/snapshots/nanosp/domain_name_non_mainnet/00004.png new file mode 100644 index 0000000000000000000000000000000000000000..70c1b9a68f5fb1ee090966199cb58a891b0a5ad4 GIT binary patch literal 436 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|_8Fba4!+nDh2V;G|{+o`%F- zmuDCJS1z1hTaXeVq>#&b2QSTI5qI}IeE+uQ$d($HH~rmjmfzpG^!&>@vHo;H|A#$&J>60(rv&w- z{Y$*re=CCT)rWkxbu*ft7z>`O-oI7u=d4xjo3yuXwAx+AyG_?&s?U?T(oz$vN~hG^ zITd^LMfdfDVy;c?KbE!zHs9!cv+j?u-i)SGA(L0?zp6X2s;;m5>ao50i9jz_e_Gr2 zjaxr8`Rh@Y?ag!bLo2gxTv~bJ)XKV#_qKdJdgcDJ@>9jrf~PT`jyPOzcvQ5zaQmZw zsyQ_iV&5BC&*W(?<|>M3c>Lz-s+s2Awug&us=u4vloD}$y3^rY@dWQRp`~22>^5u8 z-Wjt=zq~iKakEWo=0=}0$4N$E@I8h8IZK)78&qol`;+03*-H(EtDd literal 0 HcmV?d00001 diff --git a/tests/ragger/snapshots/nanosp/domain_name_non_mainnet/00005.png b/tests/ragger/snapshots/nanosp/domain_name_non_mainnet/00005.png new file mode 100644 index 0000000000000000000000000000000000000000..570ce28d53e82ac396ba25c370110058f3a638f9 GIT binary patch literal 472 zcmV;}0Vn>6P)Nkl`l1;k+@4An6g^M6kcbtxu@7*hfO000000DuchDWw$aQJnB& zJ%BsK3VrpQ1hnYqoNY&PO0WdV>i`7cs)e_@w@x()p@w=B24`klR6(CLpxqtlZO|2 zIWjpO-F~*EHtLqUMt)Wc_@bMv^h#{CUFW0M(vJ1P=5N1GhWcHM(-Xu*&bc@D4_o$^ z7Y|pL)I@*DzttR=&yLH#^{|TW)8Sp0qphw%epiuSUG#WHS~ht|j~;`U4>BXmdi9@& zuz>%00000G5i7^TsbXePb2LB O0000sAjk5Y(@*V#~rbuHu`7A_H&AxgwHf8y4cdKvg$JbB4n%ez%sZ31aBYd&Oo@(7)_WJ(Znl2o8^PD` zFE`_Y-IS+Kdq0Q2-7r_C=}F(5ev`U`H~)QH|9$1FHE$YjoVax+e0xei%S`SAGlOm! zp7{T3NA-mVOYb&rdU8MdyIHo@@7cE*uj@I+Zu{2i)KMSV-E~ovpO}&+|8}fC)JNq`>?#dJ%s{^>GN_4usXQirk{^@^BA?p!El9&T9q~zMsh2=YdLB`_ONiP zKy6XlUGFZ>Cn7mP3u*fn&`6tH9gqo;^MN#J@G-NZG(W*iG}t#e1Fb- zKV8KTt0a`{lX$B4$~o~B?x*6e)~<@4Iz4h@Jmb~b5&vc;g`2H9{psfXevRGF%X%)F z{W^G1#bn40-weR!F*3L+ubT($m0wc}!uNKw0-sV5H z;CF7g9MJJ=+rKjGEBl+3>A2QyMfKUZ+;mUbm;0)$KRWh$yq((D^ZhGdwuD|?hi~Df z@|&)@8Hr8?_0j7y!?>j6!~H8~TztJ`f#FwsF1bzDbkz>zesQ*DR9hWnx9on|hmN^& zyJ|dM`zN>MP3ZiWI3+;%Z?hr$v=dI#e(*&r?E!in863#FcU<{Z?XiYs!60EzS3j3^ HP6 literal 0 HcmV?d00001 diff --git a/tests/ragger/snapshots/nanosp/domain_name_verbose_False/00002.png b/tests/ragger/snapshots/nanosp/domain_name_verbose_False/00002.png new file mode 100644 index 0000000000000000000000000000000000000000..6af0ec54b2a0718d258e534bf29b059567fc8a37 GIT binary patch literal 394 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|OeC49QR=-2B7dxJ{W zgs*+Kp>I)S?nComvp*b*(d&*o`esS|_Wz0OWf4q4#T*CSRgb;eS9841(&A*@>I#&b2QSTI5qI}IeE+uQ$d($HH~rmjmfzpG^!&>@vHo;H|A#$&J>60(rv&w- z{Y$*re=CCT)rWkxbu*ft7z>`O-oI7u=d4xjo3yuXwAx+AyG_?&s?U?T(oz$vN~hG^ zITd^LMfdfDVy;c?KbE!zHs9!cv+j?u-i)SGA(L0?zp6X2s;;m5>ao50i9jz_e_Gr2 zjaxr8`Rh@Y?ag!bLo2gxTv~bJ)XKV#_qKdJdgcDJ@>9jrf~PT`jyPOzcvQ5zaQmZw zsyQ_iV&5BC&*W(?<|>M3c>Lz-s+s2Awug&us=u4vloD}$y3^rY@dWQRp`~22>^5u8 z-Wjt=zq~iKakEWo=0=}0$4N$E@I8h8IZK)78&qol`;+03*-H(EtDd literal 0 HcmV?d00001 diff --git a/tests/ragger/snapshots/nanosp/domain_name_verbose_False/00004.png b/tests/ragger/snapshots/nanosp/domain_name_verbose_False/00004.png new file mode 100644 index 0000000000000000000000000000000000000000..570ce28d53e82ac396ba25c370110058f3a638f9 GIT binary patch literal 472 zcmV;}0Vn>6P)Nkl`l1;k+@4An6g^M6kcbtxu@7*hfO000000DuchDWw$aQJnB& zJ%BsK3VrpQ1hnYqoNY&PO0WdV>i`7cs)e_@w@x()p@w=B24`klR6(CLpxqtlZO|2 zIWjpO-F~*EHtLqUMt)Wc_@bMv^h#{CUFW0M(vJ1P=5N1GhWcHM(-Xu*&bc@D4_o$^ z7Y|pL)I@*DzttR=&yLH#^{|TW)8Sp0qphw%epiuSUG#WHS~ht|j~;`U4>BXmdi9@& zuz>%00000G5i7^TsbXePb2LB O0000sAjk5Y(@*V#~rbuHu`7A_H&AxgwHf8y4cdKvg$JbB4n%ez%sZ31aBYd&Oo@(7)_WJ(Znl2o8^PD` zFE`_Y-IS+Kdq0Q2-7r_C=}F(5ev`U`H~)QH|9$1FHE$YjoVax+e0xei%S`SAGlOm! zp7{T3NA-mVOYb&rdU8MdyIHo@@7cE*uj@I+Zu{2i)KMSV-E~ovpO}&+|8}fC)JNq`>?#dJ%s{^>GN_4usXQirk{^@^BA?p!El9&T9q~zMsh2=YdLB`_ONiP zKy6XlUGFZ>Cn7mP3u*fn&`6tH9gqo;^MN#J@G-NZG(W*iG}t#e1Fb- zKV8KTt0a`{lX$B4$~o~B?x*6e)~<@4Iz4h@Jmb~b5&vc;g`2H9{psfXevRGF%X%)F z{W^G1#bn40-weR!F*3L+ubT($m0wc}!uNKw0-sV5H z;CF7g9MJJ=+rKjGEBl+3>A2QyMfKUZ+;mUbm;0)$KRWh$yq((D^ZhGdwuD|?hi~Df z@|&)@8Hr8?_0j7y!?>j6!~H8~TztJ`f#FwsF1bzDbkz>zesQ*DR9hWnx9on|hmN^& zyJ|dM`zN>MP3ZiWI3+;%Z?hr$v=dI#e(*&r?E!in863#FcU<{Z?XiYs!60EzS3j3^ HP6 literal 0 HcmV?d00001 diff --git a/tests/ragger/snapshots/nanosp/domain_name_verbose_True/00002.png b/tests/ragger/snapshots/nanosp/domain_name_verbose_True/00002.png new file mode 100644 index 0000000000000000000000000000000000000000..6af0ec54b2a0718d258e534bf29b059567fc8a37 GIT binary patch literal 394 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|OeC49QR=-2B7dxJ{W zgs*+Kp>I)S?nComvp*b*(d&*o`esS|_Wz0OWf4q4#T*CSRgb;eS9841(&A*@>IFdu z__dw@MOS{tr(OJ6PoPLP9@*UxLb&ZA1lC4xvBG!qQ&wg@Ymi`OA5aK9q=YC=*Fi;`yDjPzxkl=%^cJKW8Rm7R%x^V000000G!J| X8HZ1szRqx300000NkvXXu0mjfUbPWB literal 0 HcmV?d00001 diff --git a/tests/ragger/snapshots/nanosp/domain_name_verbose_True/00004.png b/tests/ragger/snapshots/nanosp/domain_name_verbose_True/00004.png new file mode 100644 index 0000000000000000000000000000000000000000..70c1b9a68f5fb1ee090966199cb58a891b0a5ad4 GIT binary patch literal 436 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|_8Fba4!+nDh2V;G|{+o`%F- zmuDCJS1z1hTaXeVq>#&b2QSTI5qI}IeE+uQ$d($HH~rmjmfzpG^!&>@vHo;H|A#$&J>60(rv&w- z{Y$*re=CCT)rWkxbu*ft7z>`O-oI7u=d4xjo3yuXwAx+AyG_?&s?U?T(oz$vN~hG^ zITd^LMfdfDVy;c?KbE!zHs9!cv+j?u-i)SGA(L0?zp6X2s;;m5>ao50i9jz_e_Gr2 zjaxr8`Rh@Y?ag!bLo2gxTv~bJ)XKV#_qKdJdgcDJ@>9jrf~PT`jyPOzcvQ5zaQmZw zsyQ_iV&5BC&*W(?<|>M3c>Lz-s+s2Awug&us=u4vloD}$y3^rY@dWQRp`~22>^5u8 z-Wjt=zq~iKakEWo=0=}0$4N$E@I8h8IZK)78&qol`;+03*-H(EtDd literal 0 HcmV?d00001 diff --git a/tests/ragger/snapshots/nanosp/domain_name_verbose_True/00005.png b/tests/ragger/snapshots/nanosp/domain_name_verbose_True/00005.png new file mode 100644 index 0000000000000000000000000000000000000000..570ce28d53e82ac396ba25c370110058f3a638f9 GIT binary patch literal 472 zcmV;}0Vn>6P)Nkl`l1;k+@4An6g^M6kcbtxu@7*hfO000000DuchDWw$aQJnB& zJ%BsK3VrpQ1hnYqoNY&PO0WdV>i`7cs)e_@w@x()p@w=B24`klR6(CLpxqtlZO|2 zIWjpO-F~*EHtLqUMt)Wc_@bMv^h#{CUFW0M(vJ1P=5N1GhWcHM(-Xu*&bc@D4_o$^ z7Y|pL)I@*DzttR=&yLH#^{|TW)8Sp0qphw%epiuSUG#WHS~ht|j~;`U4>BXmdi9@& zuz>%00000G5i7^TsbXePb2LB O0000sAjk5Y(@*V#~rbuHu`7A_H&AxgwHf8y4cdKvg$JbB4n%ez%sZ31aBYd&Oo@(7)_WJ(Znl2o8^PD` zFE`_Y-IS+Kdq0Q2-7r_C=}F(5ev`U`H~)QH|9$1FHE$YjoVax+e0xei%S`SAGlOm! zp7{T3NA-mVOYb&rdU8MdyIHo@@7cE*uj@I+Zu{2i)KMSV-E~ovpO}&+|8}fC)JNq`>?#dJ%s{^>GN_4usXQirk{^@^BA?p!El9&T9q~zMsh2=YdLB`_ONiP zKy6XlUGFZ>Cn7mP3u*fn&`6tH9gqo;^MN#J@G-NZG(W*iG}t#e1Fb- zKV8KTt0a`{lX$B4$~o~B?x*6e)~<@4Iz4h@Jmb~b5&vc;g`2H9{psfXevRGF%X%)F z{W^G1#bn40-weR!F*3L+ubT($m0wc}!uNKw0-sV5H z;CF7g9MJJ=+rKjGEBl+3>A2QyMfKUZ+;mUbm;0)$KRWh$yq((D^ZhGdwuD|?hi~Df z@|&)@8Hr8?_0j7y!?>j6!~H8~TztJ`f#FwsF1bzDbkz>zesQ*DR9hWnx9on|hmN^& zyJ|dM`zN>MP3ZiWI3+;%Z?hr$v=dI#e(*&r?E!in863#FcU<{Z?XiYs!60EzS3j3^ HP6 literal 0 HcmV?d00001 diff --git a/tests/ragger/snapshots/nanosp/domain_name_wrong_addr/00002.png b/tests/ragger/snapshots/nanosp/domain_name_wrong_addr/00002.png new file mode 100644 index 0000000000000000000000000000000000000000..639e4214e2503dea60de36382cca415eba0612ef GIT binary patch literal 588 zcmV-S0<-;zP)O0W zchFsT)i}^Q!1`wvO&TVU-WL7u7Lerb2v~T-6W-5}9LuNEJd4tofu>?$4t}ALa z+pgs{)78Thz#Qt%begfRUjy1``q}X~sO`Sn^ZL71NxS8Y)xw+}-aS2NY8me@&zh zE2f7M0L8TSt3&St(g74xiI*wJ8#@%!A`9LJEKw*wqL=~z0001hgyknnlA+h%_bs4G zSMR*9(K^A!XR1TIOrw2X0$zs41RPV`Jm4+?pNc+tOTgEnPY&hiC9>iwZ503j0001h ack&On!Zml6z*33;0000#&b2QSTI5qI}IeE+uQ$d($HH~rmjmfzpG^!&>@vHo;H|A#$&J>60(rv&w- z{Y$*re=CCT)rWkxbu*ft7z>`O-oI7u=d4xjo3yuXwAx+AyG_?&s?U?T(oz$vN~hG^ zITd^LMfdfDVy;c?KbE!zHs9!cv+j?u-i)SGA(L0?zp6X2s;;m5>ao50i9jz_e_Gr2 zjaxr8`Rh@Y?ag!bLo2gxTv~bJ)XKV#_qKdJdgcDJ@>9jrf~PT`jyPOzcvQ5zaQmZw zsyQ_iV&5BC&*W(?<|>M3c>Lz-s+s2Awug&us=u4vloD}$y3^rY@dWQRp`~22>^5u8 z-Wjt=zq~iKakEWo=0=}0$4N$E@I8h8IZK)78&qol`;+03*-H(EtDd literal 0 HcmV?d00001 diff --git a/tests/ragger/snapshots/nanosp/domain_name_wrong_addr/00004.png b/tests/ragger/snapshots/nanosp/domain_name_wrong_addr/00004.png new file mode 100644 index 0000000000000000000000000000000000000000..570ce28d53e82ac396ba25c370110058f3a638f9 GIT binary patch literal 472 zcmV;}0Vn>6P)Nkl`l1;k+@4An6g^M6kcbtxu@7*hfO000000DuchDWw$aQJnB& zJ%BsK3VrpQ1hnYqoNY&PO0WdV>i`7cs)e_@w@x()p@w=B24`klR6(CLpxqtlZO|2 zIWjpO-F~*EHtLqUMt)Wc_@bMv^h#{CUFW0M(vJ1P=5N1GhWcHM(-Xu*&bc@D4_o$^ z7Y|pL)I@*DzttR=&yLH#^{|TW)8Sp0qphw%epiuSUG#WHS~ht|j~;`U4>BXmdi9@& zuz>%00000G5i7^TsbXePb2LB O0000sAjk5Y(@*V#~rbuHu`7A_H&AxgwHf8y4cdKvg$JbB4n%ez%sZ31aBYd&Oo@(7)_WJ(Znl2o8^PD` zFE`_Y-IS+Kdq0Q2-7r_C=}F(5ev`U`H~)QH|9$1FHE$YjoVax+e0xei%S`SAGlOm! zp7{T3NA-mVOYb&rdU8MdyIHo@@7cE*uj@I+Zu{2i)KMSV-E~o