From 6aa41a5f7f5b5db48e0127ea3373c629546ea00a Mon Sep 17 00:00:00 2001 From: Robert Lukotka Date: Tue, 16 Aug 2022 22:43:01 +0200 Subject: [PATCH 1/2] Message signing --- app/src/apdu_handler.c | 12 +++ app/src/coin.h | 2 + app/src/common/actions.c | 16 ++++ app/src/common/actions.h | 25 ++++- app/src/common/app_main.c | 16 +++- app/src/common/app_main.h | 1 + app/src/common/tx.c | 20 ---- app/src/crypto.c | 25 +++-- app/src/crypto.h | 1 + app/src/message.c | 90 ++++++++++++++++++ app/src/message.h | 29 ++++++ deps/ledger-zxlib/dockerized_build.mk | 1 + docs/APDUSPEC.md | 31 ++++-- js/src/index.js | 10 +- js/src/signTransaction.js | 15 ++- tests_speculos/test-messages.js | 111 ++++++++++++++++++++++ tests_speculos/test-messages/nanos.01.png | Bin 0 -> 380 bytes tests_speculos/test-messages/nanos.02.png | Bin 0 -> 529 bytes tests_speculos/test-messages/nanos.03.png | Bin 0 -> 587 bytes tests_speculos/test-messages/nanos.04.png | Bin 0 -> 542 bytes tests_speculos/test-messages/nanos.05.png | Bin 0 -> 249 bytes tests_speculos/test-messages/nanos.06.png | Bin 0 -> 380 bytes tests_speculos/test-messages/nanos.07.png | Bin 0 -> 657 bytes tests_speculos/test-messages/nanos.08.png | Bin 0 -> 639 bytes tests_speculos/test-messages/nanos.09.png | Bin 0 -> 249 bytes tests_speculos/test-messages/nanos.10.png | Bin 0 -> 380 bytes tests_speculos/test-messages/nanos.11.png | Bin 0 -> 483 bytes tests_speculos/test-messages/nanos.12.png | Bin 0 -> 468 bytes tests_speculos/test-messages/nanos.13.png | Bin 0 -> 380 bytes tests_speculos/test-messages/nanos.14.png | Bin 0 -> 642 bytes tests_speculos/test-messages/nanos.15.png | Bin 0 -> 641 bytes tests_speculos/test-messages/nanos.16.png | Bin 0 -> 546 bytes tests_speculos/test-messages/nanos.17.png | Bin 0 -> 249 bytes tests_speculos/test-messages/nanos.18.png | Bin 0 -> 380 bytes tests_speculos/test-messages/nanos.19.png | Bin 0 -> 468 bytes tests_speculos/test-messages/nanos.20.png | Bin 0 -> 483 bytes tests_speculos/test-messages/nanos.21.png | Bin 0 -> 380 bytes tests_speculos/test-messages/nanox.01.png | Bin 0 -> 409 bytes tests_speculos/test-messages/nanox.02.png | Bin 0 -> 420 bytes tests_speculos/test-messages/nanox.03.png | Bin 0 -> 791 bytes tests_speculos/test-messages/nanox.04.png | Bin 0 -> 780 bytes tests_speculos/test-messages/nanox.05.png | Bin 0 -> 355 bytes tests_speculos/test-messages/nanox.06.png | Bin 0 -> 409 bytes tests_speculos/test-messages/nanox.07.png | Bin 0 -> 420 bytes tests_speculos/test-messages/nanox.08.png | Bin 0 -> 933 bytes tests_speculos/test-messages/nanox.09.png | Bin 0 -> 551 bytes tests_speculos/test-messages/nanox.10.png | Bin 0 -> 355 bytes tests_speculos/test-messages/nanox.11.png | Bin 0 -> 409 bytes tests_speculos/test-messages/nanox.12.png | Bin 0 -> 442 bytes tests_speculos/test-messages/nanox.13.png | Bin 0 -> 428 bytes tests_speculos/test-messages/nanox.14.png | Bin 0 -> 409 bytes tests_speculos/test-messages/nanox.15.png | Bin 0 -> 420 bytes tests_speculos/test-messages/nanox.16.png | Bin 0 -> 942 bytes tests_speculos/test-messages/nanox.17.png | Bin 0 -> 540 bytes tests_speculos/test-messages/nanox.18.png | Bin 0 -> 608 bytes tests_speculos/test-messages/nanox.19.png | Bin 0 -> 355 bytes tests_speculos/test-messages/nanox.20.png | Bin 0 -> 409 bytes tests_speculos/test-messages/nanox.21.png | Bin 0 -> 428 bytes tests_speculos/test-messages/nanox.22.png | Bin 0 -> 442 bytes tests_speculos/test-messages/nanox.23.png | Bin 0 -> 409 bytes 60 files changed, 356 insertions(+), 49 deletions(-) create mode 100644 app/src/message.c create mode 100644 app/src/message.h create mode 100644 tests_speculos/test-messages.js create mode 100644 tests_speculos/test-messages/nanos.01.png create mode 100644 tests_speculos/test-messages/nanos.02.png create mode 100644 tests_speculos/test-messages/nanos.03.png create mode 100644 tests_speculos/test-messages/nanos.04.png create mode 100644 tests_speculos/test-messages/nanos.05.png create mode 100644 tests_speculos/test-messages/nanos.06.png create mode 100644 tests_speculos/test-messages/nanos.07.png create mode 100644 tests_speculos/test-messages/nanos.08.png create mode 100644 tests_speculos/test-messages/nanos.09.png create mode 100644 tests_speculos/test-messages/nanos.10.png create mode 100644 tests_speculos/test-messages/nanos.11.png create mode 100644 tests_speculos/test-messages/nanos.12.png create mode 100644 tests_speculos/test-messages/nanos.13.png create mode 100644 tests_speculos/test-messages/nanos.14.png create mode 100644 tests_speculos/test-messages/nanos.15.png create mode 100644 tests_speculos/test-messages/nanos.16.png create mode 100644 tests_speculos/test-messages/nanos.17.png create mode 100644 tests_speculos/test-messages/nanos.18.png create mode 100644 tests_speculos/test-messages/nanos.19.png create mode 100644 tests_speculos/test-messages/nanos.20.png create mode 100644 tests_speculos/test-messages/nanos.21.png create mode 100644 tests_speculos/test-messages/nanox.01.png create mode 100644 tests_speculos/test-messages/nanox.02.png create mode 100644 tests_speculos/test-messages/nanox.03.png create mode 100644 tests_speculos/test-messages/nanox.04.png create mode 100644 tests_speculos/test-messages/nanox.05.png create mode 100644 tests_speculos/test-messages/nanox.06.png create mode 100644 tests_speculos/test-messages/nanox.07.png create mode 100644 tests_speculos/test-messages/nanox.08.png create mode 100644 tests_speculos/test-messages/nanox.09.png create mode 100644 tests_speculos/test-messages/nanox.10.png create mode 100644 tests_speculos/test-messages/nanox.11.png create mode 100644 tests_speculos/test-messages/nanox.12.png create mode 100644 tests_speculos/test-messages/nanox.13.png create mode 100644 tests_speculos/test-messages/nanox.14.png create mode 100644 tests_speculos/test-messages/nanox.15.png create mode 100644 tests_speculos/test-messages/nanox.16.png create mode 100644 tests_speculos/test-messages/nanox.17.png create mode 100644 tests_speculos/test-messages/nanox.18.png create mode 100644 tests_speculos/test-messages/nanox.19.png create mode 100644 tests_speculos/test-messages/nanox.20.png create mode 100644 tests_speculos/test-messages/nanox.21.png create mode 100644 tests_speculos/test-messages/nanox.22.png create mode 100644 tests_speculos/test-messages/nanox.23.png diff --git a/app/src/apdu_handler.c b/app/src/apdu_handler.c index 5cbf67a0..476e71d3 100644 --- a/app/src/apdu_handler.c +++ b/app/src/apdu_handler.c @@ -32,6 +32,7 @@ #include "zxformat.h" #include "hdpath.h" #include "parser_impl.h" +#include "message.h" __Z_INLINE void handleGetPubkey(volatile uint32_t *flags, volatile uint32_t *tx, uint32_t rx) { hasPubkey = false; @@ -86,6 +87,17 @@ __Z_INLINE void handleSign(volatile uint32_t *flags, volatile uint32_t *tx, uint THROW(APDU_CODE_OK); } + if (callType == PROCESS_CHUNK_FINISHED_MESSAGE) { + zxerr_t err = message_parse(); + if (err != zxerr_ok) { + THROW(APDU_CODE_DATA_INVALID); + } + CHECK_APP_CANARY() + view_review_init(message_getItem, message_getNumItems, app_sign_message); + view_review_show(); + *flags |= IO_ASYNCH_REPLY; + } + const char *error_msg = tx_parse(callType); if (error_msg != NULL) { diff --git a/app/src/coin.h b/app/src/coin.h index a6d0c21f..9bbce45c 100644 --- a/app/src/coin.h +++ b/app/src/coin.h @@ -55,6 +55,8 @@ typedef struct { #define MAIN_SLOT 0 +#define DOMAIN_TAG_LENGTH 32 + #ifdef __cplusplus } #endif diff --git a/app/src/common/actions.c b/app/src/common/actions.c index 079a300d..93e04d9d 100644 --- a/app/src/common/actions.c +++ b/app/src/common/actions.c @@ -18,3 +18,19 @@ #include "actions.h" uint16_t action_addr_len; + +// UTF-8 encoding of "FLOW-V0.0-transaction" padded with zeros to 32 bytes +const uint8_t TX_DOMAIN_TAG_TRANSACTION[DOMAIN_TAG_LENGTH] = {\ + 0x46, 0x4C, 0x4F, 0x57, 0x2D, 0x56, 0x30, 0x2E, + 0x30, 0x2D, 0x74, 0x72, 0x61, 0x6E, 0x73, 0x61, + 0x63, 0x74, 0x69, 0x6F, 0x6E, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +}; + +const uint8_t TX_DOMAIN_TAG_MESSAGE[DOMAIN_TAG_LENGTH] = {\ + 0x46, 0x4C, 0x4F, 0x57, 0x2D, 0x56, 0x30, 0x2E, + 0x30, 0x2D, 0x75, 0x73, 0x65, 0x72, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +}; + diff --git a/app/src/common/actions.h b/app/src/common/actions.h index a012a96c..0e673135 100644 --- a/app/src/common/actions.h +++ b/app/src/common/actions.h @@ -25,12 +25,31 @@ #define GET_PUB_KEY_RESPONSE_LENGTH (3 * SECP256_PK_LEN) +extern const uint8_t TX_DOMAIN_TAG_TRANSACTION[DOMAIN_TAG_LENGTH]; +extern const uint8_t TX_DOMAIN_TAG_MESSAGE[DOMAIN_TAG_LENGTH]; + __Z_INLINE void app_sign() { - const uint8_t *message = get_signable(); - const uint16_t messageLength = get_signable_length(); + const uint8_t *message = tx_get_buffer(); + const uint16_t messageLength = tx_get_buffer_length(); + + uint16_t replyLen = 0; + zxerr_t err = crypto_sign(hdPath, cryptoOptions, message, messageLength, TX_DOMAIN_TAG_TRANSACTION, G_io_apdu_buffer, IO_APDU_BUFFER_SIZE - 3, &replyLen); + + if (err != zxerr_ok || replyLen == 0) { + set_code(G_io_apdu_buffer, 0, APDU_CODE_SIGN_VERIFY_ERROR); + io_exchange(CHANNEL_APDU | IO_RETURN_AFTER_TX, 2); + } else { + set_code(G_io_apdu_buffer, replyLen, APDU_CODE_OK); + io_exchange(CHANNEL_APDU | IO_RETURN_AFTER_TX, replyLen + 2); + } +} + +__Z_INLINE void app_sign_message() { + const uint8_t *message = tx_get_buffer(); + const uint16_t messageLength = tx_get_buffer_length(); uint16_t replyLen = 0; - zxerr_t err = crypto_sign(hdPath, cryptoOptions, message, messageLength, G_io_apdu_buffer, IO_APDU_BUFFER_SIZE - 3, &replyLen); + zxerr_t err = crypto_sign(hdPath, cryptoOptions, message, messageLength, TX_DOMAIN_TAG_MESSAGE, G_io_apdu_buffer, IO_APDU_BUFFER_SIZE - 3, &replyLen); if (err != zxerr_ok || replyLen == 0) { set_code(G_io_apdu_buffer, 0, APDU_CODE_SIGN_VERIFY_ERROR); diff --git a/app/src/common/app_main.c b/app/src/common/app_main.c index a61c9c33..5174ce83 100644 --- a/app/src/common/app_main.c +++ b/app/src/common/app_main.c @@ -133,36 +133,42 @@ process_chunk_response_t process_chunk(__Z_UNUSED volatile uint32_t *tx, uint32_ extractHDPathAndCryptoOptions(rx, OFFSET_DATA); initStoredTxMetadata(); return PROCESS_CHUNK_NOT_FINISHED; - case 1: + case 0x01: added = tx_append(&(G_io_apdu_buffer[OFFSET_DATA]), rx - OFFSET_DATA); if (added != rx - OFFSET_DATA) { THROW(APDU_CODE_OUTPUT_BUFFER_TOO_SMALL); } return PROCESS_CHUNK_NOT_FINISHED; - case 2: + case 0x02: added = tx_append(&(G_io_apdu_buffer[OFFSET_DATA]), rx - OFFSET_DATA); if (added != rx - OFFSET_DATA) { THROW(APDU_CODE_OUTPUT_BUFFER_TOO_SMALL); } return PROCESS_CHUNK_FINISHED_NO_METADATA; - case 3: + case 0x03: if (storeTxMetadata(&(G_io_apdu_buffer[OFFSET_DATA]), rx - OFFSET_DATA) != PARSER_OK) { initStoredTxMetadata(); //delete merkle tree proof on error for redundant security THROW(APDU_CODE_DATA_INVALID); } return PROCESS_CHUNK_NOT_FINISHED; - case 4: + case 0x04: if (validateStoredTxMetadataMerkleTreeLevel(&(G_io_apdu_buffer[OFFSET_DATA]), rx - OFFSET_DATA) != PARSER_OK) { initStoredTxMetadata(); //delete merkle tree proof on error for redundant security THROW(APDU_CODE_DATA_INVALID); } return PROCESS_CHUNK_NOT_FINISHED; - case 5: + case 0x05: if (validateStoredTxMetadataMerkleTreeLevel(&(G_io_apdu_buffer[OFFSET_DATA]), rx - OFFSET_DATA) != PARSER_OK) { initStoredTxMetadata(); //delete merkle tree proof on error for redundant security THROW(APDU_CODE_DATA_INVALID); } return PROCESS_CHUNK_FINISHED_WITH_METADATA; + case 0x10: + added = tx_append(&(G_io_apdu_buffer[OFFSET_DATA]), rx - OFFSET_DATA); + if (added != rx - OFFSET_DATA) { + THROW(APDU_CODE_OUTPUT_BUFFER_TOO_SMALL); + } + return PROCESS_CHUNK_FINISHED_MESSAGE; } THROW(APDU_CODE_INVALIDP1P2); diff --git a/app/src/common/app_main.h b/app/src/common/app_main.h index 4a20680d..9f9fcbb0 100644 --- a/app/src/common/app_main.h +++ b/app/src/common/app_main.h @@ -49,6 +49,7 @@ typedef enum { PROCESS_CHUNK_NOT_FINISHED = 0, PROCESS_CHUNK_FINISHED_WITH_METADATA, PROCESS_CHUNK_FINISHED_NO_METADATA, + PROCESS_CHUNK_FINISHED_MESSAGE, } process_chunk_response_t; process_chunk_response_t process_chunk(volatile uint32_t *tx, uint32_t rx); diff --git a/app/src/common/tx.c b/app/src/common/tx.c index e2b0249e..9305c93f 100644 --- a/app/src/common/tx.c +++ b/app/src/common/tx.c @@ -46,14 +46,6 @@ storage_t NV_CONST N_appdata_impl __attribute__ ((aligned(64))); parser_context_t ctx_parsed_tx; -// UTF-8 encoding of "FLOW-V0.0-transaction" padded with zeros to 32 bytes -#define DOMAIN_TAG_LENGTH 32 -const uint8_t TX_DOMAIN_TAG[DOMAIN_TAG_LENGTH] = {\ - 0x46, 0x4C, 0x4F, 0x57, 0x2D, 0x56, 0x30, 0x2E, - 0x30, 0x2D, 0x74, 0x72, 0x61, 0x6E, 0x73, 0x61, - 0x63, 0x74, 0x69, 0x6F, 0x6E, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, -}; #define TX_BUFFER_OFFSET DOMAIN_TAG_LENGTH @@ -68,7 +60,6 @@ void tx_initialize() { void tx_reset() { buffering_reset(); - buffering_append((uint8_t *)TX_DOMAIN_TAG, DOMAIN_TAG_LENGTH); } uint32_t tx_append(unsigned char *buffer, uint32_t length) { @@ -76,21 +67,10 @@ uint32_t tx_append(unsigned char *buffer, uint32_t length) { } uint32_t tx_get_buffer_length() { - if (buffering_get_buffer()->pos >= TX_BUFFER_OFFSET) { - return buffering_get_buffer()->pos - TX_BUFFER_OFFSET; - } - return 0; -} - -uint32_t get_signable_length() { return buffering_get_buffer()->pos; } uint8_t *tx_get_buffer() { - return buffering_get_buffer()->data + TX_BUFFER_OFFSET; -} - -uint8_t *get_signable() { return buffering_get_buffer()->data; } diff --git a/app/src/crypto.c b/app/src/crypto.c index 4e9b4f43..dbe20489 100644 --- a/app/src/crypto.c +++ b/app/src/crypto.c @@ -24,7 +24,6 @@ #if defined(TARGET_NANOS) || defined(TARGET_NANOX) || defined(TARGET_NANOS2) #include "cx.h" - __Z_INLINE digest_type_e get_hash_type(const uint16_t options) { const uint8_t hash_type = (uint8_t) (options & 0xFF); switch(hash_type) { @@ -118,7 +117,8 @@ void sha256(const uint8_t *message, uint16_t messageLen, uint8_t message_digest[ cx_hash_sha256(message, messageLen, message_digest, CX_SHA256_SIZE); } -zxerr_t digest_message(const uint8_t *message, uint16_t messageLen, digest_type_e hash_kind, uint8_t *digest, uint16_t digestMax, uint16_t* digest_size) { +zxerr_t digest_message(const uint8_t *message, uint16_t messageLen, const uint8_t domainTag[DOMAIN_TAG_LENGTH], + digest_type_e hash_kind, uint8_t *digest, uint16_t digestMax, uint16_t* digest_size) { switch(hash_kind) { case HASH_SHA2_256: { zemu_log_stack("sha2_256"); @@ -126,20 +126,23 @@ zxerr_t digest_message(const uint8_t *message, uint16_t messageLen, digest_type_ zemu_log_stack("digest_message: zxerr_buffer_too_small"); return zxerr_buffer_too_small; } - sha256(message, messageLen, digest); + cx_sha256_t sha2; + cx_sha256_init(&sha2); + cx_hash((cx_hash_t*) &sha2, 0, domainTag, DOMAIN_TAG_LENGTH, NULL, 0); + cx_hash((cx_hash_t*) &sha2, CX_LAST, message, messageLen, digest, CX_SHA256_SIZE); *digest_size = CX_SHA256_SIZE; return zxerr_ok; } case HASH_SHA3_256: { - if (digestMax < 32) { + zemu_log_stack("sha3_256"); + if (digestMax < CX_SHA256_SIZE) { return zxerr_buffer_too_small; } - zemu_log_stack("sha3_256"); cx_sha3_t sha3; cx_sha3_init(&sha3, 256); - cx_hash((cx_hash_t*)&sha3, CX_LAST, message, messageLen, digest, 32); - zemu_log_stack("sha3_256 ready"); - *digest_size = 32; + cx_hash((cx_hash_t*) &sha3, 0, domainTag, DOMAIN_TAG_LENGTH, NULL, 0); + cx_hash((cx_hash_t*) &sha3, CX_LAST, message, messageLen, digest, CX_SHA256_SIZE); + *digest_size = CX_SHA256_SIZE; return zxerr_ok; } default: { @@ -149,7 +152,9 @@ zxerr_t digest_message(const uint8_t *message, uint16_t messageLen, digest_type_ } } -zxerr_t crypto_sign(const hd_path_t path, const uint16_t options, const uint8_t *message, uint16_t messageLen, uint8_t *buffer, uint16_t bufferSize, uint16_t *sigSize) { +zxerr_t crypto_sign(const hd_path_t path, const uint16_t options, + const uint8_t *message, uint16_t messageLen, const uint8_t domainTag[DOMAIN_TAG_LENGTH], + uint8_t *buffer, uint16_t bufferSize, uint16_t *sigSize) { zemu_log_stack("crypto_sign"); cx_curve_t curve = get_cx_curve(options); @@ -163,7 +168,7 @@ zxerr_t crypto_sign(const hd_path_t path, const uint16_t options, const uint8_t uint8_t messageDigest[32]; uint16_t messageDigestSize = 0; - CHECK_ZXERR(digest_message(message, messageLen, cx_hash_kind, messageDigest, sizeof(messageDigest), &messageDigestSize)); + CHECK_ZXERR(digest_message(message, messageLen, domainTag, cx_hash_kind, messageDigest, sizeof(messageDigest), &messageDigestSize)); if (messageDigestSize != 32) { zemu_log_stack("crypto_sign: zxerr_out_of_bounds"); diff --git a/app/src/crypto.h b/app/src/crypto.h index c02c2ec7..917d5848 100644 --- a/app/src/crypto.h +++ b/app/src/crypto.h @@ -52,6 +52,7 @@ zxerr_t crypto_sign( const uint16_t options, const uint8_t *message, uint16_t messageLen, + const uint8_t domainTag[DOMAIN_TAG_LENGTH], uint8_t *signature, uint16_t signatureMaxlen, uint16_t *sigSize diff --git a/app/src/message.c b/app/src/message.c new file mode 100644 index 00000000..403a841f --- /dev/null +++ b/app/src/message.c @@ -0,0 +1,90 @@ +/******************************************************************************* +* (c) 2022 Vacuumlabs +* +* 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 "message.h" +#include "zxformat.h" +#include "app_mode.h" +#include "hdpath.h" +#include "crypto.h" +#include "buffering.h" + +#define MAX_MESSAGE_SHOW_LENGTH 34*5 +#define MAX_MESSAGE_LENGTH 0x7FFF + +struct { + uint8_t hash[CX_SHA256_SIZE]; + uint16_t length; + uint8_t *message; + bool canBeDisplayed; + +} messageData; + +zxerr_t message_parse() { + messageData.message = buffering_get_buffer()->data; + messageData.length = buffering_get_buffer()->pos; + + if (messageData.length > MAX_MESSAGE_LENGTH) { + return zxerr_out_of_bounds; + } + + sha256(messageData.message, messageData.length, messageData.hash); + messageData.canBeDisplayed = false; + + if (messageData.length <= MAX_MESSAGE_SHOW_LENGTH) { + messageData.canBeDisplayed = true; + for(size_t j=0; j127) { + messageData.canBeDisplayed = false; + break; + } + } + } + + return zxerr_ok; +} + +zxerr_t message_getNumItems(uint8_t *num_items){ + *num_items = app_mode_expert() ? 2: 1; + return zxerr_ok; +} + +// retrieves a readable output for each field / page +zxerr_t message_getItem(int8_t displayIdx, + char *outKey, uint16_t outKeyLen, + char *outVal, uint16_t outValLen, + uint8_t pageIdx, uint8_t *pageCount) { + switch(displayIdx) { + case 0: + if (messageData.canBeDisplayed) { + snprintf(outKey, outKeyLen, "Message"); + pageStringExt(outVal, outValLen, (char *)messageData.message, messageData.length, pageIdx, pageCount); + } + else { + snprintf(outKey, outKeyLen, "Message hash"); + pageHexString(outVal, outValLen, messageData.hash, sizeof(messageData.hash), pageIdx, pageCount); + } + return zxerr_ok; + case 1: + if (app_mode_expert()) { + snprintf(outKey, outKeyLen, "Your Path"); + char buffer[100]; + path_options_to_string(buffer, sizeof(buffer), hdPath.data, HDPATH_LEN_DEFAULT, cryptoOptions); + pageString(outVal, outValLen, buffer, pageIdx, pageCount); + return zxerr_ok; + } + return zxerr_no_data; + } + return zxerr_no_data; +} diff --git a/app/src/message.h b/app/src/message.h new file mode 100644 index 00000000..4587d912 --- /dev/null +++ b/app/src/message.h @@ -0,0 +1,29 @@ +/******************************************************************************* +* (c) 2022 Vacuumlabs +* +* 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. +********************************************************************************/ +#pragma once + +#include "zxerror.h" + +zxerr_t message_parse(); + +zxerr_t message_getNumItems(uint8_t *num_items); + +zxerr_t message_getItem(int8_t displayIdx, + char *outKey, uint16_t outKeyLen, + char *outVal, uint16_t outValLen, + uint8_t pageIdx, uint8_t *pageCount); + + diff --git a/deps/ledger-zxlib/dockerized_build.mk b/deps/ledger-zxlib/dockerized_build.mk index 70f1d236..d3f9e939 100644 --- a/deps/ledger-zxlib/dockerized_build.mk +++ b/deps/ledger-zxlib/dockerized_build.mk @@ -346,6 +346,7 @@ speculos_port_5002_test_internal: $(call run_nodejs_test,5002,40002,test-slot-transaction-interaction.js) $(call run_nodejs_test,5002,40002,test-transaction-expert-mode.js) $(call run_nodejs_test,5002,40002,test-transaction-arbitrary.js) + $(call run_nodejs_test,5002,40002,test-messages.js) $(call run_nodejs_test,5002,40002,test-transactions.js) @echo "# ALL TESTS COMPLETED!" | tee -a $(TESTS_SPECULOS_DIR)/speculos-port-5002.log diff --git a/docs/APDUSPEC.md b/docs/APDUSPEC.md index 7dc3b166..413315d8 100644 --- a/docs/APDUSPEC.md +++ b/docs/APDUSPEC.md @@ -164,10 +164,11 @@ Each slot has the following structure The first packet/chunk includes only the derivation path -All other packets/chunks contain data chunks that are described below. There are two workflows as of now (typical sequences here, the app allows other combination of commands, too): +All other packets/chunks contain data chunks that are described below. There are three workflows as of now (typical sequences here, the app allows other combination of commands, too): Merkle tree workflow - Init packet, several add packets, metadata packet, four Merkle tree packets (3x 0x04 and finaly 0x05). -Arbitrary transaction signing - Init packer, several add packets, final packet. +Arbitrary transaction signing - Init packet, several add packets, final packet. +Message signing workflow - Init packet, several add packets, final message packet (P1=0x10). ##### Init Packet P1 = 0x00 @@ -180,7 +181,7 @@ Arbitrary transaction signing - Init packer, several add packets, final packet. | Path[4] | byte (4) | Derivation Path Data | ? | | Options | byte (2) | Crypto options (LE) | ? | -This clears tx data and sets detivation path and crypto options variable +This clears data and sets detivation path and crypto options variable ##### Add Packet P1 = 0x01 @@ -190,11 +191,11 @@ This clears tx data and sets detivation path and crypto options variable Data is defined as: -| Field | Type | Content | Expected | -| ------- | ------- | ---------------- | -------- | -| Message | bytes.. | RLP data to sign | | +| Field | Type | Content | Expected | +| ------- | ------- | ------------------------ | -------- | +| Message | bytes.. | RLP data/message to sign | | -Appends to transaction data +Appends to data (transaction or message) ##### Fimal Packet P1 = 0x02 @@ -208,7 +209,7 @@ Data is defined as: | ------- | ------- | ---------------- | -------- | | Message | bytes.. | RLP data to sign | | -Appends to transaction data and initiates signing without metadata (requires expert mode). +Appends to transaction data and initiates transaction signing without metadata (requires expert mode). ##### Metadata Packet P1 = 0x03 @@ -271,6 +272,20 @@ Four APDUs for four levels of internal merkle tree nodes. Each internal nerkle t Validates merkle tree node. Validates that previous hash (metadata hash or merkle tree node hash) is in the list of hashes. Computes new hash and increments merkle tree counter. Call with P1 = 0x05 starts the signing process with metadata. This requires that we are at the root of the merkle tree and that the hash value matches the one stored in the app. +##### Final message signing Packet P1 = 0x10 + +| Field | Type | Content | Expected | +| ----- | -------- | ------- | -------- | +| Data | bytes... | Message | | + +Data is defined as: + +| Field | Type | Content | Expected | +| ------- | ------- | ------------------- | -------- | +| Message | bytes.. | Mesage data to sign | | + +Appends to data to message and initiates message signing. + #### Response | Field | Type | Content | Note | diff --git a/js/src/index.js b/js/src/index.js index ba1f8ba5..5d3764a8 100644 --- a/js/src/index.js +++ b/js/src/index.js @@ -147,9 +147,17 @@ export default class FlowApp { } async sign(path, message, cryptoOptions, scriptHash) { + return this._signImplementation(path, message, cryptoOptions, scriptHash) + } + + async signMessage(path, message, cryptoOptions) { + return this._signImplementation(path, message, cryptoOptions, "Sign message") + } + + async _signImplementation(path, message, cryptoOptions, extraInfo) { validateCryptoOptions(cryptoOptions); const getVersionResponse = await this.getVersion(); - const chunks = signGetChunks(path, cryptoOptions, getVersionResponse, message, scriptHash) + const chunks = signGetChunks(path, cryptoOptions, getVersionResponse, message, extraInfo) if (typeof chunks === "string") { return { diff --git a/js/src/signTransaction.js b/js/src/signTransaction.js index 85b7aa8b..1fdd3e8a 100644 --- a/js/src/signTransaction.js +++ b/js/src/signTransaction.js @@ -9,10 +9,11 @@ const PAYLOAD_TYPE = { TX_METADATA: 0x03, MERKLE_TREE: 0x04, MERKLE_TREE_LAST: 0x05, + MESSAGE_LAST: 0x10, } export function signIsLastAPDU(type) { - return (type === PAYLOAD_TYPE.LAST || type === PAYLOAD_TYPE.MERKLE_TREE_LAST) + return (type === PAYLOAD_TYPE.LAST || type === PAYLOAD_TYPE.MERKLE_TREE_LAST || PAYLOAD_TYPE.MESSAGE_LAST) } /* @@ -45,11 +46,21 @@ function signGetChunksv1(path, options, getVersionResponse, message) { return chunks; } -function signGetChunksv2(path, options, getVersionResponse, message, scriptHash) { +//ExtraInfo is either +// - script hash from merkleIndex - initiates transaction signing with metadata +// - "Sign message" - initiates message signing +// - anything else - initiates transaction sining without metadata +function signGetChunksv2(path, options, getVersionResponse, message, extraInfo) { const serializedPath = serializePath(path, getVersionResponse, options); const basicChunks = prepareBasicChunks(serializedPath, message) + if (extraInfo == "Sign message") { + basicChunks[basicChunks.length-1].type = PAYLOAD_TYPE.MESSAGE_LAST + return basicChunks; + } + // We try to find hash in the merkle tree. If it is not there, we send the tx without metadata (arbitrary tx signing in expert mode) + const scriptHash = extraInfo const merkleI = merkleIndex[scriptHash.slice(0, 16)] if (merkleI === undefined) { basicChunks[basicChunks.length-1].type = PAYLOAD_TYPE.LAST diff --git a/tests_speculos/test-messages.js b/tests_speculos/test-messages.js new file mode 100644 index 00000000..16b1df3e --- /dev/null +++ b/tests_speculos/test-messages.js @@ -0,0 +1,111 @@ +'use strict'; + +import { testStart, testEnd, testStep, compareInAPDU, compareOutAPDU, noMoreAPDUs, compareGetVersionAPDUs, getScriptName, getSpeculosDefaultConf, humanTime } from "./speculos-common.js"; +import { getSpyTransport } from "./speculos-transport.js"; +import { getButtonsAndSnapshots } from "./speculos-buttons-and-snapshots.js"; +import { default as OnflowLedgerMod } from "@onflow/ledger"; +import { fileURLToPath, pathToFileURL } from 'url'; +import assert from 'assert/strict'; +import pkg from 'elliptic'; +const {ec: EC} = pkg; +import jsSHA from "jssha"; + +const scriptName = getScriptName(fileURLToPath(import.meta.url)); +testStart(scriptName); + +const speculosConf = getSpeculosDefaultConf(); +const transport = await getSpyTransport(speculosConf); +const FlowApp = OnflowLedgerMod.default; +const app = new FlowApp(transport); +const device = getButtonsAndSnapshots(scriptName, speculosConf); + +const ECDSA_SECP256K1 = { name: "secp256k1", code: FlowApp.Signature.SECP256K1, pathCode: 0x200 }; +const ECDSA_P256 = { name: "p256", code: FlowApp.Signature.P256, pathCode: 0x300}; + +const SHA2_256 = { name: "SHA-256", code: FlowApp.Hash.SHA2_256, pathCode: 0x01}; +const SHA3_256 = { name: "SHA3-256", code: FlowApp.Hash.SHA3_256, pathCode: 0x03}; + +const path = `m/44'/539'/0'/0/0`; +const options = ECDSA_P256.code | SHA3_256.code + +await device.makeStartingScreenshot(); + + +// We get pubkey so we can verify signature +testStep(" - - -", "await app.getAddressAndPubKey() // path=" + path); +const getPubkeyResponse = await app.getAddressAndPubKey(path, options); +assert.equal(getPubkeyResponse.returnCode, 0x9000); +assert.equal(getPubkeyResponse.errorMessage, "No errors"); +const pubkeyHex = getPubkeyResponse.publicKey.toString("hex") + + +{ + const message = Buffer.from("This is a nice message that has only displayable characters and is short enough to be displayed") + + testStep(" - - -", "Message with displayable characters"); + const signPromise = app.signMessage(path, message, options); + await device.review("Review message"); + const signResponse = await signPromise; + console.log(signResponse) + assert.equal(signResponse.returnCode, 0x9000); + assert.equal(signResponse.errorMessage, "No errors"); + + let tag = Buffer.alloc(32); + tag.write("FLOW-V0.0-user"); + const hasher = new jsSHA(SHA3_256.name, "UINT8ARRAY"); + hasher.update(tag); + hasher.update(message); + const digestHex = hasher.getHash("HEX"); + const ec = new EC(ECDSA_P256.name); + assert.ok(ec.verify(digestHex, signResponse.signatureDER.toString("hex"), pubkeyHex, 'hex')); +} + +{ + const message = Buffer.alloc(1000, 0x40); + + testStep(" - - -", "Message too long to display"); + const signPromise = app.signMessage(path, message, options); + await device.review("Review message"); + const signResponse = await signPromise; + console.log(signResponse) + assert.equal(signResponse.returnCode, 0x9000); + assert.equal(signResponse.errorMessage, "No errors"); + + let tag = Buffer.alloc(32); + tag.write("FLOW-V0.0-user"); + const hasher = new jsSHA(SHA3_256.name, "UINT8ARRAY"); + hasher.update(tag); + hasher.update(message); + const digestHex = hasher.getHash("HEX"); + const ec = new EC(ECDSA_P256.name); + assert.ok(ec.verify(digestHex, signResponse.signatureDER.toString("hex"), pubkeyHex, 'hex')); +} + +await device.toggleExpertMode("ON"); + +{ + const message = Buffer.concat([Buffer.from("This is a short message with a non-displayable character"), Buffer.from("ee", "hex")]); + + testStep(" - - -", "A message with non-displayable characte"); + const signPromise = app.signMessage(path, message, options); + await device.review("Review message"); + const signResponse = await signPromise; + console.log(signResponse) + assert.equal(signResponse.returnCode, 0x9000); + assert.equal(signResponse.errorMessage, "No errors"); + + let tag = Buffer.alloc(32); + tag.write("FLOW-V0.0-user"); + const hasher = new jsSHA(SHA3_256.name, "UINT8ARRAY"); + hasher.update(tag); + hasher.update(message); + const digestHex = hasher.getHash("HEX"); + const ec = new EC(ECDSA_P256.name); + assert.ok(ec.verify(digestHex, signResponse.signatureDER.toString("hex"), pubkeyHex, 'hex')); +} + +await device.toggleExpertMode("OFF"); + +await transport.close() +testEnd(scriptName); +process.stdin.pause() diff --git a/tests_speculos/test-messages/nanos.01.png b/tests_speculos/test-messages/nanos.01.png new file mode 100644 index 0000000000000000000000000000000000000000..7f6ab5e6010052a6c826d8a33994eba6cf7bbeed GIT binary patch literal 380 zcmV-?0fYXDP)uRr;yTsQ43OPlRlX!mA#zXLNU2R?VwJ6)EF1I*s6nq^p&4PTTOSmPEMbE{jtppwY z^J4|+t@vhuNa?L)$#$MM!@0Ht2hgw^YzuAo0F>?KHP7%21er<@_~X;u1W_f`a9 z&)8tifC~e#OpaQ*=)Jj^nQ=S=L>0_r)pnQRorNTQ`GlD2lQ9F#qKh$G{-E9;9g9Bp zfE@Dtsj?-U1BU#LN1Ji&^64|f)*teIloz|6`X;Q;vRtl7O23!MRe)b>R26NZxKMI1Ti_fPP_|S)BUgn(pc|>G-)u}q>$H$;KLOdT!H=n0s?Ua_0CyfJ zId*%I;Qze-1Zsk#j6+}*63;*4C4g1MZ9&a|54uxkAJ0akh#KL(*DFDedo33Zy-sq_ zi<(8xp-$Ktx?^C}!DZoAI0NVW%Z(^yQ`F_UeG9A)FHeNA4?rUsK4%~y$dLSnp60r` zVB)d4q8k2iPZcO3ip{F4M`7NgE8)?P=u`y1f=~jp#H0r!KpxIEh4xWqv z(WwYN(;y+ZIpQp!>BkrX-IP@BRF}7aauyaA78YzV;)mz<;n7hL1I572J=Q3;A#S^O z49uk%dOt(apla~CF+mr@9s{>`3{<%(WRRC)=VkU__#6=Rj$wq6;xQ|9^0c-oo>o61XCv*^GBpihzoWx0Z0kzJ=u-ys&Q}gp)#A(hbpcw0?Zf zWN57rLQ+~9Y7E_}!;Wam##fql6L8teEc$G!k z;d@RbJN(W7aED4IQj;RDvt~F@GB%KSSTcPVGW$&ACkO!iQ z8vs27yhSbjP;`J=@&04wvG;&J|8PiF{H(jKfT~?c`YR&-X`*N6^$t+G8gHL>2v1Br Z2!EWZyV}X2qm2Ln002ovPDHLkV1kO~3eo@o literal 0 HcmV?d00001 diff --git a/tests_speculos/test-messages/nanos.04.png b/tests_speculos/test-messages/nanos.04.png new file mode 100644 index 0000000000000000000000000000000000000000..f9c1e1e8c0bf14c28045600dc4bb581e9df5eaa0 GIT binary patch literal 542 zcmV+(0^$9MP)x`xmLI!_AZhK2Y0u*VQ#DZ4Z35XhiUo2AJ>WtD{niz^{cI7h|g|2)vHPQ98C-q za(sZIS+HEb%Q(HJDTk~`KN_K+eMvZfSvuu$kjtyHMlJX%70?1FqwO>z$S z@1q0EN3L$ispddMK03gh>l`>uJ3x{Nps^{;AJo+Fx+3g}IF8>~K zzhRaAS`H?-=QM1i=Tu6{1-oD!M<5AJP1 literal 0 HcmV?d00001 diff --git a/tests_speculos/test-messages/nanos.06.png b/tests_speculos/test-messages/nanos.06.png new file mode 100644 index 0000000000000000000000000000000000000000..7f6ab5e6010052a6c826d8a33994eba6cf7bbeed GIT binary patch literal 380 zcmV-?0fYXDP)uRr;yTsQ43OPlRlX!mA#zXLNU2R?VwJ6)EF1I*s6nq^p&4PTTOSmPEMbE{jtppwY z^J4|+t@vhuNa?L)$#$MM!@0Ht2hgw^YzuAo0F>?KHP7%21er<@_~X;u1W_f`a9 z&)8tifC~e#OpaQ*=)Jj^nQ=S=L>0_r)pnQRorNTQ`GlD2lQ9F#qKh$G{-E9;9g9Bp zfE@Dtsj?-U1BU#LN1Ji&^64|f)*teIloz|6`X;Q;-(XN&`1qW;=fUzejC5Pixj+Y@>hMZkK>U^B54}7{) z()8>x8o+;;faY30Z_bT-w_n$o1THg=XP^ls+9+a<>y&+@LTP;z9?x>Tx^*^-0yg0V zY)ZLbRY9wj>kN(3Bv78)RKDI>*kCA3Of&2dWxQq=Bjhw1f096piSCHt{`w; zG|hq{kJKD}cUrg`8&aY=@11`JyTWlz7;MVU!{3x?G=Yw{UuK1%`XN1saG@df+BD8H zQ)++;(}3~Esd>hd8V~1*z0!wiSQ~==7Cu)qrMAVRu<0=O zhwF#l&d9ZH+M5e5=aO7SW0rE;;EIC|5Ytm5I9UP1Gu_r+ z{|;!h9fErF+tLhiB_UqH=^@dtV;U7vg9pSYA(1xJ14t2$!2C3{lQ!uwlpdHPt3Gf^&kef5hbbj8}Y@L~F)_0-9ggqpXqoy3Q8yg!Ns}Z3h zJmom4;}d6qr^u?Ukh6i43MN0HS*#_C=m&l`$17+`LY#z?gb10-Q5O;PrJ<%tNLQG7 z5w{iE7K;&gAjJjA9S6(t^P6I`F=4Rsm=1k3KB|w;T4pSBN?wkcAqYBPAu<7;7w6#> zv{*rSHz@H$-g@Tb4*=Q)1R>8mu!IY0V6x}@FkFLGrS%tllKci1;d6+mp<19IzdP`M r2s}#2D090c(oo`dG@p;$Gl5!jR>|&`LPUb0p zOAW16w^3IZzpw$A*xC=L-Th154oaTHX(p>BA5}_A3Yfz>CC}X0F}6dz?T!pOzdrD& z{=gO)4LJ3{D)50!=P6&nm3dD|-IHOc{*@-m#|Z_LV;%{!a=6mt(yTN0g;$n-kfbUd zr+Ia#0QXcjGx1&N?0UqwGQYk*^LG%6$^^E!9U-N;BTSs#W4XUymS+WA2FV=43Fctt zkvdJZ^0Xt&QdX@$q~<$M`+kgk;6Xlw;bpV@EdH^xS-1@w#f2Ls&?RLerbt`3P|EA9 z>4qw6I!s0ly26$lZn&C`R(B?sNL$rv$K6zwHN9e@Hv2UTyUo%KX7kl#X=QOvx4yb; z%9iQkO52gkm16_I#j&Ee`~ahyWHq0>8(6ly=9>3QNojdotv0}Ifcer(qPH;_gsVEY zWK~WwYDTb)2V6s$j`yq&@?0@7A{&p$GhiZ^dJ-WU4{iha10cbwcOHZ4JrbDX74ots zCmCbkt5{fASa<-qQ3M0rf0Ofr)UKqwe%F{pTI6RH&jM~T@%*4~)X~zhON62XddnwM@J+Pum5=yh!gWRVD9`t9a>CukMUtm6c!f3 Z@dtW5MU$fSh7$k)002ovPDHLkV1iyzDHs3% literal 0 HcmV?d00001 diff --git a/tests_speculos/test-messages/nanos.09.png b/tests_speculos/test-messages/nanos.09.png new file mode 100644 index 0000000000000000000000000000000000000000..006c26abaac6c76b2e871b194165596c0b416694 GIT binary patch literal 249 zcmeAS@N?(olHy`uVBq!ia0vp^4M42G!2~2j9iA5fsRN!ajv*Cu-d?-N*JQxc`taO| z-}VOL1%{U&gdOO)vH0QtN3CIpH=On}yd9NxI9#@L#=GYozkR+NZ@s(h_s<*5szDx| zmTO$v85!1fT#rxFzI@yL`PcK^*L-*W3fIF8>~K zzhRaAS`H?-=QM1i=Tu6{1-oD!M<5AJP1 literal 0 HcmV?d00001 diff --git a/tests_speculos/test-messages/nanos.10.png b/tests_speculos/test-messages/nanos.10.png new file mode 100644 index 0000000000000000000000000000000000000000..7f6ab5e6010052a6c826d8a33994eba6cf7bbeed GIT binary patch literal 380 zcmV-?0fYXDP)uRr;yTsQ43OPlRlX!mA#zXLNU2R?VwJ6)EF1I*s6nq^p&4PTTOSmPEMbE{jtppwY z^J4|+t@vhuNa?L)$#$MM!@0Ht2hgw^YzuAo0F>?KHP7%21er<@_~X;u1W_f`a9 z&)8tifC~e#OpaQ*=)Jj^nQ=S=L>0_r)pnQRorNTQ`GlD2lQ9F#qKh$G{-E9;9g9Bp zfE@Dtsj?-U1BU#LN1Ji&^64|f)*teIloz|6`X;Q;N2PZibzUHk|asKmB*xc&I8T)nlx!ARp-Il z{tO+RGHx+bj5UI}4glalJYMoQv=Dh{JP$#hy8(-lxws}=JyB<@L+SPUv!`=2=b7d_c{t+~xhV|KW2$tHVdc z;vM4q03GIrAdGnY31Ue36k-?@r!x*{cPv_T2iV77Jn6Ns;i}SZ5%De+_k>4>5WaW7 zv=DULY%)yuC48B^B_>h`^4sy7wrU(R-m((_FBiXYKe+M#rALW9-);MT2WWDh{P&L4 zo|z~+`$;7L{?Lc^B!CiE+Or^@x^X`lPU0P#JZjeoV%?Xrs2Eq-$q=iEIv`*>Eg9g) zNNeFk`ER3LQ{?uSuvh_h_PTT%E(X+Z<6UY`ggfpRd4SLfXx&YIc~60e$crz*%QEUV zEWHCTIO!r0CSbw)yw9f;G)@u1A53~AKr&ym5+>|0gn zvW5LiL&|L@q&w=vhL<*jGs|g>G7NKF3d;VdJ5jk$xaSe?lM~j|DosAV`Wu@8S`9uU z7q5`tC&=KNf=XccGhj+N3z!Dsa!P;>=c0?w06qL+r021UsZzT};8_ZN!XiT#wtIkE z3c77I+0F1Fd|15&Dkufn_4rG!+K-xVMFh~z#je~F9sesW%JliE+s`wg*3VM^-to1^ zlZt0Qc@IKf^r=1QppsYGs~}mrNjsfxB>j1yZ}=KqcM%IxO8sSMhc_L*Xv%nkE?-+6 z4qU!6ZjS)?0&E-wUo@FEb06h8YM+1M%tLfVK&xBTUK6_~XJ&)*FYo)A#lDDHUg(VT z-^2hehw$l1KxQq6Md#r4Q9h})tm62Gjml@sT4N9dK@bE%a5eu4`0Nl|44q&A0000< KMNUMnLSTY>a@(5# literal 0 HcmV?d00001 diff --git a/tests_speculos/test-messages/nanos.13.png b/tests_speculos/test-messages/nanos.13.png new file mode 100644 index 0000000000000000000000000000000000000000..7f6ab5e6010052a6c826d8a33994eba6cf7bbeed GIT binary patch literal 380 zcmV-?0fYXDP)uRr;yTsQ43OPlRlX!mA#zXLNU2R?VwJ6)EF1I*s6nq^p&4PTTOSmPEMbE{jtppwY z^J4|+t@vhuNa?L)$#$MM!@0Ht2hgw^YzuAo0F>?KHP7%21er<@_~X;u1W_f`a9 z&)8tifC~e#OpaQ*=)Jj^nQ=S=L>0_r)pnQRorNTQ`GlD2lQ9F#qKh$G{-E9;9g9Bp zfE@Dtsj?-U1BU#LN1Ji&^64|f)*teIloz|6`X;Q;NklfC7o(dmV!Vp5NwEYI9_zToStRK*|kTV%eiF4)tx<^ zUX%Dyy*Ly(Q(;j=WN zNs2sNb9C>ta5p!kM0MVUza~$`#&uv~lM7GZDc5KM1G`UEA*fv>@(7a|QZJ_g-%PGS zRG5Yse?ZL@S86`M7klL#%CI&B{Vlw)vf20}aO+`SrW+Li!VTmEw3JjEeodRNg%2?b zlv-#dlD%4FFQUT}`tfVwez;0ZM6w|Ft&b)rZAR2({YYNn${5?)=2YSYa+sB9S*mk1 zgDC83Fd{(cQoBZ7zY$k$gdo@(QXUXBlPEs%IdT;m~H@~)M!1;%0M?+&${_QuA>#%JRZ z9?=HAHppr{-4HTUNs>aUriWO}jfPmF;I{D6DXfxcsN-EAYO>A zDcS36O-WQl*O~rbn`PMUbc=Z8SA=XhJkAoKN%)j(D^uL%7sZ8G2w+8hn1AIb2#HP@ zu`&1u1W`p+VER cv9XcI50{gGV8O*LT>t<807*qoM6N<$g4u{9c>n+a literal 0 HcmV?d00001 diff --git a/tests_speculos/test-messages/nanos.15.png b/tests_speculos/test-messages/nanos.15.png new file mode 100644 index 0000000000000000000000000000000000000000..5c1baf5eacb379216ec8018e3409771a61da1cca GIT binary patch literal 641 zcmV-{0)G98P)afh3$Jcj^?Wn$XM+Bwa2ZrJU z*2qY}p$Faq8^~~W*#TGPJp^%0h9TOQtH_5A36x_VakDVEkYkc8Gxxcdr+yHmA{~c$ zai{?EM7Cz&o5I;N#JDoQzK?MqOhusrYut`0sky^V9NlBFzh7Q^Ih;Gm9Kr#{VC1P~ zHlf97hnx9aG5?T~?>z1MF|xrY*)R>SHp}1Qhn3C3^HASO_^VDcj+%9Kx)d?jb8(_c z9cdD_#1qU-E>ZBM5D2%{T#N*hmcECkc@TS><;<#Fe2B;E0Tb^LgI9u|Cuq?TFYjbc z#jqLdWCW4>M#}(9ZnUav^62It?USM>|0)!8FxmJ3%YTJTSiy%P}u- zG=XAw#MH(i`zyWhTL9*ADW)T)%T!EBUxevR0b*S_hEN8(mb;QAWAIx5@DCrR5H%J3 zj@^qsh<{${!o4YofhiIJwC>2A5(qqR0lYBY9l52y;@1n}>wC<`q*w9`z;m0#8QK>X b7B2Vz@=T?*ivaf?00000NkvXXu0mjf$}A=O literal 0 HcmV?d00001 diff --git a/tests_speculos/test-messages/nanos.16.png b/tests_speculos/test-messages/nanos.16.png new file mode 100644 index 0000000000000000000000000000000000000000..d4fe3ec9f027d4681d2aadaff529572401be1ce0 GIT binary patch literal 546 zcmV+-0^R+IP)$Owo{*66F0#=TJ3d((e1Uea7540jb54 zy(!IEwF~VCHkE3}v2S$Uq|4L6n~LIGaRxe8jH&-_MWjf_Xd!7!>8} z?y~O;fDr&anG6f=dEoM6@4m(aK@h0m7H&BW$K?dFx}e-Z^y+A?-UH5cu2VE+2|?NF zpw}e}9&MFgxcvl{TcrdVJ6BCV*0xF)`ra2TWUAflReNv}>j4-5jtyBtC|g;%z@Qmp zS;wOmU^)P>)|gQ763fT9c%7#c(*dZquQ;xgPn7*jG-)V#iZi9Aglw)?M`Ixfg5Ynl z%o-r`#Y!@uCftbCNSz|b&wM$@ZJv^*+%gNHmI5WRn(`H{MpE6#?HFVUS)`H~eOw<< ziXd@$;d}=y_5pZ?+D=SiT^hD8_&i{0#uFQw2{m_1b9KT(@}SF9(`UI*%2^x2XeT`O zLVvPshfQ_)p!As=RHKkT>lvWzn)x!3`QCMTem|AOi0K(1FBjR-+%L+7n@cfaWoa@7 k$D)D!>y&>Q8U(lI11vtpEfG`QQ2+n{07*qoM6N<$g4n?Q4*&oF literal 0 HcmV?d00001 diff --git a/tests_speculos/test-messages/nanos.17.png b/tests_speculos/test-messages/nanos.17.png new file mode 100644 index 0000000000000000000000000000000000000000..006c26abaac6c76b2e871b194165596c0b416694 GIT binary patch literal 249 zcmeAS@N?(olHy`uVBq!ia0vp^4M42G!2~2j9iA5fsRN!ajv*Cu-d?-N*JQxc`taO| z-}VOL1%{U&gdOO)vH0QtN3CIpH=On}yd9NxI9#@L#=GYozkR+NZ@s(h_s<*5szDx| zmTO$v85!1fT#rxFzI@yL`PcK^*L-*W3fIF8>~K zzhRaAS`H?-=QM1i=Tu6{1-oD!M<5AJP1 literal 0 HcmV?d00001 diff --git a/tests_speculos/test-messages/nanos.18.png b/tests_speculos/test-messages/nanos.18.png new file mode 100644 index 0000000000000000000000000000000000000000..7f6ab5e6010052a6c826d8a33994eba6cf7bbeed GIT binary patch literal 380 zcmV-?0fYXDP)uRr;yTsQ43OPlRlX!mA#zXLNU2R?VwJ6)EF1I*s6nq^p&4PTTOSmPEMbE{jtppwY z^J4|+t@vhuNa?L)$#$MM!@0Ht2hgw^YzuAo0F>?KHP7%21er<@_~X;u1W_f`a9 z&)8tifC~e#OpaQ*=)Jj^nQ=S=L>0_r)pnQRorNTQ`GlD2lQ9F#qKh$G{-E9;9g9Bp zfE@Dtsj?-U1BU#LN1Ji&^64|f)*teIloz|6`X;Q;G)@u1A53~AKr&ym5+>|0gn zvW5LiL&|L@q&w=vhL<*jGs|g>G7NKF3d;VdJ5jk$xaSe?lM~j|DosAV`Wu@8S`9uU z7q5`tC&=KNf=XccGhj+N3z!Dsa!P;>=c0?w06qL+r021UsZzT};8_ZN!XiT#wtIkE z3c77I+0F1Fd|15&Dkufn_4rG!+K-xVMFh~z#je~F9sesW%JliE+s`wg*3VM^-to1^ zlZt0Qc@IKf^r=1QppsYGs~}mrNjsfxB>j1yZ}=KqcM%IxO8sSMhc_L*Xv%nkE?-+6 z4qU!6ZjS)?0&E-wUo@FEb06h8YM+1M%tLfVK&xBTUK6_~XJ&)*FYo)A#lDDHUg(VT z-^2hehw$l1KxQq6Md#r4Q9h})tm62Gjml@sT4N9dK@bE%a5eu4`0Nl|44q&A0000< KMNUMnLSTY>a@(5# literal 0 HcmV?d00001 diff --git a/tests_speculos/test-messages/nanos.20.png b/tests_speculos/test-messages/nanos.20.png new file mode 100644 index 0000000000000000000000000000000000000000..85d9725b420f3973268d5c660e9e7c5f486f4adf GIT binary patch literal 483 zcmV<90UZ8`P)N2PZibzUHk|asKmB*xc&I8T)nlx!ARp-Il z{tO+RGHx+bj5UI}4glalJYMoQv=Dh{JP$#hy8(-lxws}=JyB<@L+SPUv!`=2=b7d_c{t+~xhV|KW2$tHVdc z;vM4q03GIrAdGnY31Ue36k-?@r!x*{cPv_T2iV77Jn6Ns;i}SZ5%De+_k>4>5WaW7 zv=DULY%)yuC48B^B_>h`^4sy7wrU(R-m((_FBiXYKe+M#rALW9-);MT2WWDh{P&L4 zo|z~+`$;7L{?Lc^B!CiE+Or^@x^X`lPU0P#JZjeoV%?Xrs2Eq-$q=iEIv`*>Eg9g) zNNeFk`ER3LQ{?uSuvh_h_PTT%E(X+Z<6UY`ggfpRd4SLfXx&YIc~60e$crz*%QEUV zEWHCTIO!r0CSbw)yw9f;uRr;yTsQ43OPlRlX!mA#zXLNU2R?VwJ6)EF1I*s6nq^p&4PTTOSmPEMbE{jtppwY z^J4|+t@vhuNa?L)$#$MM!@0Ht2hgw^YzuAo0F>?KHP7%21er<@_~X;u1W_f`a9 z&)8tifC~e#OpaQ*=)Jj^nQ=S=L>0_r)pnQRorNTQ`GlD2lQ9F#qKh$G{-E9;9g9Bp zfE@Dtsj?-U1BU#LN1Ji&^64|f)*teIloz|6`X;Q;`q0{{R30002+7GHNy-~z3+ zxOVp&XYz#ayC?9f9DPMUcTeCNatlAGwxGj>ub2kO7Np*GGT|1~*LzQf;@a;dD_|$W z6|hGmlB|HC;pp}s0002s9p=4D>BG2Ty6&!i@L*=GwLE`;ov?JcXMGvPA0@dH4((5V zxxTI-O4%e5a2CGYj^^vb+lmmY0C%6mH>V_zM8|-(kd#;+t=%7JaK(0f%eWPL}q1q`rz3aP}SG$xsuId|*u#6EJu@eCs<4_8%*o zfT0NDWjr0rBa1hpifWIAL(vMrR?04a0000006xwyJ@(1R7Nm>p00000NkvXXu0mjf DP-wNr literal 0 HcmV?d00001 diff --git a/tests_speculos/test-messages/nanox.02.png b/tests_speculos/test-messages/nanox.02.png new file mode 100644 index 0000000000000000000000000000000000000000..2689ddb23270a26a35f8ff07481a8bca2379a633 GIT binary patch literal 420 zcmV;V0bBlwP)nlAi|(~vR+WluX=;uO@@dz*}mYrjdk1MVd8 z4!B1mO1T3}!pWO|0001hZy4_`fr@cvaQCP*j6_8LoNyPhJH>jc)~c6UvQotO@@x7! z?0BP#HV17C;da1APe&#@nU=1%uljn?St#5NScRsyn+G_K1kbz#nca1-z}Ip_!U z5p6QeH0bUJjER0pl!DI2PUj!@xOd}7!u<_3Lo|*1LwMR4@DK(706=;o65)P}tfE}R z+8zCAX<;m`?Qd%17e;%{5U3QPV>cErb>LRv+xHqD`{0i`ELJhj#OqXY-}eet5Y=K$ zfN^b+23gt%1xi8PDuVm;z3)|`)<+{wKvA(i^)K^UF8}}l00000|H2<88sc?;>f&_( O0000N<|&{NwR> zSS7b}97k!)X`xl3zESME{08dUpX^Ze-%RO!(G#FnAAf!ju`Hl8pvKuNjL+ns8PZy`mNd z65j!3@KFO%J52t)vCReZH!1Lv#t~Ay8|)-EqEa9}qHfV~2m_PIxia_b4HR zkN}QXa-k~OR26PptipY9W)MjqJsUBQCASU$JOcS|&!cibW$o;+p62O=^Ix^3Y0L${ z45;H$bHCaVtS+?(8glAsYPQt+Rh7i2BCNeW76^=N-Kx|+6A4;y8qsG=a0ldhXY~OP zh)T70Pj)q>noX@OZyq^#jG2;(u#Ut00{b9L#g=y*^2iy`3?P{1ngay-xgw8| zr#2NV+Vv}xsac@}S@kZXazp$d>*gbRe}qfBCFLo-KTe%Bz`~9qG6zPXJ83wXeK3{# z-8*8zGV52mX~mgv$NStrQdTkjOc-n<)g6r`Q;S)Jp1mHZo}Sw!kO+D+)HGz$hB;0j zj?}fPUrmvQv-Dz?Mfk$-Mx%9?dqI77mDRc;BeXfYbU-*EeSmK>hOj6E)roRd;8GQ< zuC)kvCrZhk%noHA8-mE&NNQbU zv67cKfr@{v_nE`OnSJyK`}J6lZb^R%w#bH-_!BRkmk%aX8DXyua9tnMzepZEX(002ovPDHLkV1n9JZrA_- literal 0 HcmV?d00001 diff --git a/tests_speculos/test-messages/nanox.04.png b/tests_speculos/test-messages/nanox.04.png new file mode 100644 index 0000000000000000000000000000000000000000..7e49f56fd264dd1ff1b92fa5440aaa83712b341b GIT binary patch literal 780 zcmV+n1M~ceP)YgJ~7 z^p~-C6jNuwGoV;cRbN}CTz@3u_cD)OMLC?`AWa${LuLTW(_&?2l-|*o2uBr4k!n^c zAt9Xj4k#BNb|Io8y>#3?c&RI;o?yLWbe5%`0+)N1QA<$M@6}(*`lC~=RGrOaO0h=9 z1%vo)C_4k#$mt8hdLmn#wva6@ErV>m`)sV&kaMmAtZ_Ygzodj1dHAk#K-91e9R86@ z&}5_~2mk=UVn&}|rXd~uqBv<6v`MGNM*C6s0Zsjqs_jO}lPxQmVh>_$sU#o4s1fO^ zU?r8OboJaK%o%O6nVWM(FZHJJz06ZXQ>(?j-_x{42WI#p_WpKkY6qm2yxb)|H!oXQ z?*yv(N-cIy3c|few{lz6QqKT)e=4D`vacAC6v{-DNWD7CUkXN_I)ZS+y_@XwJ{!@= z@cuLySHt_0K_9FHtI$dsPDURLWr%yv>a(cUM%h_*5Zklc=C{hDhANMxSV7SuZH5@9 zzm=1nQZ=nzKhWt7i>FJZY$md%9CnOasZr_l<#Y(8PBHGi3aD5fVRjn5?e}y*hzh71 z59E=LV$DkQR^$)DbF{|y*q@m$!7~FaamFH!(y?ijRHbZsT^#cF^*a+W)r@+0 z-MLD@)a6M_b+?66MD;Cjcxr#=9h|TH_8|Oa)c|0000< KMNUMnLSTZKo@qY- literal 0 HcmV?d00001 diff --git a/tests_speculos/test-messages/nanox.05.png b/tests_speculos/test-messages/nanox.05.png new file mode 100644 index 0000000000000000000000000000000000000000..1e4be69934787c368c2b5ed677cc7f5a2470be3b GIT binary patch literal 355 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|`hpba4!+nDh2#G+&c}K^PbX0`eJS}y70`%8T>n^%dV>bk>TM}C(cF@9*Jbj^5WTF;gKGIO)y zjlJ*9*PE9W@jdm~5r5wEu#TD8y6+Pnh8_O<-8#^Bx$bnOy3REWn^jXeAFev)TXe-F zTky7j?62N_lL@yzwx7O!=&4O1W7^|)7fcr%%i5*3D%0_G;tl)cpW3Io3*7!cdXW1o sV&B=e%knGs=l(tai5cc!1_ryAe9w9}zGZ%X&;TUp>FVdQ&MBb@086r+N&o-= literal 0 HcmV?d00001 diff --git a/tests_speculos/test-messages/nanox.06.png b/tests_speculos/test-messages/nanox.06.png new file mode 100644 index 0000000000000000000000000000000000000000..dbbdb276b0c5dc45bbcf2bcd75d07d53f0a031f5 GIT binary patch literal 409 zcmV;K0cQS*P)`q0{{R30002+7GHNy-~z3+ zxOVp&XYz#ayC?9f9DPMUcTeCNatlAGwxGj>ub2kO7Np*GGT|1~*LzQf;@a;dD_|$W z6|hGmlB|HC;pp}s0002s9p=4D>BG2Ty6&!i@L*=GwLE`;ov?JcXMGvPA0@dH4((5V zxxTI-O4%e5a2CGYj^^vb+lmmY0C%6mH>V_zM8|-(kd#;+t=%7JaK(0f%eWPL}q1q`rz3aP}SG$xsuId|*u#6EJu@eCs<4_8%*o zfT0NDWjr0rBa1hpifWIAL(vMrR?04a0000006xwyJ@(1R7Nm>p00000NkvXXu0mjf DP-wNr literal 0 HcmV?d00001 diff --git a/tests_speculos/test-messages/nanox.07.png b/tests_speculos/test-messages/nanox.07.png new file mode 100644 index 0000000000000000000000000000000000000000..2689ddb23270a26a35f8ff07481a8bca2379a633 GIT binary patch literal 420 zcmV;V0bBlwP)nlAi|(~vR+WluX=;uO@@dz*}mYrjdk1MVd8 z4!B1mO1T3}!pWO|0001hZy4_`fr@cvaQCP*j6_8LoNyPhJH>jc)~c6UvQotO@@x7! z?0BP#HV17C;da1APe&#@nU=1%uljn?St#5NScRsyn+G_K1kbz#nca1-z}Ip_!U z5p6QeH0bUJjER0pl!DI2PUj!@xOd}7!u<_3Lo|*1LwMR4@DK(706=;o65)P}tfE}R z+8zCAX<;m`?Qd%17e;%{5U3QPV>cErb>LRv+xHqD`{0i`ELJhj#OqXY-}eet5Y=K$ zfN^b+23gt%1xi8PDuVm;z3)|`)<+{wKvA(i^)K^UF8}}l00000|H2<88sc?;>f&_( O00009k)x0T6td94(P;D&k! zKw4#gWgJpMLhs7W9Wk51&3+pM&@EBQjnLR zAw2(ZhD@a^OhvvWnpj9!Nmu{_shI8(V&#uz7`dR4O2eohxi}{hkMfz11=dTfONg}^gvd?>A1z5 zU;^M>EanOx?Lfob_XYD(*tHd`>j@Ql!NUVH(Y$I!5cpu}!?f7Z3Mu1uuKBK$aJabk zbu`^@E>z3OeR9^>atG{Nl5cfHNM%UNH~~Wl<-yYGq;_EZdD}k~!o6nyD-;YBhS*lA z$E-IjOvAhG<1fJ-5&^PQ}%+76q)y zUChuB^?K|}JQH*X1%t1$Xk>apQYNVAdZxOY^GYYGLDFuhS3y~WdS9vA;$iL;kak0@ z2s0 zaXmd%14~{IK|HXu^3)d}skYFp6(d8nx2S4J6ELAZJUWW+SZpZeGn>AqHET)mzGT|< zOl2Nv0u&!{U~W0XPA6pWn$zaxitFjI(Tw}ND&Tcmez4D#kd?Ok$g0}-b+m$#PjUfD2CFs% zmA6VFIc+@}8a8A$18UgSop(01lKevwes9P4OUNk^<#MpIFLUQH9GefK8K6@2I+-EQ z+R&!>62n;$tIn$JQp$NHLv&8j3;z+FX(rHtdh?^wUo>J1;U(?IcFDvc6 z$7mIu*PIAFV$UKa+yhMRI<~%^!A*EG*7qm?0IXp7JK$88Cery)JCt&+-|bQFwCb$) zeh>K{UVy4*c^l90l0=d{^@stZUZSB!oCyLL+}(Y8i0;qEgC+3LHYpPyMfv@ zbjrOPGl|+v^=*i^TIX%^mUxAf{PUPj#{1h)T#ffPLkymTD)b}+CliCE;9dX#00000 p000000000000000004kxd;@G1)Az}O6S)8Y002ovPDHLkV1g}R_CEjs literal 0 HcmV?d00001 diff --git a/tests_speculos/test-messages/nanox.10.png b/tests_speculos/test-messages/nanox.10.png new file mode 100644 index 0000000000000000000000000000000000000000..1e4be69934787c368c2b5ed677cc7f5a2470be3b GIT binary patch literal 355 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|`hpba4!+nDh2#G+&c}K^PbX0`eJS}y70`%8T>n^%dV>bk>TM}C(cF@9*Jbj^5WTF;gKGIO)y zjlJ*9*PE9W@jdm~5r5wEu#TD8y6+Pnh8_O<-8#^Bx$bnOy3REWn^jXeAFev)TXe-F zTky7j?62N_lL@yzwx7O!=&4O1W7^|)7fcr%%i5*3D%0_G;tl)cpW3Io3*7!cdXW1o sV&B=e%knGs=l(tai5cc!1_ryAe9w9}zGZ%X&;TUp>FVdQ&MBb@086r+N&o-= literal 0 HcmV?d00001 diff --git a/tests_speculos/test-messages/nanox.11.png b/tests_speculos/test-messages/nanox.11.png new file mode 100644 index 0000000000000000000000000000000000000000..dbbdb276b0c5dc45bbcf2bcd75d07d53f0a031f5 GIT binary patch literal 409 zcmV;K0cQS*P)`q0{{R30002+7GHNy-~z3+ zxOVp&XYz#ayC?9f9DPMUcTeCNatlAGwxGj>ub2kO7Np*GGT|1~*LzQf;@a;dD_|$W z6|hGmlB|HC;pp}s0002s9p=4D>BG2Ty6&!i@L*=GwLE`;ov?JcXMGvPA0@dH4((5V zxxTI-O4%e5a2CGYj^^vb+lmmY0C%6mH>V_zM8|-(kd#;+t=%7JaK(0f%eWPL}q1q`rz3aP}SG$xsuId|*u#6EJu@eCs<4_8%*o zfT0NDWjr0rBa1hpifWIAL(vMrR?04a0000006xwyJ@(1R7Nm>p00000NkvXXu0mjf DP-wNr literal 0 HcmV?d00001 diff --git a/tests_speculos/test-messages/nanox.12.png b/tests_speculos/test-messages/nanox.12.png new file mode 100644 index 0000000000000000000000000000000000000000..e10e0049c4e39446eb67baea703f77a107925640 GIT binary patch literal 442 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|?+Yba4!+nDh4L#dXaJJPnEG zite?1uUEO3Dt_9-IXm@SlJWodS%n-^xma{qfx2Lzg@f$rvmoH=d6AC$%=Q=jSJKIT-wu*=_G3~M%K@Xo_i(g zHdj=f}0nbj2ce(`^ylg~}&|D3(uKYYj4wN_8> zZ+{nI$SOM_u`XWN`GJVa%)|8wewyiq%N;jcrZ>2qaZP6O%USIHhQGde$#(P2X_0Am za>cr)_d91w^xa&kTe8(~cJ!Sjw%PrA_UXTy*^pHBRaLg|Hp>(n%N@&IHecX<8rA+@ zt@?Z3Tc`BAn|mvEM67U?-sqotgLD1FM;eFjtmKVW*_-_7yhZ8LXPMe>Vn4o%Nf9f^ z`+hoJ<0!|6lg&?=W2Y^gE_+jW0snV<+r|F-=BUKBu>UH)aehY~%a6I%n_H~9H~cgB gd3YxaEEIwCC1L+UJAKP%sYgMAp00i_>zopr07kXNa{vGU literal 0 HcmV?d00001 diff --git a/tests_speculos/test-messages/nanox.13.png b/tests_speculos/test-messages/nanox.13.png new file mode 100644 index 0000000000000000000000000000000000000000..7e236da60aac4c243bde35b1f1e6e89b08667b7e GIT binary patch literal 428 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|=lvba4!+nDh2#VBTQ`0oTB& zQuR0Wo^O`Q2WmDw=j^nt5PA1=lMD~DM8GjkMxZtr5RaFeIxXl`>A9PWJ5Spt#mT?z zkH1&P;r-Yk#X0pV}Dj{o?hW-Zy=?izjJaqX7)Mcd|YI-h=T-^N3W6J?kG zsd?Qd8ht@p>COA>q=Gw5QAIz?pG+$f-N}3ESr6;0jpAR03lgPGld6B7o*MV>#H`y! zpFf`19I{W?*l^Et&)jv(dvo#%y9H&+D*r~jv1Ih*`>M;l@h!^|i{cH-9d=)6OPYIl z_s=a4YiAv+{Ce}N*k8fJ6E#+L=v`OauW`ftseOd9Vpo0gztetaZXQk3OWC@eV>^@I zG|T@dk^`q0{{R30002+7GHNy-~z3+ zxOVp&XYz#ayC?9f9DPMUcTeCNatlAGwxGj>ub2kO7Np*GGT|1~*LzQf;@a;dD_|$W z6|hGmlB|HC;pp}s0002s9p=4D>BG2Ty6&!i@L*=GwLE`;ov?JcXMGvPA0@dH4((5V zxxTI-O4%e5a2CGYj^^vb+lmmY0C%6mH>V_zM8|-(kd#;+t=%7JaK(0f%eWPL}q1q`rz3aP}SG$xsuId|*u#6EJu@eCs<4_8%*o zfT0NDWjr0rBa1hpifWIAL(vMrR?04a0000006xwyJ@(1R7Nm>p00000NkvXXu0mjf DP-wNr literal 0 HcmV?d00001 diff --git a/tests_speculos/test-messages/nanox.15.png b/tests_speculos/test-messages/nanox.15.png new file mode 100644 index 0000000000000000000000000000000000000000..2689ddb23270a26a35f8ff07481a8bca2379a633 GIT binary patch literal 420 zcmV;V0bBlwP)nlAi|(~vR+WluX=;uO@@dz*}mYrjdk1MVd8 z4!B1mO1T3}!pWO|0001hZy4_`fr@cvaQCP*j6_8LoNyPhJH>jc)~c6UvQotO@@x7! z?0BP#HV17C;da1APe&#@nU=1%uljn?St#5NScRsyn+G_K1kbz#nca1-z}Ip_!U z5p6QeH0bUJjER0pl!DI2PUj!@xOd}7!u<_3Lo|*1LwMR4@DK(706=;o65)P}tfE}R z+8zCAX<;m`?Qd%17e;%{5U3QPV>cErb>LRv+xHqD`{0i`ELJhj#OqXY-}eet5Y=K$ zfN^b+23gt%1xi8PDuVm;z3)|`)<+{wKvA(i^)K^UF8}}l00000|H2<88sc?;>f&_( O00008>?wPWFy}Vouz~K%%15CO! z7$D(_xl=@#i}7j=Q)fY(ngOGtsa^+)-{?I>3~GT{4N(NZ6E~NggRE&zEJ5A^ZGzVy zj996752uumsF8_)ttIFxuaD?rEiWL&8!|%8EP{7Q%T9^lJzuBjW%leCx)IT8pod=Z z=O%@`2e=#=xuHmK6Mh))Jenj)l6(+)e>cxCOjs&BD(o19F&vS-4FG*%vs|@BbivmH zt}W9Rv)LE)`C$=0U=gzEsf$>62_lax=6y}vR+tM{XakzH4l!NRfi;+_?MjDZfu8}P z0$2g226b3yIC#xkgC!`OvVyr8fc-Wz&i23Vl0K%qr~o#&gQtQhW%%Q5uh zh+PW!_GCwv{a~EO!_^28vFOk7O?H5GZrruR)Wg-#X3S|w^&RPt$`9G+g_Qp)XBX??|=piN|j;0NE)pQA$LQWTE29WdYu2_%&JJGC&Ciq1c zKfr}CQ_91j4$xIy+fT^o>2Y>j>d!1L_4e%Xkj@)@@}fQ$=RrNJR6)LB~*Xn<7tv`qe^z4v(RX4Ra1=l#i?Z^J6GUk|arzB>8##0igQrI#{3q Q%m4rY07*qoM6N<$f;54=I{*Lx literal 0 HcmV?d00001 diff --git a/tests_speculos/test-messages/nanox.17.png b/tests_speculos/test-messages/nanox.17.png new file mode 100644 index 0000000000000000000000000000000000000000..91dcbdcafffb2d9619d06a89d1ca3cd941e0b3e6 GIT binary patch literal 540 zcmV+%0^|LOP)mqYZL}h^ z$86gHZykW)bZZ~|k30lSy{Uc0z5$q;iH`1D;YfrRonL}xb#Ik#)b4qN7xe?ME}_Ws z8vG9M&mA_d=sjpq-s4+>|G+FV)!#-bHPzpYF*u1;=%hiB8H1%LF8}}l0000000000 e00000u*^5y!{N7GRDl}+0000 zuWQcObvoKG!N0}hrTa|xe8-(zw8a>!Xl>+sw*kLor^xwHhAPHbNh~_UXY7MA7cDw{ zSv>>7rz4uRXqcY%{5^hClwseGN@{rRq7QM&m&x$b~X6r)JeI zHk2TVOy^w%VLgusKu{hGiD5Y!>TIr1AGH<&00000AG8&owgJxVxlESJ^i9g0OfnGP~49upQ9g!*Wnp}sue8rI&8|aH{q35mSt%3r(7uw zCC%Z^o@3E)oq@u?F{vMp>SVmXjE1Z6{$hy1PN+gV;W@k$>0XC#L#yV2+{8A8{nI)Z z8b{1>tu<0<=xkOxdlzZ&YC7%QQqn)I-xEGHVs)X`wCGEu!eL>Ut{jU#OIe>FZ`p4< zv?AmT^_`fVx-_l7WAmJOo8vv)(`%OutCJKq4^F8X+T4`)BQza9pJrV3v90|oDeOG) zhN@24V6<5as#nS{dIlI>Gw1!xTpkQ{$`9Ec3(nOU&@9K5F!{w;xV0r_+1$REgLX?Q uzu*0|0{{R3000000000000000NB#pM$!Pv;QncX!0000^PbX0`eJS}y70`%8T>n^%dV>bk>TM}C(cF@9*Jbj^5WTF;gKGIO)y zjlJ*9*PE9W@jdm~5r5wEu#TD8y6+Pnh8_O<-8#^Bx$bnOy3REWn^jXeAFev)TXe-F zTky7j?62N_lL@yzwx7O!=&4O1W7^|)7fcr%%i5*3D%0_G;tl)cpW3Io3*7!cdXW1o sV&B=e%knGs=l(tai5cc!1_ryAe9w9}zGZ%X&;TUp>FVdQ&MBb@086r+N&o-= literal 0 HcmV?d00001 diff --git a/tests_speculos/test-messages/nanox.20.png b/tests_speculos/test-messages/nanox.20.png new file mode 100644 index 0000000000000000000000000000000000000000..dbbdb276b0c5dc45bbcf2bcd75d07d53f0a031f5 GIT binary patch literal 409 zcmV;K0cQS*P)`q0{{R30002+7GHNy-~z3+ zxOVp&XYz#ayC?9f9DPMUcTeCNatlAGwxGj>ub2kO7Np*GGT|1~*LzQf;@a;dD_|$W z6|hGmlB|HC;pp}s0002s9p=4D>BG2Ty6&!i@L*=GwLE`;ov?JcXMGvPA0@dH4((5V zxxTI-O4%e5a2CGYj^^vb+lmmY0C%6mH>V_zM8|-(kd#;+t=%7JaK(0f%eWPL}q1q`rz3aP}SG$xsuId|*u#6EJu@eCs<4_8%*o zfT0NDWjr0rBa1hpifWIAL(vMrR?04a0000006xwyJ@(1R7Nm>p00000NkvXXu0mjf DP-wNr literal 0 HcmV?d00001 diff --git a/tests_speculos/test-messages/nanox.21.png b/tests_speculos/test-messages/nanox.21.png new file mode 100644 index 0000000000000000000000000000000000000000..7e236da60aac4c243bde35b1f1e6e89b08667b7e GIT binary patch literal 428 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|=lvba4!+nDh2#VBTQ`0oTB& zQuR0Wo^O`Q2WmDw=j^nt5PA1=lMD~DM8GjkMxZtr5RaFeIxXl`>A9PWJ5Spt#mT?z zkH1&P;r-Yk#X0pV}Dj{o?hW-Zy=?izjJaqX7)Mcd|YI-h=T-^N3W6J?kG zsd?Qd8ht@p>COA>q=Gw5QAIz?pG+$f-N}3ESr6;0jpAR03lgPGld6B7o*MV>#H`y! zpFf`19I{W?*l^Et&)jv(dvo#%y9H&+D*r~jv1Ih*`>M;l@h!^|i{cH-9d=)6OPYIl z_s=a4YiAv+{Ce}N*k8fJ6E#+L=v`OauW`ftseOd9Vpo0gztetaZXQk3OWC@eV>^@I zG|T@dk^g@f$rvmoH=d6AC$%=Q=jSJKIT-wu*=_G3~M%K@Xo_i(g zHdj=f}0nbj2ce(`^ylg~}&|D3(uKYYj4wN_8> zZ+{nI$SOM_u`XWN`GJVa%)|8wewyiq%N;jcrZ>2qaZP6O%USIHhQGde$#(P2X_0Am za>cr)_d91w^xa&kTe8(~cJ!Sjw%PrA_UXTy*^pHBRaLg|Hp>(n%N@&IHecX<8rA+@ zt@?Z3Tc`BAn|mvEM67U?-sqotgLD1FM;eFjtmKVW*_-_7yhZ8LXPMe>Vn4o%Nf9f^ z`+hoJ<0!|6lg&?=W2Y^gE_+jW0snV<+r|F-=BUKBu>UH)aehY~%a6I%n_H~9H~cgB gd3YxaEEIwCC1L+UJAKP%sYgMAp00i_>zopr07kXNa{vGU literal 0 HcmV?d00001 diff --git a/tests_speculos/test-messages/nanox.23.png b/tests_speculos/test-messages/nanox.23.png new file mode 100644 index 0000000000000000000000000000000000000000..dbbdb276b0c5dc45bbcf2bcd75d07d53f0a031f5 GIT binary patch literal 409 zcmV;K0cQS*P)`q0{{R30002+7GHNy-~z3+ zxOVp&XYz#ayC?9f9DPMUcTeCNatlAGwxGj>ub2kO7Np*GGT|1~*LzQf;@a;dD_|$W z6|hGmlB|HC;pp}s0002s9p=4D>BG2Ty6&!i@L*=GwLE`;ov?JcXMGvPA0@dH4((5V zxxTI-O4%e5a2CGYj^^vb+lmmY0C%6mH>V_zM8|-(kd#;+t=%7JaK(0f%eWPL}q1q`rz3aP}SG$xsuId|*u#6EJu@eCs<4_8%*o zfT0NDWjr0rBa1hpifWIAL(vMrR?04a0000006xwyJ@(1R7Nm>p00000NkvXXu0mjf DP-wNr literal 0 HcmV?d00001 From 4fed2d21e2e2edb2ac2240c8d307a3f327c82333 Mon Sep 17 00:00:00 2001 From: Robert Lukotka Date: Wed, 26 Oct 2022 12:24:56 +0200 Subject: [PATCH 2/2] Reject messages containing non-displayale chars New screens to inform user --- app/src/apdu_handler.c | 4 ++ app/src/message.c | 53 ++++++++++++++-------- tests_speculos/test-messages.js | 18 ++++++-- tests_speculos/test-messages/nanos.02.png | Bin 529 -> 421 bytes tests_speculos/test-messages/nanos.03.png | Bin 587 -> 554 bytes tests_speculos/test-messages/nanos.04.png | Bin 542 -> 587 bytes tests_speculos/test-messages/nanos.05.png | Bin 249 -> 542 bytes tests_speculos/test-messages/nanos.06.png | Bin 380 -> 249 bytes tests_speculos/test-messages/nanos.07.png | Bin 657 -> 380 bytes tests_speculos/test-messages/nanos.08.png | Bin 639 -> 421 bytes tests_speculos/test-messages/nanos.09.png | Bin 249 -> 561 bytes tests_speculos/test-messages/nanos.10.png | Bin 380 -> 666 bytes tests_speculos/test-messages/nanos.11.png | Bin 483 -> 639 bytes tests_speculos/test-messages/nanos.12.png | Bin 468 -> 249 bytes tests_speculos/test-messages/nanos.14.png | Bin 642 -> 483 bytes tests_speculos/test-messages/nanos.15.png | Bin 641 -> 468 bytes tests_speculos/test-messages/nanos.16.png | Bin 546 -> 380 bytes tests_speculos/test-messages/nanos.17.png | Bin 249 -> 421 bytes tests_speculos/test-messages/nanos.18.png | Bin 380 -> 543 bytes tests_speculos/test-messages/nanos.19.png | Bin 468 -> 377 bytes tests_speculos/test-messages/nanos.20.png | Bin 483 -> 546 bytes tests_speculos/test-messages/nanos.21.png | Bin 380 -> 249 bytes tests_speculos/test-messages/nanos.22.png | Bin 0 -> 380 bytes tests_speculos/test-messages/nanos.23.png | Bin 0 -> 468 bytes tests_speculos/test-messages/nanos.24.png | Bin 0 -> 483 bytes tests_speculos/test-messages/nanos.25.png | Bin 0 -> 380 bytes tests_speculos/test-messages/nanox.03.png | Bin 791 -> 468 bytes tests_speculos/test-messages/nanox.04.png | Bin 780 -> 791 bytes tests_speculos/test-messages/nanox.05.png | Bin 355 -> 780 bytes tests_speculos/test-messages/nanox.06.png | Bin 409 -> 355 bytes tests_speculos/test-messages/nanox.07.png | Bin 420 -> 409 bytes tests_speculos/test-messages/nanox.08.png | Bin 933 -> 420 bytes tests_speculos/test-messages/nanox.09.png | Bin 551 -> 468 bytes tests_speculos/test-messages/nanox.10.png | Bin 355 -> 655 bytes tests_speculos/test-messages/nanox.11.png | Bin 409 -> 933 bytes tests_speculos/test-messages/nanox.12.png | Bin 442 -> 551 bytes tests_speculos/test-messages/nanox.13.png | Bin 428 -> 355 bytes tests_speculos/test-messages/nanox.15.png | Bin 420 -> 442 bytes tests_speculos/test-messages/nanox.16.png | Bin 942 -> 428 bytes tests_speculos/test-messages/nanox.17.png | Bin 540 -> 409 bytes tests_speculos/test-messages/nanox.18.png | Bin 608 -> 420 bytes tests_speculos/test-messages/nanox.19.png | Bin 355 -> 468 bytes tests_speculos/test-messages/nanox.20.png | Bin 409 -> 649 bytes tests_speculos/test-messages/nanox.21.png | Bin 428 -> 608 bytes tests_speculos/test-messages/nanox.22.png | Bin 442 -> 355 bytes tests_speculos/test-messages/nanox.24.png | Bin 0 -> 428 bytes tests_speculos/test-messages/nanox.25.png | Bin 0 -> 442 bytes tests_speculos/test-messages/nanox.26.png | Bin 0 -> 409 bytes 48 files changed, 52 insertions(+), 23 deletions(-) create mode 100644 tests_speculos/test-messages/nanos.22.png create mode 100644 tests_speculos/test-messages/nanos.23.png create mode 100644 tests_speculos/test-messages/nanos.24.png create mode 100644 tests_speculos/test-messages/nanos.25.png create mode 100644 tests_speculos/test-messages/nanox.24.png create mode 100644 tests_speculos/test-messages/nanox.25.png create mode 100644 tests_speculos/test-messages/nanox.26.png diff --git a/app/src/apdu_handler.c b/app/src/apdu_handler.c index 476e71d3..dc1e7156 100644 --- a/app/src/apdu_handler.c +++ b/app/src/apdu_handler.c @@ -90,6 +90,10 @@ __Z_INLINE void handleSign(volatile uint32_t *flags, volatile uint32_t *tx, uint if (callType == PROCESS_CHUNK_FINISHED_MESSAGE) { zxerr_t err = message_parse(); if (err != zxerr_ok) { + const char *error_msg = "Invalid message"; + int error_msg_length = strlen(error_msg); + MEMCPY(G_io_apdu_buffer, error_msg, error_msg_length); + *tx += (error_msg_length); THROW(APDU_CODE_DATA_INVALID); } CHECK_APP_CANARY() diff --git a/app/src/message.c b/app/src/message.c index 403a841f..00a62397 100644 --- a/app/src/message.c +++ b/app/src/message.c @@ -39,24 +39,24 @@ zxerr_t message_parse() { return zxerr_out_of_bounds; } + for(size_t j=0; j127) { + return zxerr_out_of_bounds; + } + } + sha256(messageData.message, messageData.length, messageData.hash); messageData.canBeDisplayed = false; if (messageData.length <= MAX_MESSAGE_SHOW_LENGTH) { messageData.canBeDisplayed = true; - for(size_t j=0; j127) { - messageData.canBeDisplayed = false; - break; - } - } } return zxerr_ok; } zxerr_t message_getNumItems(uint8_t *num_items){ - *num_items = app_mode_expert() ? 2: 1; + *num_items = 2 + (!messageData.canBeDisplayed ? 1 : 0) + (app_mode_expert() ? 1 : 0); return zxerr_ok; } @@ -67,24 +67,41 @@ zxerr_t message_getItem(int8_t displayIdx, uint8_t pageIdx, uint8_t *pageCount) { switch(displayIdx) { case 0: + snprintf(outKey, outKeyLen, "Review"); + snprintf(outVal, outValLen, "the message to sign"); + return zxerr_ok; + case 1: if (messageData.canBeDisplayed) { snprintf(outKey, outKeyLen, "Message"); pageStringExt(outVal, outValLen, (char *)messageData.message, messageData.length, pageIdx, pageCount); + return zxerr_ok; } else { - snprintf(outKey, outKeyLen, "Message hash"); - pageHexString(outVal, outValLen, messageData.hash, sizeof(messageData.hash), pageIdx, pageCount); + snprintf(outKey, outKeyLen, "Message too long,"); + snprintf(outVal, outValLen, "validate hash on a secure device."); + return zxerr_ok; } + } + + displayIdx -= 2; + + if (displayIdx == 0 && !messageData.canBeDisplayed) { + snprintf(outKey, outKeyLen, "Message hash"); + pageHexString(outVal, outValLen, messageData.hash, sizeof(messageData.hash), pageIdx, pageCount); return zxerr_ok; - case 1: - if (app_mode_expert()) { - snprintf(outKey, outKeyLen, "Your Path"); - char buffer[100]; - path_options_to_string(buffer, sizeof(buffer), hdPath.data, HDPATH_LEN_DEFAULT, cryptoOptions); - pageString(outVal, outValLen, buffer, pageIdx, pageCount); - return zxerr_ok; - } - return zxerr_no_data; } + + if (!messageData.canBeDisplayed) { + displayIdx -= 1; + } + + if (displayIdx == 0 && app_mode_expert()) { + snprintf(outKey, outKeyLen, "Your Path"); + char buffer[100]; + path_options_to_string(buffer, sizeof(buffer), hdPath.data, HDPATH_LEN_DEFAULT, cryptoOptions); + pageString(outVal, outValLen, buffer, pageIdx, pageCount); + return zxerr_ok; + } + return zxerr_no_data; } diff --git a/tests_speculos/test-messages.js b/tests_speculos/test-messages.js index 16b1df3e..3f2c00b8 100644 --- a/tests_speculos/test-messages.js +++ b/tests_speculos/test-messages.js @@ -46,7 +46,6 @@ const pubkeyHex = getPubkeyResponse.publicKey.toString("hex") const signPromise = app.signMessage(path, message, options); await device.review("Review message"); const signResponse = await signPromise; - console.log(signResponse) assert.equal(signResponse.returnCode, 0x9000); assert.equal(signResponse.errorMessage, "No errors"); @@ -67,7 +66,6 @@ const pubkeyHex = getPubkeyResponse.publicKey.toString("hex") const signPromise = app.signMessage(path, message, options); await device.review("Review message"); const signResponse = await signPromise; - console.log(signResponse) assert.equal(signResponse.returnCode, 0x9000); assert.equal(signResponse.errorMessage, "No errors"); @@ -84,13 +82,12 @@ const pubkeyHex = getPubkeyResponse.publicKey.toString("hex") await device.toggleExpertMode("ON"); { - const message = Buffer.concat([Buffer.from("This is a short message with a non-displayable character"), Buffer.from("ee", "hex")]); + const message = Buffer.from("This is a short message in expert mode"); - testStep(" - - -", "A message with non-displayable characte"); + testStep(" - - -", "A short message, expert mode"); const signPromise = app.signMessage(path, message, options); await device.review("Review message"); const signResponse = await signPromise; - console.log(signResponse) assert.equal(signResponse.returnCode, 0x9000); assert.equal(signResponse.errorMessage, "No errors"); @@ -106,6 +103,17 @@ await device.toggleExpertMode("ON"); await device.toggleExpertMode("OFF"); +{ + const message = Buffer.concat([Buffer.from("This is a short message in expert mode"), Buffer.from("ee", "hex")]); + + testStep(" - - -", "A short message, non displayable character"); + const signPromise = app.signMessage(path, message, options); + const signResponse = await signPromise; + console.log(signResponse) + assert.equal(signResponse.returnCode, 0x6984); + assert.equal(signResponse.errorMessage, "Data is invalid : Invalid message"); +} + await transport.close() testEnd(scriptName); process.stdin.pause() diff --git a/tests_speculos/test-messages/nanos.02.png b/tests_speculos/test-messages/nanos.02.png index 408553a6050ae0372564aed927e60870bb812aac..ca19a0c30b4195d376ce407a1f651b95ba2ca502 100644 GIT binary patch delta 395 zcmV;60d)S61f>IzB!6s4L_t(|ob8$04#OY_hTCO*{|D|xcVX5sKVK)-eQYIy6) zU^r)I-I&6v9?Wv==jiMiASpwW2#rzLgIU1r+e3CisAg4V_J4UkcRA=mS>+KsfUYt~b8dh(lz%Rwzdkq3<>{JiR(=Qv zJVTGl`*7%jo<-k1z&N>kNe~29aOi?)f+1YZROGyZ)o3S2L_x}U_)nN3U;SL+(*Tc{ p`h-sdL^41PCkcjf;t*Em1CeeFqcD%+bpQYW07*qoLRS2w7qajNUT=F@AHrSqdnE)hO*zY40UU=T&_tXuoP=uIZ*}Ib+R0|EQq6M@H+vTDpE!BD#Dx=0*;C~zzP_|S)BUgn(pc|>G z-)u}q>$H$;KLOdT!H=n0s?Ua_0CyfJId*%I;Qze-1Zsk#j6+}*63;*4C4g1MZ9&a| z54uxkAJ0akh#KL(*DFDedo33Zy-sq_i<(8xp-$Ktx?^C}!DZoAI0NVW%Z(^yQ`F_U zeG9A)FHeNA4}U--89rwqA;^&Yg`VcRx?tk5xuP2Wa8DH|A&Skat4CqpqATIikLXkc zzk*N#v&5taBS7duEU|OI5TMymwGN()0MV%kKGPr}xH;l1py|gL0^O8U?o^kzfN~ZV z78Vw4G2(~k_TkY{5Cg@)%{|sAwjpl2cMQy>7gpuO4dj>&cYy!gHF^uFSsBP1C4z6&*PkP7Tp7|KF0PA-Q&0Abb tzGRLm2L@j&JtXn4?#nPtd=B^y`~gRLmU2-&s0RQ5002ovPDHLkV1mAg?OWOb>j2ODIn3ZGE0#dnDTw@)*!gW(`%$X0Fl!5exm*xcX0UibW% zvu7{=f*rp#T_ofN$;!p;wm0lL$z>3om^%k&*p?Tj$8jKm2OdJH zifV4#zrg$Qa(_iQ#{hVek#hzXf&-RU@HUsFLO74jb*hms_o+roNWo^6rO}wT$VzzR zW9TVJz3W2)w@YacMuu?%pypcy0+8hHRT~=n~k+ zz?glr+~(~yTY<8mw3}6v?_tW2j+F@v5m22hl+sR&i7EEn}PtV1)NNiHB7$Lzws;@E>>qaNW;q U41FZ>01E&B07*qoM6N<$f|>34iU0rr delta 563 zcmV-30?hrY1j_`FBYy%CNklxQ|9^0c-oo>o61XCv*^GBpihzoW zx0Z0kzJ=u-ys&Q}gp)#A(hbpcw0?ZfWN57t18Ui~fUBC`g zc4nkkW|gKE?sk{1_uv%O(0i+l}i z*T50B<%zLT8-F9kM99U8rny0<_kwtpMcUzeP9!`0&H!+SN+nX0BI_XOVRIOo$Yu@M zi3hb!={X0~G67X2ghpqT3~pHDFuZSP!(>7F%aNwr18nX}j4=VV+zZQw8f2(^ceqYK z+I(%DF>`_!?cR!BD*#hEfOWtJCP0z5klf2^_4LLNaDUlJpRmoeQK}q3b7Q@0)Ot2cn7_06he}MJ@eMbbwm%{$u5__kceCa7b4C zth=s&sw`bd`YR&-X`*N6^$t+G8gHL>2v1Br2!EWZyV}X2qm2Ln002ovPDHLkV1i|V B3AF$K diff --git a/tests_speculos/test-messages/nanos.04.png b/tests_speculos/test-messages/nanos.04.png index f9c1e1e8c0bf14c28045600dc4bb581e9df5eaa0..8782b4deb474079a56438c04f7a555595237832e 100644 GIT binary patch delta 563 zcmV-30?hrM1j_`FBYy%CNklxQ|9^0c-oo>o61XCv*^GBpihzoW zx0Z0kzJ=u-ys&Q}gp)#A(hbpcw0?ZfWN57t18Ui~fUBC`g zc4nkkW|gKE?sk{1_uv%O(0i+l}i z*T50B<%zLT8-F9kM99U8rny0<_kwtpMcUzeP9!`0&H!+SN+nX0BI_XOVRIOo$Yu@M zi3hb!={X0~G67X2ghpqT3~pHDFuZSP!(>7F%aNwr18nX}j4=VV+zZQw8f2(^ceqYK z+I(%DF>`_!?cR!BD*#hEfOWtJCP0z5klf2^_4LLNaDUlJpRmoeQK}q3b7Q@0)Ot2cn7_06he}MJ@eMbbwm%{$u5__kceCa7b4C zth=s&sw`bd`YR&-X`*N6^$t+G8gHL>2v1Br2!EWZyV}X2qm2Ln002ovPDHLkV1i2> B38?@8 delta 517 zcmV+g0{Z>S1fB$tBYy$qNkl#9X7;E9wwT~4I`1_tsJT|SAoebj2M2ezxnXXr{0+KepoeMs z!5`O(3oCCsynpqptzwAJZadYhN%0#FfTCHjT)xXVy{0LOnnAWMunUqq)*bec zA{Vlz6n3ys=tHeksM$PPLVWCkd`?Yr4*2h*1I$ORZpW$SKt(<}z?|zGI88f1k_n)( zDa;?#)bP3@?1|)6(-~SS^#3mO&f{A%_8jo=@K8s$p?>c6sbmZ;r=UA6We&EX;LETu zMM3S*uiQ18tOGY<*WtdIjcD50o2BTFgAss{|C%6dK4QirSsgdHT!ahM zziY$?<^6XCXO95fxM0D=c>+mw^hb(^28xz)-?&$pg8rHhD8-NVT#4t^00000NkvXX Hu0mjf+_M58 diff --git a/tests_speculos/test-messages/nanos.05.png b/tests_speculos/test-messages/nanos.05.png index 006c26abaac6c76b2e871b194165596c0b416694..f9c1e1e8c0bf14c28045600dc4bb581e9df5eaa0 100644 GIT binary patch delta 517 zcmV+g0{Z>=0iFbqBYy$qNkl#9X7;E9wwT~4I`1_tsJT|SAoebj2M2ezxnXXr{0+KepoeMs z!5`O(3oCCsynpqptzwAJZadYhN%0#FfTCHjT)xXVy{0LOnnAWMunUqq)*bec zA{Vlz6n3ys=tHeksM$PPLVWCkd`?Yr4*2h*1I$ORZpW$SKt(<}z?|zGI88f1k_n)( zDa;?#)bP3@?1|)6(-~SS^#3mO&f{A%_8jo=@K8s$p?>c6sbmZ;r=UA6We&EX;LETu zMM3S*uiQ18tOGY<*WtdIjcD50o2BTFgAss{|C%6dK4QirSsgdHT!ahM zziY$?<^6XCXO95fxM0D=c>+mw^hb(^28xz)-?&$pg8rHhD8-NVT#4t^00000NkvXX Hu0mjfGn@iT delta 222 zcmV<403rXL1o;7wBYyzENklbj?&pa6O!qUj-KP8b*aIa}NQpVDM27(Yu87xPW-HU%N9Xm=i`GrK z`c<=vSN1M)7xn*dyAZw~D~|m>-9vo?clT7^fSMlyQ3UBWz*lp*W^o_xVX~hV_xLK! zJWxl!^aO+v9CqZO_yak9g>(j#>GisJk$>I;(Fy2tpnp;v&~L`+D(V>k00000001D# Y3NOB8u!Sr%S^xk507*qoM6N<$g5>XN@Bjb+ diff --git a/tests_speculos/test-messages/nanos.06.png b/tests_speculos/test-messages/nanos.06.png index 7f6ab5e6010052a6c826d8a33994eba6cf7bbeed..006c26abaac6c76b2e871b194165596c0b416694 100644 GIT binary patch delta 222 zcmV<403rYU0{H=uBYyzENklbj?&pa6O!qUj-KP8b*aIa}NQpVDM27(Yu87xPW-HU%N9Xm=i`GrK z`c<=vSN1M)7xn*dyAZw~D~|m>-9vo?clT7^fSMlyQ3UBWz*lp*W^o_xVX~hV_xLK! zJWxl!^aO+v9CqZO_yak9g>(j#>GisJk$>I;(Fy2tpnp;v&~L`+D(V>k00000001D# Y3NOB8u!Sr%S^xk507*qoM6N<$f;7l$OaK4? delta 354 zcmV-o0iFK&0sI1xBYy!yNkluRr;yTsQ43OPlRlX!mA#zXLNU2R?VwJ6)E zF1I*s6nq^p&4PTTOSmPEMbE{jtppwY^J4|+t@vhuNa?L)$$xg9H^aHM0|(Hs8*B@0 z_W+cj+c!iL*4pu%k?g3)p^Et?jlBD}qeX^7w zh-*VqpX?<_X&5N;^QW94?rBx}X7^SEVb9oL&43F7uuP6xy6C;Rn3-`r14I?fWYu<; z;hlvfeffl#>RXdB1I(g}F{EkPPaqaTyGsD&&@_v*T zyPouRr;yTsQ43OPlRlX!mA#zXLNU2R?VwJ6)E zF1I*s6nq^p&4PTTOSmPEMbE{jtppwY^J4|+t@vhuNa?L)$$xg9H^aHM0|(Hs8*B@0 z_W+cj+c!iL*4pu%k?g3)p^Et?jlBD}qeX^7w zh-*VqpX?<_X&5N;^QW94?rBx}X7^SEVb9oL&43F7uuP6xy6C;Rn3-`r14I?fWYu<; z;hlvfeffl#>RXdB1I(g}F{EkPPaqaTyGsD&&@_v*T zyPo-(XN&`1qW;= zfUzejC5Pixj+Y@>hMZkK>U^B54}7{)()8>x8o+;;faY30Z_bT-w_n$o1THg=XP^ls z+9+a<>y&+@LTP;z9?x>Tx^*^-0yg0VY)ZLbRY9wj>kN(3B!B50aPK^S2h@^!+Uw?w z017(~SbB<{kmjm$-vpeysh~~TNUk7oUNp^uB9GJ@eRo>88yixhI`5r-2D`#>O&Dy- z&col7X*7Y3w_j$3p!y*_hj5`G_1ZMfGgE4S3e$k`$EkV7k{S=^iM`T?X;>SA{uVx1 z*=#JsBQr>5kbk@hB?VotbOaccH_CJtUB$rW~^y8yg#|5uqYHv{*rSHz@H$-g@Tb4*=Q)1R>8mu!IY0 zV6x}@FkFLGrS%tllKci1;d6+mp<19IzdP`M2s}#2D090c(oo`dGIzBYy#GNklsvgX8?C0q086YV`lL(Db*n?TX?At?jL8xX`Wq1YT&Y=lLj&E@HuY*u~< z2RuWM%KLEWf}Ta+J-|4*dr1%kR&eNoXo4YJ%~a&Pg4JjzM?^u&c=%74B47Pn;nM(* qnEHfI14J@F4JQePa^etH<^z##45KiQ;&lK3002ovP6b4+LSTZ|g1UeJ delta 615 zcmV-t0+{`!1OEh&BYy%$Nkl@p;$Gl5!jR>|&`LPUb0pOAW16w^3IZzpw$A*xC=L-Th154oaTHX(p>B zA5}_A3Yfz>CC}X0F}6dz?T!pOzdrD&{=gO)4LJ3{D)50!=YJ_*z?FGVN!^oSsQ#5E z%Et)>lw%$VvvRo7E>Fj#MxH7-KKl67Gipm7G zxE&#-xg$)R-DA1GUzTSDTn5P;!U^VJ=8-y0wDPng%u-gZKcwb6Py2q1eBePogyChg z{4D;lvst(e8-K-x8zs;sWg@0XTewil>#XU9Dr-7SMh&{cmK$!knvPa?CYMNC)oRDx zRFyToVxl(tH4D4V(hX+w)nsX9aZb0sx@^jp>EcS;k;|211Hi?xqPYA3qnl(kpS&Ab zw!G$=_e)7>d0VYEz-@r}(o3SZF&TubI=5t1PBLmnuz!sQTtk_T_pA@{Trn{s8;{5{ zU?P}$5+NH8ZUguOAi=749)s#V5}4x^^0Fo;8Drn8SXfwCcmTLj1OwcElkdqz!a$vynSY> zD)p;8kzgAhON62Xddnw zM@J+Pum5=yh!gWRVD9`t9a>CukMUtm6c!f3@dtW5MU$fSh7$k)002ovPDHLkV1k-V BC|v*m diff --git a/tests_speculos/test-messages/nanos.09.png b/tests_speculos/test-messages/nanos.09.png index 006c26abaac6c76b2e871b194165596c0b416694..728829525949a9e4b35ab740c1d86e10f1e792de 100644 GIT binary patch delta 537 zcmV+!0_Oes0kH&-BYy$-Nkl5h^8OFpMQ4%Lu?W8?YVjPu#Y|#A z@dlA5gp}7aD0w}pa9*+sGtJK0dVD=Qu6d?(WTA;aE@JKZ{@;D{V>5TP%3HQX(n=e; z{}#naVbN^XHpx6C_Z)nwG_0Vs+tMw2fm_tnkn5%;?6oAI5r4yl&71F|c!t2vi5a$^ zWJyX3N?+%qBz^z5ptd=P9xYcSCDA$D7vwf@o+q!_Rfv*0u2D?1k|3PLhyIWzaEr&~ zYs3j{=4Gq={CeE0!|BLsf^dMYIc^#dNaK2B#jq|g8<6)%GkTtv)IZ9I{VQ1WT8(^^ zMK(p&Jwk1!fPdeb?H;DB1|Obnt_!N&r#{ALC}&v&z@DwxvwJR&545qKVvd36f)oOf zVONGSE%9SC83KHQx8w$zYtw7#&2GZB16a)Ikv=s`@y5%_eKTMJf{@X)D>h_GLgq=F z&4D=x-_F`uuMiV5E;WqV0mU9lqagWWDaTM{MwNO)bAOx7X0!2y{mpe_!u^FY)7z>%fh9B1c2R80%&;B6K4m}D8PuFzzLzef z_d!g`B}kt^*xMQ>-%A%V{r3PrQPD>drS}ey#<%#11Ne}F1*8htX|75w5MkD~HKOrm bbj?&pa6O!qUj-KP8b*aIa}NQpVDM27(Yu87xPW-HU%N9Xm=i`GrK z`c<=vSN1M)7xn*dyAZw~D~|m>-9vo?clT7^fSMlyQ3UBWz*lp*W^o_xVX~hV_xLK! zJWxl!^aO+v9CqZO_yak9g>(j#>GisJk$>I;(Fy2tpnp;v&~L`+D(V>k00000001D# Y3NOB8u!Sr%S^xk507*qoM6N<$g7s-@0{{R3 diff --git a/tests_speculos/test-messages/nanos.10.png b/tests_speculos/test-messages/nanos.10.png index 7f6ab5e6010052a6c826d8a33994eba6cf7bbeed..7e7b1fa65975e8627c30f4bc3d9ab6c91fe3053e 100644 GIT binary patch delta 642 zcmV-|0)74b0-6PoBYy&6Nkl2rdgg+L^ki#2{dT z2-~KV+@!mJL40hhccw zB7ci7b~X#suzy7+$qEwRsv`+@VN9;fZQ(3zI*k3n`c-ecm-VIg;sTH3kyuAVR=PD? zjUJj4>D;y3A~j2S_uKtzs}ZL<089_f;2;8q6!f^+!Q((OWjz;ek;u}BRN~?lNDqPj zIy^fd44e?Xghbd-3sj1*2gaA7YTGj6HHFpo^6<*Zd4F=YFn9-yEe5_}2%ttaLeL+8 zIan?k_2jHMgwNY+(4-;&b%8xJA!kkC%@!6G7RJLvMKJ9+=;H%t0MlgUR>0YSNd=Ri zs9DTMCeaW0X^dB>DRFTUBnja%7o#pbXe&calPXSpBzK(Jj-S6N zzAC@PyL;kAoh8$hOh=$HmNg}A$IKL@I$*)`0hkxZ@CvnD0eClcgvq@5mn&YAe8f;D z@_1-#2&QmB1x)rFABJ-yICIA2c07*qoM6N<$f|8gnL;wH) delta 354 zcmV-o0iFJu1^fb#BYy!yNkluRr;yTsQ43OPlRlX!mA#zXLNU2R?VwJ6)E zF1I*s6nq^p&4PTTOSmPEMbE{jtppwY^J4|+t@vhuNa?L)$$xg9H^aHM0|(Hs8*B@0 z_W+cj+c!iL*4pu%k?g3)p^Et?jlBD}qeX^7w zh-*VqpX?<_X&5N;^QW94?rBx}X7^SEVb9oL&43F7uuP6xy6C;Rn3-`r14I?fWYu<; z;hlvfeffl#>RXdB1I(g}F{EkPPaqaTyGsD&&@_v*T zyPo@p;$Gl5!jR>|&`LPUb0pOAW16w^3IZzpw$A*xC=L-Th154oaTHX(p>B zA5}_A3Yfz>CC}X0F}6dz?T!pOzdrD&{=gO)4LJ3{D)50!=YJ_*z?FGVN!^oSsQ#5E z%Et)>lw%$VvvRo7E>Fj#MxH7-KKl67Gipm7G zxE&#-xg$)R-DA1GUzTSDTn5P;!U^VJ=8-y0wDPng%u-gZKcwb6Py2q1eBePogyChg z{4D;lvst(e8-K-x8zs;sWg@0XTewil>#XU9Dr-7SMh&{cmK$!knvPa?CYMNC)oRDx zRFyToVxl(tH4D4V(hX+w)nsX9aZb0sx@^jp>EcS;k;|211Hi?xqPYA3qnl(kpS&Ab zw!G$=_e)7>d0VYEz-@r}(o3SZF&TubI=5t1PBLmnuz!sQTtk_T_pA@{Trn{s8;{5{ zU?P}$5+NH8ZUguOAi=749)s#V5}4x^^0Fo;8Drn8SXfwCcmTLj1OwcElkdqz!a$vynSY> zD)p;8kzgAhON62Xddnw zM@J+Pum5=yh!gWRVD9`t9a>CukMUtm6c!f3@dtW5MU$fSh7$k)002ovPDHLkV1h4A BD4PHP delta 458 zcmV;*0X6>r1mgpcBYy#^NklN2PZ zibzUHk|asKmB*xc&I8T)nlx!ARp-Il{tO+RGHx+bj5UI}4glalJYMoQv=Dh{JP$#h zy8(-lxws}=JyB<@L+SPUv!`=2=b1H zbO+eSUp(oxui>iFZV~Y=759WkhY-GZz_bu_+iWsS_a%Ipy(K162=d$Uo3?5kGv2Zj z052E6aX+~6|9_=Ni9O$K`+f&#a-RJ6j@6!-C_DQ}B>?`=hxR0Z5?9)@AfCE$KN(Kq z9h*FA*9l_Xm$IlBSJ}xBtB5)vU^^`t;KxX7;Y0avqg_+v_Ls0&0e1GfbQ>-P)NkWm zYEOha?iYE0&NYIB128!0B0~`-V8Q#m&!-gQoM%5!`y}#B zwah)3^{0Gk$z|<&q}FKsf2lPlNs=Tz>% diff --git a/tests_speculos/test-messages/nanos.12.png b/tests_speculos/test-messages/nanos.12.png index 50bcea8ef066c2dd963e046ab0dcabff12688b2a..006c26abaac6c76b2e871b194165596c0b416694 100644 GIT binary patch delta 222 zcmV<403rX>1Ni}vBYyzENklbj?&pa6O!qUj-KP8b*aIa}NQpVDM27(Yu87xPW-HU%N9Xm=i`GrK z`c<=vSN1M)7xn*dyAZw~D~|m>-9vo?clT7^fSMlyQ3UBWz*lp*W^o_xVX~hV_xLK! zJWxl!^aO+v9CqZO_yak9g>(j#>GisJk$>I;(Fy2tpnp;v&~L`+D(V>k00000001D# Y3NOB8u!Sr%S^xk507*qoM6N<$f)e#>B>(^b delta 443 zcmV;s0Yv`!0n`JKBYy##NklG)@u1A53~AKr&ym5+>|0gnvW5LiL&|L@q&w=vhJTkfgEPx%jWP^#T?)$n zs5?=)Pq^n1?~@bO)GAFrzWN)R0a^_{BNwlb-zUi6n}SMU_%mQiISZHu;c`lV4(Fna z&Hz39VWj7=im6h&M&MZreZnF`7q)wVTMD{uHQCMZA$(Z91u7^7+4cBKuG){9Z$$*q z&Bd=0ZGonQa}002ovPDHLkV1kab+FJks diff --git a/tests_speculos/test-messages/nanos.14.png b/tests_speculos/test-messages/nanos.14.png index 952a86dbe5916387675bb3a8134fc91a61277408..85d9725b420f3973268d5c660e9e7c5f486f4adf 100644 GIT binary patch delta 458 zcmV;*0X6=D1>*ydBYy#^NklN2PZ zibzUHk|asKmB*xc&I8T)nlx!ARp-Il{tO+RGHx+bj5UI}4glalJYMoQv=Dh{JP$#h zy8(-lxws}=JyB<@L+SPUv!`=2=b1H zbO+eSUp(oxui>iFZV~Y=759WkhY-GZz_bu_+iWsS_a%Ipy(K162=d$Uo3?5kGv2Zj z052E6aX+~6|9_=Ni9O$K`+f&#a-RJ6j@6!-C_DQ}B>?`=hxR0Z5?9)@AfCE$KN(Kq z9h*FA*9l_Xm$IlBSJ}xBtB5)vU^^`t;KxX7;Y0avqg_+v_Ls0&0e1GfbQ>-P)NkWm zYEOha?iYE0&NYIB128!0B0~`-V8Q#m&!-gQoM%5!`y}#B zwah)3^{0Gk$z|<&q}FKsf2lPlNs=TR delta 618 zcmV-w0+s#a1A+yRBYy%(NklfC7o(dmV!Vp z5NwEYI9_zToStRK*|kTV%eiF4)tx<^UX@3v63)g!<+tVI<+pGwn zqVR;Pr|1c3ZiL4U;PfVvoV4q?g24IFHA#v*Tyu2qv~V{!q(pVzg})|G#m04DVv`F` z-znE<0t35GRUxQdB=QK88B#B&0pConK~$KA7=J*`6<2CLz!!Vv9LlgZ1pO_%v9j6t zBXH|sUZxur0Dr;_}oI~K3#>U3RXX6nb(FVRY$Z9>^5HeFql0vGchgi&whG6i0 z!qt{P>^RvHD&i3_P>=f)D4$?>I9UWBUWlzJ+3RdgNmNAFnf_m!W!Ua?i+JQ$glsrG z&Jv+X_+yl8D^uL%7sZ8G2w+8hn1AIb2#HP@u`&1u1W`p+VERv9XcI50{gGV8O*LT>t<807*qoM6N<$ Ef^Wzpg8%>k diff --git a/tests_speculos/test-messages/nanos.15.png b/tests_speculos/test-messages/nanos.15.png index 5c1baf5eacb379216ec8018e3409771a61da1cca..50bcea8ef066c2dd963e046ab0dcabff12688b2a 100644 GIT binary patch delta 443 zcmV;s0Yv_R1=ItOBYy##NklG)@u1A53~AKr&ym5+>|0gnvW5LiL&|L@q&w=vhJTkfgEPx%jWP^#T?)$n zs5?=)Pq^n1?~@bO)GAFrzWN)R0a^_{BNwlb-zUi6n}SMU_%mQiISZHu;c`lV4(Fna z&Hz39VWj7=im6h&M&MZreZnF`7q)wVTMD{uHQCMZA$(Z91u7^7+4cBKuG){9Z$$*q z&Bd=0ZGonQa}002ovPDHLkV1mWu+2;TN delta 617 zcmV-v0+#*M1AzsQBYy%&Nklafh3$Jcj^?Wn$XM+Bwa2ZrJU*2qY}p$Faq8^~~W*?$37<~;;)O@<-bm#fH! z4hfWF9&xiUxR7I#EHn4Hm#2OZq#_-Md2y%!^F+30;G4qPG{m?vzrK%gA52A|0&Cok zDXF=`O&r~0vABWj3M3X@{HnTrvNUlJ7k2`!TY?C)qF!uQtoy z;)j*Z!t+qyNq_jOPBV_0b#=NFG1qf(qDdWT61Kz>%uOy)@TCw4x7J*Y1e2D&ho*TD zdzPk^4r=08DPQs%!G_zC#c@U=U1^ znTmt)Jt2xZr7ps$_d*yRCpaxYo~A-(H|R}vsF*a7`G3UImceNOv~c@59%YP#jpEXZ zZ_zh#+u~!YmL^iP1^^Ic;sFL|HZ#P9g@uKuf;$5k6j@SCn#^yxp(~Gzl>8M>XNXg( ztr3_y4J2DfJ3%YKG}UA~K`Y8UFuxGXF)wg5fns;W)W#wEE4}br0OoQjrX!}yR7^=< zgy~HIVq#r6hEN8(mb;QAWAIx5@DCrR5H%J3j@^qsh<{${!o4YofhiIJwC>2A5(qqR z0lYBY9l52y;@1n}>wC<`q*w9`z;m0#8QK>X7B2Vz@=T?*ivaf?00000NkvXXu0mjf DM>Zt% diff --git a/tests_speculos/test-messages/nanos.16.png b/tests_speculos/test-messages/nanos.16.png index d4fe3ec9f027d4681d2aadaff529572401be1ce0..7f6ab5e6010052a6c826d8a33994eba6cf7bbeed 100644 GIT binary patch delta 353 zcmV-n0iOP%1pES!B!5FmL_t(|ob8$24uc>Jh3hik|AD=57c8VoX|QUgc)lyrkl{{$ zfIxFnP#UC=#{VQYOj~O#Mc1|IYp9_cz)EzL-283ZC&=YDBGzn zw>WJSd>t^&f_$Y*xFwH8&&8*$1ReeJV+HB0_-24e>8)hRc7L8X!@0Ht2hgw^YzuAo z0F>?KHP7%21er<@_~X;u1W_f`a9&)8tifC~e#OpaQ*=)Jj^nQ=S=L>0_r)pnQR zorNTQ`GlD2lUgwY%%Y1iTmGQlA03N6_JADn{Hd}foCAjZjz^nu?egg}!`2`2ev}ux zp86)N&*a9K4v0_fnKKA|ya#}&1P^}z0C<)ksKJI!wn^`}00000NkvXXu0mjfx20B)b zv0Bq$R?esSyVsNz*^OOuE`g9zyH&-_MWjf_Xd!7!>8}?y~O;fDr&anG6f=dEoM6@4m(aK@h0m7H&BW z$K?dFx}e-Z^y+A?-UH5cu2VE+2|?NFpw}e}9&MFgxcvl{TcrdVJ6BCV*0xF)`ra2T zWUAflReNv}>wf_l0FDh=LMU5VxxkLXNdEtBqEPwU^c!t_eOkrIbwlDZRU~0w_ z8=46svgX8?C0q086YV`lL(Db*n?TX?At?jL8xX`Wq1YT&Y=lLj&E@HuY*u~< z2RuWM%KLEWf}Ta+J-|4*dr1%kR&eNoXo4YJ%~a&Pg4JjzM?^u&c=%74B47Pn;nM(* qnEHfI14J@F4JQePa^etH<^z##45KiQ;&lK3002ovP6b4+LSTZ)nYwoX delta 222 zcmV<403rXS1Ni}vBYyzENklbj?&pa6O!qUj-KP8b*aIa}NQpVDM27(Yu87xPW-HU%N9Xm=i`GrK z`c<=vSN1M)7xn*dyAZw~D~|m>-9vo?clT7^fSMlyQ3UBWz*lp*W^o_xVX~hV_xLK! zJWxl!^aO+v9CqZO_yak9g>(j#>GisJk$>I;(Fy2tpnp;v&~L`+D(V>k00000001D# Y3NOB8u!Sr%S^xk507*qoM6N<$g6bq{_5c6? diff --git a/tests_speculos/test-messages/nanos.18.png b/tests_speculos/test-messages/nanos.18.png index 7f6ab5e6010052a6c826d8a33994eba6cf7bbeed..10a806b1731d2182ec7d5b8c32c32d29ff41f1b9 100644 GIT binary patch delta 517 zcmV+g0{Z>@0-pqsB!A{fL_t(|ob6iO7Q!G1W}Wr^58Opvc+T1Y`7u-~zbj`95J7|m zaK`fifp|VJLpn1IMf4$^)uha@lu>F+e8NqWZ3EDl>ZZODt_i^Yp55+YGQ6r3(Z)x1 zruG(#@he5rv9&vSC2}!h+ZGea4avR$8jNHFFc4+WfiE^ zf5Ce$_eOI~Fn=AD8w2LE0+T5q>EK6 zZaPUnwB-X@0K0f5!@LbBMXXxovIMmPSml`yQzHNj{f`ENe$^h#E5y`1CJ?CSkNh#f zC^}byU07IHSb*=lXfA{zdi%E+Hm*-Aw3mQZJh3hik|AD=57c8VoX|QUgc)lyrkl{{$ zfIxFnP#UC=#{VQYOj~O#Mc1|IYp9_cz)EzL-283ZC&=YDBGzn zw>WJSd>t^&f_$Y*xFwH8&&8*$1ReeJV+HB0_-24e>8)hRc7L8X!@0Ht2hgw^YzuAo z0F>?KHP7%21er<@_~X;u1W_f`a9&)8tifC~e#OpaQ*=)Jj^nQ=S=L>0_r)pnQR zorNTQ`GlD2lUgwY%%Y1iTmGQlA03N6_JADn{Hd}foCAjZjz^nu?egg}!`2`2ev}ux zp86)N&*a9K4v0_fnKKA|ya#}&1P^}z0C<)ksKJI!wn^`}00000NkvXXu0mjf;Fqr7 diff --git a/tests_speculos/test-messages/nanos.19.png b/tests_speculos/test-messages/nanos.19.png index 50bcea8ef066c2dd963e046ab0dcabff12688b2a..e8678de677b79e2c6c22b79acfac2a86e3dc413f 100644 GIT binary patch delta 350 zcmV-k0ipiX1Nj1wB!56jL_t(|ob8y)5``cLhN-dlf8Z9Kg)`*^(Hte}{NKtD(G&$; zDCF2_*=Q8UPDGKxT%v~W+V>uo6P>)aq})A>qMfs+Q5<_}Gnc5r_8SUw1-W+6NZcjW zcTCyWN}sHx)XE@!lSRXuYsqEdl zzVD)H%~PnF@a5rDa7?cwq?kfO_WWrv(t+93;5LmByIo;w^D?fk@)`QBffkNs0B-Ug zw_WQhU?x^$KvyXf%`>9>v9Dz6I~j-q?DdMh#5D@79!gesz(A}{z2^@W!1l?5Ap9`z w+yQJ@W?zlkA143+0000000000007_S2TrZ(x)x+iYybcN07*qoM6N<$f`9d@2LJ#7 delta 442 zcmV;r0Y(1#0@MSLB!8PpL_t(|ob8#*vcn(G7NKF3d;Vd zJ5jk$xaSe?lM~j|DosAV`Wu@8S`9uU7q5`tC&=KNf=XccGhj+N3z!Dsa!P;>=c0?w z06qL+r021UsZzT};8_ZN!XiT#wtIkE3c77I+0F1Fd|15&Dkufn_4rG!+K-xVMFh~z z#je~F9sesW%766vsoT#ppw`b)|K9Pn$CHX@KY0&AUi7Iw=%A8U+N&U0x=A~oZY2GA zpl|pZTz3%*QcC@0Xooi)zG%vLf-YZM9S&T+GH#Cm_yTMk1z$9oHgg~4I%=PP;mkvH zML?@t)m{_3Cue4Z^DpoFnZ>?{SzhRj^WVe(E{E{xNi#rZEr&(t;Pp{HskN-)_=kx20B)b zv0Bq$R?esSyVsNz*^OOuE`g9zyH&-_MWjf_Xd!7!>8}?y~O;fDr&anG6f=dEoM6@4m(aK@h0m7H&BW z$K?dFx}e-Z^y+A?-UH5cu2VE+2|?NFpw}e}9&MFgxcvl{TcrdVJ6BCV*0xF)`ra2T zWUAflReNv}>wf_l0FDh=LMU5VxxkLXNdEtBqEPwU^c!t_eOkrIbwlDZRU~0w_ z8=46ePBuT!N$E11A1I_uGG-)SQ=fT?k3>}>^ZZT7gHG;Vg0N_A8Uh+4z5P4`k4?&*0 z0gI8jxF%dZQD>|}>Gk@vr*kvsp(>4A$gj`^FS|�~yjC`+rOvnGfsKp__FfsP0F5 z6XA7=Ywp>7d_c{t+~xhV|KW2$tHVdc;vM4q03GIrAdGnY31Ue36k-?@r!x*{cPv_T z2iV77Jn6Ns;i}SZ5%De+_k>4>5WaW7v=DULY%)yuC48B^B_>h`^4sy7wrU(R-m((_ zFBiXYKe+M#rGH0>J>PBneg|lBp8WTY)t;FsJNro`0RGU2_9TE3SK6~6p1N^A8BXFI zn>=dQ31Z!svZxqW*~t*Ah&mu(J1rUD$4G18L-}u`T~p-tm#|m?cJ{h-8!iUaZ{uBR zPlP+}7kPlt325C-etA!Uh{%gC!OJr0HY~jZFgWQV5ke+l!TY?=rxfFyXFpK;B=SwQ z%srU(r+jJ2W$k*T)@b~HsWm1^k|arzB#Zb3ry=etN32r~00000NkvXXu0mjfEce{w diff --git a/tests_speculos/test-messages/nanos.21.png b/tests_speculos/test-messages/nanos.21.png index 7f6ab5e6010052a6c826d8a33994eba6cf7bbeed..006c26abaac6c76b2e871b194165596c0b416694 100644 GIT binary patch delta 222 zcmV<403rYU0{H=uBYyzENklbj?&pa6O!qUj-KP8b*aIa}NQpVDM27(Yu87xPW-HU%N9Xm=i`GrK z`c<=vSN1M)7xn*dyAZw~D~|m>-9vo?clT7^fSMlyQ3UBWz*lp*W^o_xVX~hV_xLK! zJWxl!^aO+v9CqZO_yak9g>(j#>GisJk$>I;(Fy2tpnp;v&~L`+D(V>k00000001D# Y3NOB8u!Sr%S^xk507*qoM6N<$f;7l$OaK4? delta 354 zcmV-o0iFK&0sI1xBYy!yNkluRr;yTsQ43OPlRlX!mA#zXLNU2R?VwJ6)E zF1I*s6nq^p&4PTTOSmPEMbE{jtppwY^J4|+t@vhuNa?L)$$xg9H^aHM0|(Hs8*B@0 z_W+cj+c!iL*4pu%k?g3)p^Et?jlBD}qeX^7w zh-*VqpX?<_X&5N;^QW94?rBx}X7^SEVb9oL&43F7uuP6xy6C;Rn3-`r14I?fWYu<; z;hlvfeffl#>RXdB1I(g}F{EkPPaqaTyGsD&&@_v*T zyPouRr;yTsQ43OPlRlX!mA#zXLNU2R?VwJ6)EF1I*s6nq^p&4PTTOSmPEMbE{jtppwY z^J4|+t@vhuNa?L)$#$MM!@0Ht2hgw^YzuAo0F>?KHP7%21er<@_~X;u1W_f`a9 z&)8tifC~e#OpaQ*=)Jj^nQ=S=L>0_r)pnQRorNTQ`GlD2lQ9F#qKh$G{-E9;9g9Bp zfE@Dtsj?-U1BU#LN1Ji&^64|f)*teIloz|6`X;Q;G)@u1A53~AKr&ym5+>|0gn zvW5LiL&|L@q&w=vhL<*jGs|g>G7NKF3d;VdJ5jk$xaSe?lM~j|DosAV`Wu@8S`9uU z7q5`tC&=KNf=XccGhj+N3z!Dsa!P;>=c0?w06qL+r021UsZzT};8_ZN!XiT#wtIkE z3c77I+0F1Fd|15&Dkufn_4rG!+K-xVMFh~z#je~F9sesW%JliE+s`wg*3VM^-to1^ zlZt0Qc@IKf^r=1QppsYGs~}mrNjsfxB>j1yZ}=KqcM%IxO8sSMhc_L*Xv%nkE?-+6 z4qU!6ZjS)?0&E-wUo@FEb06h8YM+1M%tLfVK&xBTUK6_~XJ&)*FYo)A#lDDHUg(VT z-^2hehw$l1KxQq6Md#r4Q9h})tm62Gjml@sT4N9dK@bE%a5eu4`0Nl|44q&A0000< KMNUMnLSTY>a@(5# literal 0 HcmV?d00001 diff --git a/tests_speculos/test-messages/nanos.24.png b/tests_speculos/test-messages/nanos.24.png new file mode 100644 index 0000000000000000000000000000000000000000..85d9725b420f3973268d5c660e9e7c5f486f4adf GIT binary patch literal 483 zcmV<90UZ8`P)N2PZibzUHk|asKmB*xc&I8T)nlx!ARp-Il z{tO+RGHx+bj5UI}4glalJYMoQv=Dh{JP$#hy8(-lxws}=JyB<@L+SPUv!`=2=b7d_c{t+~xhV|KW2$tHVdc z;vM4q03GIrAdGnY31Ue36k-?@r!x*{cPv_T2iV77Jn6Ns;i}SZ5%De+_k>4>5WaW7 zv=DULY%)yuC48B^B_>h`^4sy7wrU(R-m((_FBiXYKe+M#rALW9-);MT2WWDh{P&L4 zo|z~+`$;7L{?Lc^B!CiE+Or^@x^X`lPU0P#JZjeoV%?Xrs2Eq-$q=iEIv`*>Eg9g) zNNeFk`ER3LQ{?uSuvh_h_PTT%E(X+Z<6UY`ggfpRd4SLfXx&YIc~60e$crz*%QEUV zEWHCTIO!r0CSbw)yw9f;uRr;yTsQ43OPlRlX!mA#zXLNU2R?VwJ6)EF1I*s6nq^p&4PTTOSmPEMbE{jtppwY z^J4|+t@vhuNa?L)$#$MM!@0Ht2hgw^YzuAo0F>?KHP7%21er<@_~X;u1W_f`a9 z&)8tifC~e#OpaQ*=)Jj^nQ=S=L>0_r)pnQRorNTQ`GlD2lQ9F#qKh$G{-E9;9g9Bp zfE@Dtsj?-U1BU#LN1Ji&^64|f)*teIloz|6`X;Q;eF$4er0N{2%s~ZqP2r)+aeH=&k8T!g1#2C*A%8&2yySf1t+2qJZx@@ZZ)l$~) zRbC70u95&rywbo~;qyzCht0nZ&qg!A8pW5Al3%LtoKtPo0e@$%kO7pO|cFnbK z3bG>Tr*FShNK%t?@SXPRfGkZZEKDy6o>X|r0dRo&;GH0rDwP_A&5L#*+5>kQVI?KoA-g;;wU zYq>PT1~0~S&wp<9;N<|&{NwR>SS7b}97k!)X`xl3zESME{08dUpX^Ze-%RO! z(G#FnAAfT|?99PQVCPcKU zTlApXFv64>ppuOSL$4W&N1AX}7rmku1`^)^W$;l0Q9aU2$DISScBR!5s)M5Z6&vnV zW`&@p-^C*ke=s6aT{KhC<}8e2T?k6g!43vBD6s~k(55yaT2~!v&8?&b!+pN0Z$oqm z=pj&RyxnoWYkwaQGIC>wf84o!OwWMjx1;7lb<5F|K+7YZSwFnw=>S=1W)cRGG#HS*x zy*?HQjBMSi)IJjlT5uZCXH0MhG%{ z`yfokmUkTT$QjTKAeiQw0|ffIL@cN3>e`{FHWe(|^(&OAS)l}3^)91wL;N4><|BH4 zgiE_6CPMtNt!j2*`2S%YgX*ijEFqQk=J7U2y>sPvI#hGx&``kZLRx$ld7;Gce z9gQVZi+@>#p1mHZo}Sw!kO+D+)HGz$hB;0jj?}fPUrmvQv-Dz?Mfk$-Mx%9?dqI77 zmDRc;BeXfYbU-*EeSmK>hOj6E)roRd;8GQNNQbUv3Zi0IDv|Pt@oM3!kK;a2>bO|k8VkS z3bx3GmiQAdotF`$zC`b__vZ#a@f>2>t^cLI@#b3;qE|kRR$%cc1tG0000F1DMQNuu$^DPyyL90RLxl8^L12>nw`#Ev zvH)QONr@0b2qA=!<@^NdI*#M~`?XJOzC~m z6QEWfe}TF(=P*$XEeq>+^Oq#e5kMGQ0?eDu(ixD)l!ju`Hl8pvKuNjL+ns8PZy`mNd65j!3@KFO%J52t)vCReZH!1Lv#t~ zAy8|)-EqEaAAb-sa$|>oiIDZM{Voi)J1jv_J#Mxi@tIGKGgmHXX0V!<-&SGsA%nQ+JZ+&@xQG5t&!Y$Mej zjU`iyS$~C|y&kBZp4%mm2zoQrG-T3-IZhvr)U~Q#O_7GP^kSAp_`>i;qji^iL49|X z)w&`hv^l$UKsX_NfNwK~uqXu8iE>roQWdMNwFq}7O39tf4rL!3g2>zB%xe-t2zepZEX(002ovPDHLkV1llWZR7v| delta 756 zcmV`Vju0L&j+v_N`6^Lh zh#3qQQUU+~0001BI{yM~<(%&y*L6uL%gH%6n|G(*iR?!Oe$G#np(A*_nFKFCl<71N z&F|)al%bM)jIgaN6X}Q9Q&P)oRc4Cxm$7&hQ)j?4pjb~;Uw>PsTz@3u_cD)OMLC?` zAWa${LuLTW(_&?2l-|*o2uBr4k!n^cAt9Xj4k#BNb|Io8y>#3?c&RI;o?yLWbe5%` z0+)N1QA<$M@6}(*`lC~=RGrOaO0h=91%vo)C_4k#$mt8hdLmn#wva6@ErV>m`)sV& zkaMmAtZ_Ygzkj5J7Gb7v2!EwcG48zzs8}9hb{f6y_jEvr3aA?o3TBV6kJ)$#`b>;%4T67KKVlC2o8Q5YC+lc0{{Tn2;YOJz`f0q zZPJdrps$LSvma(rSe;9M{h18%WTliyHrWPz5p7+XVp9Zd+UXTXC$N47=-4Gcqx*In z?^}03uk31h_qkhu*)a%LxMkP7;JB-c5Ejn>-MLD@)a6M_b+?66MD;Cjcxr#=9h|TH_8|Oa)c|0000YgJ~7^p~-C6jNuwGoV;cRexVwrd)p{;`cI-UPU>a z-ylsIA46sU%hO_IW|ZF1mk37{N|9<-DIp=8_zox+A9f+4BfWIoJ$R`rrJi8DV|13K zp8}VAmQhPk)9=+^%KD>ItyG=OWJ<9{#s!1;Z74ef*vRP%!g?ZGoVJiHE-iy>z58se z*N}6r0<3X8d4Ip8gcy1Fu5&=tunipkkxS5Iq$LOd0Kj5KpI@dS9sQy>X&1Cfr^ZJ6 zQTG8&{gSHfM#+;cE16;sVr;1-AHk>*>8fBQm8W#|+#<{wZL*o0b44%prt!VZQ$tg$ z#l7Ftv_=PJ_#*cHc5G?~q?WwgB|bMVTUhS|s`*MSc7IL^!o5hha$D6>&j5FSDxt5k zuNaXO%0!e%y*kTZ3Pztgf^fsVo9y#G8_~(|{xld@!~2s#AFKqc&`KIkMjs4ih@h8U;6m6M%PHLYDg(CH0}r%R-4CbFg+c8pr7 zQR(#Mbbkn?PBHGi3aD5fVRjn5?e}y*hzh7159E=LV$DkQR^$)DbF{|y*q@m$!7~Fa zamFH!(y?ijRHbZsT^#cF^*a+W)r@+0< zl5NtCyP&U%ma`vbQCOWzfBl&Z@?@oyNH*C9d~Ok4nqpG~ZQAJ-M<=j;2I$x&KcoA0 z8}D0pK(Fj-dH1wW)5S5QV$R!}(R@t?0<8}(?hyXAf62R}?P|i8xI4uA-2cD#yvQ(b zC9|#|0|HcNES(Z`CB5)KXf4zGC!)1qtyxcenVx!a-buwY))}P|m%kid#}FFKd>=$h z7PjTht#gUFqW+<0ANR~<@@4-UR(0Ms|I4_z-r90^^uHUu*WZ1&nAPU%LET z7N?jjY*tO>e7NeEZ_yQ#Y{A?9vA=rzO(xv>*nax@p{F*5jA@VG zT`*m6ENhpO+Nw;)*NHdmlYeTT>Mn5m|L8&PuZVqT+b+wm*q{6N{3m9FpY2}qJ?q{0 TmihTX1CXGntDnm{r-UW|G!UBX diff --git a/tests_speculos/test-messages/nanox.06.png b/tests_speculos/test-messages/nanox.06.png index dbbdb276b0c5dc45bbcf2bcd75d07d53f0a031f5..1e4be69934787c368c2b5ed677cc7f5a2470be3b 100644 GIT binary patch delta 328 zcmbQq{FrHiO1+k+i(^Q|oVPcl`I-y_S|48AA^dIsl6Obj)r2o`cZm17|9|g!kzw9S zW?exB1gOwhIwj~zdf|c4TBi3;L~FlVv!3`eJ@w+elZt7qGfE{ce>uF4AvBozK8Thq zY|EQl=Mr;8{X@?_?wQNv%lb!0KmvOOmz2)xce>Zxszx!@6tIg-va!D88U+Rn5 zyh;>R*B$mc^1Jki@k1-6YsM?ndam@BnVS`F?0s*(-n^`c@2Ss@`178Jbj6K~ij|I|L!UEucr(SzJy5&O=zU6x<5KlktXPs|8E+r8v_*1Pd7 S^YeoSAVE)8KbLh*2~7Y!n40wf delta 382 zcmV-^0fGMG0+|DlB!6H@L_t(|obB3SZo?o9hGB2oO?>|&ahLr-vn)tZ)n<)9`aZu> zlvd2fZXq)R00000008h7Uw2R70UcJ~`+@`UfZC-ABqeMLWaPv9DI3qPo~pu>f) zmBG2Ty6&!i z@L*=GwLE`;ov?JcXMGvPA0@dH4((5VxxTI-O4%e5a2CGYj^^vb+lmmY0C%6mH>V_z z#<);K@)Ek9=TF6%#OcJbddr3-%u?n}DGR;$=J?%Oi_7qKaydg+tK_z*fpGe*gdg c002JDFFp3j#}=fE>;M1&07*qoM6N<$g5pWDrvLx| diff --git a/tests_speculos/test-messages/nanox.07.png b/tests_speculos/test-messages/nanox.07.png index 2689ddb23270a26a35f8ff07481a8bca2379a633..dbbdb276b0c5dc45bbcf2bcd75d07d53f0a031f5 100644 GIT binary patch delta 382 zcmV-^0fGLc1DOMmB!6H@L_t(|obB3SZo?o9hGB2oO?>|&ahLr-vn)tZ)n<)9`aZu> zlvd2fZXq)R00000008h7Uw2R70UcJ~`+@`UfZC-ABqeMLWaPv9DI3qPo~pu>f) zmBG2Ty6&!i z@L*=GwLE`;ov?JcXMGvPA0@dH4((5VxxTI-O4%e5a2CGYj^^vb+lmmY0C%6mH>V_z z#<);K@)Ek9=TF6%#OcJbddr3-%u?n}DGR;$=J?%Oi_7qKaydg+tK_z*fpGe*gdg c002JDFFp3j#}=fE>;M1&07*qoM6N<$f`!DhX#fBK delta 394 zcmV;50d@YF1Ed3xB!6p3L_t(|obB0Lj>8}fKv8DYov{BUc`x&Uge>!Dl0Ix_?)j=v zsHg!`oKgS)000000DQ%d_W<5NMEd7itK`1KyZt90};dUy}uJ<=`wE^7*!F8qws zkTL~jPdi%T6x7yxn~aQWze%|R?j-RJxJM#NxdTkX$(w%w0Dl00Zy4_`fr@cvaQCP* zj6_8LoNyPhJH>jc)~c6UvQotO@@x7!?0BP#HV17C;da1APe&#@nU=1%uljn?St#5N zScRsyn+G_K1kbz#nca1-z}Ip_!U5p6QeH0bUJjER0pl!DI2PUj!@xOd}7!u<_3 zLo|*1LwMR4@P7~n002OGA`;<#i>#tt#M&MGX=!0BuI+DX;}=GI%@C**p<_1|FLmHn z;oJ8bAN$~sIV@H&&cy3fa^Lp~RS?x;O@MK2kp@}X2L(z&-713n^u6y@qSi+vPC!wy oKJ_p2S}y(fa>CP00000NkvXXt^-0~f==zXbpQYW diff --git a/tests_speculos/test-messages/nanox.08.png b/tests_speculos/test-messages/nanox.08.png index b6b0217ccfc843fdaedb996ce078de5d0d5a1459..2689ddb23270a26a35f8ff07481a8bca2379a633 100644 GIT binary patch delta 395 zcmV;60d)SQ2c!d#BYy#FNklnlAi| z(~vR+WluX=;uO@@dz*}mYrjdk1MVd84!B1mO1T3}!pWO|0Dk}gfNvP@E`f@1W^nhY zG>k+<|D13au{*_js@AHPTC!5a`0{J|I_!9(i#7*s4B>XbMo&j3JDHZQx3Bto(OD?m z4p@bzx0?qxq3l6l^>ty+fN&G=G&$%8^bu_`%rxlk2aJh+NtA-l#!lxS_qccCNW%RM zHA6Iw`$Krz7=Q2(1^@s+dLk0xev7Q4T*TTP{b^}oEUxWuYU3A1d(9B26rp1`7B6++ zR^i+C8Xx=Mk2x$>G0w#6RC3?<3RMu*VoiW?ZIK39+6M(nLES2X`}DoMcjj585jx&!)%F#6eX z_=Da`hDAL9FJtI};01?i=SJpYCQ^`>pdmc}aE45!D@;YcC7M`BSV}>k{@RK@P0}F#hhRQ;9V@{3V$B$K*Qbl1@ltawH2)E2^D(5 z!vizXylO=d_+aV7wAj%KDdTpo`L2_2xVZLpG~IA6RLjYIa@N^$2kcvtZ*@dSWk}07 z0YeDo!P4rac3}K@+dmb;y=MO_6bu!H*jA~>tT!x7!@KU|FTow;8vVxrLtUf)Ff|8n zQd#Itf`37-IoOIF-WfNP7>5&^PQ}%+76q)yUChuB^?K|}JQH*X1%t1$Xk>apQYNVA zdZxOY^GYYGLDFuhS3y~WdS9vA;$iL;kak0@2>F9UZ=|;}64U_y#ZUp%1gZ z;ZnbocpFOYN3uJ#ySFe1X%*fs6WdTC`}WOiQ4~c{6h$$R*oKB%x`Xbz!lM9p1;SVJ z`W{pp*}o1itku#DCIMozNR&6N$|d8+VxCj9%%v;A8}xAIm1pTWbm5P=H-g( z>9Ns_`@AaPby|L~&y|psw)@Dc+W2*}f|5^mwB1KmRpON-e~;m9OtYc9fO^}orf6P@ m>0VS-6h%=KMNt%A#D7L_Y*&ak^-BN%00{s|MNUMnLSTX&(!53h diff --git a/tests_speculos/test-messages/nanox.09.png b/tests_speculos/test-messages/nanox.09.png index 8b16b4d929e22d4682084595645e2dded364e13b..d3179debc0b3159618ec78b00cb4689c8d5abdee 100644 GIT binary patch delta 442 zcmV;r0Y(0&1k?kNB!8PpL_t(|obB0Bl7k=&fMK??H}U>Q;x7AOC&NGzkb>a$|DLK9 z!2nS)1ONa4;C4T&8xTSWF-G})97p#V`pP227|#gGkMHrjx&am0G=o%ZU0ELqFurKh95QUCw|c!2MGyjy(LY4wlpfUO$e`aM8hUzE-A zuZ}=1u5gt@tnqm34Az+KI91DqSbG|4 zxirHDFUEDxZh!USvyrPV_s?jI(~RK;cR+Vr)fG^=_-r$1nWtQy`#f-Ey-sy~_F9a~ zl)2Rz)af$k)MkvWE}sGZjPtu)y}Pz33;LVE&DSz%s(05ji0wDw#=jhugtpc5S-ZwN z_9oS3$G_4)cKAT??_~+?{T}f2=-=@eKD0U|;1A6|PcvkOnm)KeCCK!_RD>4*00000 k0000000000005Zg4`HT-HtyW!%m4rY07*qoM6N<$f?^Ki@Bjb+ delta 526 zcmV+p0`dLS1E&O#B!BKnL_t(|ob8!gQpF$)K+$n0?0-q@#gC2*k_Txi^j<{90AM>G{^L^0@kh?tl03^{&oyI)b4w}1jkiivclow`Ua62n;$tIn$JQp$NHLv&8j3 z;z+FX(rHtdh<}?T)t*w)*XR)|O{R>xI^mXjqC8y<@X)EB4T+9^lsg~pqiGKxC>omI{mc@|}g?2bZ z^BM!LPh9mAUI8K`Lh&h|hMq(?yU>&kNz$_^HeYl$#0G#Yz~<_!b*>nQq;92UjoS?Q zyoc@syk`pv?Rxh9V?%Z-zlU5|>{PSq*VOF$-w5VxLFqHujY(}tG+&7|u?x|Gd#RC$ zDGHn6c*dT4<$s(p-h04KNZ60Oo;wj;y>L1_Z3Tdv&|Eoj1tk4_^gv$ZDgXfN!*e~J zVt+%cb?m5yM$e_waeW{ zK7{XD)mtupV)6V0=n5FgX){7C3&xj#%sv4|-3T@B=#KYjYg%T{oFjh>HOa{SHiT3o z`#%c>$sGi zg?1?om2fIYilco$nte@V`QK9bq#HN5RDV`mCu;|QS0cyPa$j+DPhTBu`XqVIsd!o) zck3a{YmHoD50z1^6o)xf-6YDQZ-)#U000000000000000000000001*`~vZ@c6XB` RRxkhn002ovPDHLkV1hxRDdGSC delta 329 zcmeBYeatjLxt>wW)5S5QV$R!}(R@t?0<8}(?hyXAf62R}?P|i8xI4uA-2cD#yvQ(b zC9|#|0|HcNES(Z`CB5)KXf4zGC!)1qtyxcenVx!a-buwY))}P|m%kid#}FFKd>=$h z7PjTht#gUFqW+<0ANR~<@@4-UR(0Ms|I4_z-r90^^uHUu*WZ1&nAPU%LET z7N?jjY*tO>e7NeEZ_yQ#Y{A?9vA=rzO(xv>*nax@p{F*5jA@VG zT`*m6ENhpO+Nw;)*NHdmlYeTT>Mn5m|L8&PuZVqT+b+wm*q{6N{3m9FpY2}qJ?q{0 TmihTX1CXGntDnm{r-UW|Hlv#E diff --git a/tests_speculos/test-messages/nanox.11.png b/tests_speculos/test-messages/nanox.11.png index dbbdb276b0c5dc45bbcf2bcd75d07d53f0a031f5..b6b0217ccfc843fdaedb996ce078de5d0d5a1459 100644 GIT binary patch delta 912 zcmV;B18@A91EmL$BYy*INklMcjj585jx&!)%F#6eX z_=Da`hDAL9FJtI};01?i=SJpYCQ^`>pdmc}aE45!D@;YcC7M`BSV}>k{@RK@P0}F#hhRQ;9V@{3V$B$K*Qbl1@ltawH2)E2^D(5 z!vizXylO=d_+aV7wAj%KDdTpo`L2_2xVZLpG~IA6RLjYIa@N^$2kcvtZ*@dSWk}07 z0YeDo!P4rac3}K@+dmb;y=MO_6bu!H*jA~>tT!x7!@KU|FTow;8vVxrLtUf)Ff|8n zQd#Itf`37-IoOIF-WfNP7>5&^PQ}%+76q)yUChuB^?K|}JQH*X1%t1$Xk>apQYNVA zdZxOY^GYYGLDFuhS3y~WdS9vA;$iL;kak0@2>F9UZ=|;}64U_y#ZUp%1gZ z;ZnbocpFOYN3uJ#ySFe1X%*fs6WdTC`}WOiQ4~c{6h$$R*oKB%x`Xbz!lM9p1;SVJ z`W{pp*}o1itku#DCIMozNR&6N$|d8+VxCj9%%v;A8}xAIm1pTWbm5P=H-g( z>9Ns_`@AaPby|L~&y|psw)@Dc+W2*}f|5^mwB1KmRpON-e~;m9OtYc9fO^}orf6P@ m>0VS-6h%=KMNt%A#D7L_Y*&ak^-BN%00{s|MNUMnLSTaSle{|s delta 383 zcmV-_0f7Fc2blwqBYy#4Nkl`q0{{R30002+7GHNy-~z3+xOVp&XYz#ayC?9f9DPMUcTeCNatlAGwxGj> zub2kO7Np*GGT|1~*LzQf;@a;dD_|$W6|hGmlB|HC;pp}s0Dk}g;2q|@OXYk!!`q4ws{nVO!#AfS zkL0!guXB6C@EstKfSnA{H{ArxHPJ_6Jl9Q~{xi=+H37EE6EOe)fX`IxH1xv%b5{9z zT5%t6c%-u{fq3KSZZ3|qa#Sc1t62euYt~Md_Ijkg ziWPA79pK4O6OVjgO%)R`cszXTI}7$7E1Q6!2;yZt9m^w&H=>GakA*|g3cyy%E`I<3 d0000!&M!Uo$;TF?i|haZ002ovPDHLkV1kf5vu^+Z diff --git a/tests_speculos/test-messages/nanox.12.png b/tests_speculos/test-messages/nanox.12.png index e10e0049c4e39446eb67baea703f77a107925640..8b16b4d929e22d4682084595645e2dded364e13b 100644 GIT binary patch delta 526 zcmV+p0`dL21E&O#B!BKnL_t(|ob8!gQpF$)K+$n0?0-q@#gC2*k_Txi^j<{90AM>G{^L^0@kh?tl03^{&oyI)b4w}1jkiivclow`Ua62n;$tIn$JQp$NHLv&8j3 z;z+FX(rHtdh<}?T)t*w)*h($ delta 416 zcmV;R0bl;71iAx|B!7WPL_t(|obB1su7e;9fML#Z-h}smB;I8g%Sc0OWzJ$V|L?YGFsE>_?5GQ;gM zXJ*a1+Q}FqESiE|@1y?`$>%hm`J1;-SGd)!I_2ND?pQGe9gtyuUlT*%6eO9$e_&22 zXECQivpHvgM$AQH0#0nBN9+%ObELO7vu0UlJ|1%|HQ$Mu7>?PgEp)Xpn_Jvs2Ahw( zzAx^XfMRy_C4U`p+XR$6Ik=}pv(OFYT8Hl@d-rbbLT7H-y?D4-s6`vGPi5E%uaV*? z!rZA1TO_?>^3OPR<>qNC>|OEhTx1q-ZuiSyD8&fy$%EwsU6!Gj9oZA05BEPkqffq^ zBwd6D`g7RNxPAoqojbFHI*YLWF!{r|1ONa40000002u%P0MZjraXv3O=4HhI0000< KMNUMnLSTX_&cj>) diff --git a/tests_speculos/test-messages/nanox.13.png b/tests_speculos/test-messages/nanox.13.png index 7e236da60aac4c243bde35b1f1e6e89b08667b7e..1e4be69934787c368c2b5ed677cc7f5a2470be3b 100644 GIT binary patch delta 328 zcmZ3({FrHiO1+k+i(^Q|oVPcl`I-y_S|48AA^dIsl6Obj)r2o`cZm17|9|g!kzw9S zW?exB1gOwhIwj~zdf|c4TBi3;L~FlVv!3`eJ@w+elZt7qGfE{ce>uF4AvBozK8Thq zY|EQl=Mr;8{X@?_?wQNv%lb!0KmvOOmz2)xce>Zxszx!@6tIg-va!D88U+Rn5 zyh;>R*B$mc^1Jki@k1-6YsM?ndam@BnVS`F?0s*(-n^`c@2Ss@`178Jbj6K~ij|I|L!UEucr(SzJy5&O=zU6x<5KlktXPs|8E+r8v_*1Pd7 S^YeoSAVE)8KbLh*2~7Z1@S6w# delta 402 zcmV;D0d4-{0;~g&B!6>BL_t(|obB0BZo?oDMNwLHC+vSo?4=)3DT3z-i9L7}?)kDD z3UGZ9qlwEsVqPEZk6+b(ow;kUJUC83RTo6g zSzgyWUHN*mlrokdr=cy@wKYaEh9_fgV@M9O{(WtAty0QS(0}cn?$`QA+wG*ru9oQ@ zZ|6+bJXSjygNH?1(BplyU!u03vd?GUzOlliVI8OZeCvi4ThJRK?C)!0aNL4ga`|`U zmU0!j4a(+>1?sUE^%HPm8#Q8k`OB4F{>Yl!GV}4svsAtlGcmm9No}sDjcjglixC`l zdHq=IIRQxy^?xk`vF!w;ICHS4K)cX}Vx7ag`LyAEn#Otc+4UCv5yO!vsfaGuCch}y zH|0NABO!`^WB$ud%-O|eE@ZX02)6=GmO1~(Vo@ewG7a}?f<8i4)y5%wvk)slem<0p w^FSt?yI;reng9R*0000000000;8XnqQ@t$#Ev@g}01E&B07*qoM6N<$g6Ai@fB*mh diff --git a/tests_speculos/test-messages/nanox.15.png b/tests_speculos/test-messages/nanox.15.png index 2689ddb23270a26a35f8ff07481a8bca2379a633..e10e0049c4e39446eb67baea703f77a107925640 100644 GIT binary patch delta 416 zcmV;R0bl;41G)o{B!7WPL_t(|obB1su7e;9fML#Z-h}smB;I8g%Sc0OWzJ$V|L?YGFsE>_?5GQ;gM zXJ*a1+Q}FqESiE|@1y?`$>%hm`J1;-SGd)!I_2ND?pQGe9gtyuUlT*%6eO9$e_&22 zXECQivpHvgM$AQH0#0nBN9+%ObELO7vu0UlJ|1%|HQ$Mu7>?PgEp)Xpn_Jvs2Ahw( zzAx^XfMRy_C4U`p+XR$6Ik=}pv(OFYT8Hl@d-rbbLT7H-y?D4-s6`vGPi5E%uaV*? z!rZA1TO_?>^3OPR<>qNC>|OEhTx1q-ZuiSyD8&fy$%EwsU6!Gj9oZA05BEPkqffq^ zBwd6D`g7RNxPAoqojbFHI*YLWF!{r|1ONa40000002u%P0MZjraXv3O=4HhI0000< KMNUMnLSTX8}fKv8DYov{BUc`x&Uge>!Dl0Ix_?)j=v zsHg!`oKgS)000000DQ%d_W<5NMEd7itK`1KyZt90};dUy}uJ<=`wE^7*!F8qws zkTL~jPdi%T6x7yxn~aQWze%|R?j-RJxJM#NxdTkX$(w%w0Dl00Zy4_`fr@cvaQCP* zj6_8LoNyPhJH>jc)~c6UvQotO@@x7!?0BP#HV17C;da1APe&#@nU=1%uljn?St#5N zScRsyn+G_K1kbz#nca1-z}Ip_!U5p6QeH0bUJjER0pl!DI2PUj!@xOd}7!u<_3 zLo|*1LwMR4@P7~n002OGA`;<#i>#tt#M&MGX=!0BuI+DX;}=GI%@C**p<_1|FLmHn z;oJ8bAN$~sIV@H&&cy3fa^Lp~RS?x;O@MK2kp@}X2L(z&-713n^u6y@qSi+vPC!wy oKJ_p2S}y(fa>CP00000NkvXXt^-0~f`PZUmH+?% diff --git a/tests_speculos/test-messages/nanox.16.png b/tests_speculos/test-messages/nanox.16.png index 0bcbe65fba5cef534b36b6a7ed7d6a5611ee8345..7e236da60aac4c243bde35b1f1e6e89b08667b7e 100644 GIT binary patch delta 403 zcmZ3-zJ_^%ay?_Qr;B4q#hkY{1M?0m2)G7Dm8!p~_k6QdK2WpiIcKMBg~+>~n`C&H zB?69VGBO~5c)Z-yX+f__&)r~Sok@Fio2YPjJs|f`?G5E z6r*YK%NOci+iL1&)TW-Cm+Zl}`Cn~r>Dr)Ef%O;O&V6_Nm&fh5OOCCZ_EIkYxz9D5 zFl))?cGu_&k88KYFWNSL)A{s!`!*h0oG82ePtEH#(dY}(N^jn0Cl%ajiYoe9{$yH_ z=uX~K&w5y2Z5011T#zVjnpFMs^whY2CuZF?`uy?4=8%2D#)f;Id*-fN-kXzG*exhi zR{1yLjU}TeU;S5I=8bPzmRJ;TSnja z+J222=1=V-loh+`lmDIeJ9G1BnqJD*?Ht>g{H9s{KamuumSDvDJ*&yiDeUSo#hT3m v+75MgQ+hr-sLk0OfBgL{M8GjT2>#0yyjPb|ckTPTJRosTS3j3^P68>?wPWF@Ih$?9PDR^JdM3TVqQ7 zOHtJuZEz7f3nQ+LLA|_O48Y+II|EF*G#DV^in&unn2Ygh4O3@9oSFfnqN!d7ir?rx zMGR_zSq)JHz!Nu@orA1tPAoy*0&RlVAB=?Qc(Q2TFUh(H9g}ev292vQxNN^K=81FoqBuSEd5PE+% z&oE3_Dm*Ie7=$q#k-ZH7ePOd)wMBHn*8{FC(-yPY7xejI5k6oMvgxUdSa=B{k1OVV zP25(P3s-0ZnzarwUDJUzn5ykchhu@C0igm|0j36ZSbu0Zc+FaaB`BP-g1H%h{Wdes z_P_3uKBl~=05-UTsemqq>HsgS819YBG4$hzT?+X2WJi|$V4TOp)d&%>=+E&@c7S$n z+_l8i!`0Ac%w{fZdde7}9&NC}K0x1m!4S3yGPvc?ntaD?|w^&RPt$`9G+g_Qp)XBX??|=piN| zj;0NE)pQA$LQWTE29WdYu2_%&JJGC&Ciq1cKYzf5F;mLJpbpSgUE5E{=;?8GcfXk! z>T<@1X2A38w|?1(q4F8GI)ID|hI=CuanvGSShP5MGEnd|ciJIIk|arzBmq$WlxJSP zhmpbyEj1pK!=oot9O)AFL|3r*$5~I!t1=4{&6o}NOesv2vi88c$9Rs-Or|el2Rin< z&VO5g=~d=yx14dV1IDOXFOR$gilxR}XF{n{HpN*$LJ!9j9p*DLVmE>g2$vBvkhz8@ zW%iueK)lTq%W+x840Qmxi!v;C4_V0qoA|A8EW=0tP4!4b^TR>MP;#3hPl5W?LVpgA vp^Oc44rY{(tNrt1C`pneNs=V_dHeyO`V#FrSfByS00000NkvXXu0mjf%jmon diff --git a/tests_speculos/test-messages/nanox.17.png b/tests_speculos/test-messages/nanox.17.png index 91dcbdcafffb2d9619d06a89d1ca3cd941e0b3e6..dbbdb276b0c5dc45bbcf2bcd75d07d53f0a031f5 100644 GIT binary patch delta 382 zcmV-^0fGLU1epVnB!6H@L_t(|obB3SZo?o9hGB2oO?>|&ahLr-vn)tZ)n<)9`aZu> zlvd2fZXq)R00000008h7Uw2R70UcJ~`+@`UfZC-ABqeMLWaPv9DI3qPo~pu>f) zmBG2Ty6&!i z@L*=GwLE`;ov?JcXMGvPA0@dH4((5VxxTI-O4%e5a2CGYj^^vb+lmmY0C%6mH>V_z z#<);K@)Ek9=TF6%#OcJbddr3-%u?n}DGR;$=J?%Oi_7qKaydg+tK_z*fpGe*gdg c002JDFFp3j#}=fE>;M1&07*qoM6N<$f_qW3VgLXD delta 514 zcmV+d0{#7&1DphqB!A;cL_t(|obB0LZp0uAKv7zCC+vSo?4=)35yB5l5&2Mi48ry1ApqUt5@FT)VAawNz}bP z#_vL&5(zF3cCO33@)#%QOY{y<)ws@`A?MmKr+62`vm#l|hV5=C=PMy1bO*HI)X=$+ z?4s9}Zc=yDYv{UgSi#k0CoXczjj$6-khMUo{PoAztyJ+0ry}2u;QZ?}S{^MyS7&ub zCvACgTCDlfMSoMfh^HjOP6g@mueX;IU#_(8PNP-2syQQcB%eh=cn&bVHEsPkgD2t5 ztoZlG0gz+wUcnMiAH-I3UPH>Kq4>nN zBJ6j507~ z?pxtVgcqG(f@XDZm2cGUd4w1B1F$Zk$nqNe4)D(%Hm>MBXi(ncTY~?nlAi| z(~vR+WluX=;uO@@dz*}mYrjdk1MVd84!B1mO1T3}!pWO|0Dk}gfNvP@E`f@1W^nhY zG>k+<|D13au{*_js@AHPTC!5a`0{J|I_!9(i#7*s4B>XbMo&j3JDHZQx3Bto(OD?m z4p@bzx0?qxq3l6l^>ty+fN&G=G&$%8^bu_`%rxlk2aJh+NtA-l#!lxS_qccCNW%RM zHA6Iw`$Krz7=Q2(1^@s+dLk0xev7Q4T*TTP{b^}oEUxWuYU3A1d(9B26rp1`7B6++ zR^i+C8Xx=Mk2x$>G0w#6RC3?<3RMu*VoiW?ZIK39+6M(nLES2X`}DouWQcObvoKG!N0}hrTa|xe8-(zw8a>!Xl>+s zw*kLor^xwHhAPHbNh~_UXY7MA7cDw{Sv>>7rz4uRXqcY%{C_=ukRxV!Y1Ml6%z&K2 z3F*+3=6wxKd8O((rAFgHCCG&`FsEkKE;f`PiA?8R1z|mp2tZIC42fYm8tQDWP#?7x z0ssI203Wm!p0)wb?YT^r%k^R;zdk_-MDF>T)@5|vBIFG9otT}vG_Aj5^PG8`<2~HdYnKeG zlN2@&PN^E&+?4ktG#x*mW?c2Lt^Fz~>^$*?s!rKpv{?(PSIRGX1{hs4=l#rF9t?HL z57`|H&Oy}~&@9K5F!{w;xV0r_+1$REgLX?Qzu*0|0{{R3000000000000000NB#pM W$!Pv;QncX!0000Q;x7AOC&NGzkb>a$|DLK9 z!2nS)1ONa4;C4T&8xTSWF-G})97p#V`pP227|#gGkMHrjx&am0G=o%ZU0ELqFurKh95QUCw|c!2MGyjy(LY4wlpfUO$e`aM8hUzE-A zuZ}=1u5gt@tnqm34Az+KI91DqSbG|4 zxirHDFUEDxZh!USvyrPV_s?jI(~RK;cR+Vr)fG^=_-r$1nWtQy`#f-Ey-sy~_F9a~ zl)2Rz)af$k)MkvWE}sGZjPtu)y}Pz33;LVE&DSz%s(05ji0wDw#=jhugtpc5S-ZwN z_9oS3$G_4)cKAT??_~+?{T}f2=-=@eKD0U|;1A6|PcvkOnm)KeCCK!_RD>4*00000 k0000000000005Zg4`HT-HtyW!%m4rY07*qoM6N<$g2puDDgXcg delta 328 zcmcb@{FrHiO1+k+i(^Q|oVPcl`I-y_S|48AA^dIsl6Obj)r2o`cZm17|9|g!kzw9S zW?exB1gOwhIwj~zdf|c4TBi3;L~FlVv!3`eJ@w+elZt7qGfE{ce>uF4AvBozK8Thq zY|EQl=Mr;8{X@?_?wQNv%lb!0KmvOOmz2)xce>Zxszx!@6tIg-va!D88U+Rn5 zyh;>R*B$mc^1Jki@k1-6YsM?ndam@BnVS`F?0s*(-n^`c@2Ss@`178Jbj6K~ij|I|L!UEucr(SzJy5&O=zU6x<5KlktXPs|8E+r8v_*1Pd7 S^YeoSAVE)8KbLh*2~7ZrFq<#{ diff --git a/tests_speculos/test-messages/nanox.20.png b/tests_speculos/test-messages/nanox.20.png index dbbdb276b0c5dc45bbcf2bcd75d07d53f0a031f5..4face5fba1b366ab63f1762ff27aa9177818b1e5 100644 GIT binary patch delta 625 zcmV-%0*?Ke1BnHYBYy%=Nklr| zX+jV}00000003Y+KUNK=l#YiOV=Lzk{8|g}c0Seugp^W@F?WCRDnB2?VlIbds)cvr zcLW@&i7~R8BFZXr;+IhAy(}X)u?_nXz>;+#jEvF-WlpCa<$or&VQhfX`LK?t?&+oC zj?P=FvSo?da&>YuE?khRck)W`KQhEq4T`x0r!FXbJG;=Sg`AdGA+@nhfa@V95iGPH z7cS_{nC*l&(^`)L006k2^q-u`mQ<^{P^zn{x(DQk&HsN+fTd#Z-iWcs0Ax!=mMA?1 z@^kBzeCi++D}R&sTRRCOp!Q4Z_I1Kp4GExTuE5tuY;HavGtFq7wm32X32hD)XvO2y zI?ZupfCE)u6AJZg13C%k8E-#oR8lC=8UAD;XA(j^=QX3K*KId>5=|vT``cht4ef6R zHn0R<$Pz`#u)$KEtllU88&H`x|EV)!5{6VmkDW<2r+@WTDNN^e&$`|EfvrKk_|$kTHH&L18@FT7Ok%Vl_2DXH>F3 z)1gyxJpwMoq3RFbVgR?E2a~WdHy#1(w9H18&&N;!000000C*ICa`q0{{R30002+7GHNy-~z3+xOVp&XYz#ayC?9f9DPMUcTeCNatlAGwxGj> zub2kO7Np*GGT|1~*LzQf;@a;dD_|$W6|hGmlB|HC;pp}s0Dk}g;2q|@OXYk!!`q4ws{nVO!#AfS zkL0!guXB6C@EstKfSnA{H{ArxHPJ_6Jl9Q~{xi=+H37EE6EOe)fX`IxH1xv%b5{9z zT5%t6c%-u{fq3KSZZ3|qa#Sc1t62euYt~Md_Ijkg ziWPA79pK4O6OVjgO%)R`cszXTI}7$7E1Q6!2;yZt9m^w&H=>GakA*|g3cyy%E`I<3 d0000!&M!Uo$;TF?i|haZ002ovPDHLkV1i>@vrzy5 diff --git a/tests_speculos/test-messages/nanox.21.png b/tests_speculos/test-messages/nanox.21.png index 7e236da60aac4c243bde35b1f1e6e89b08667b7e..94fa10382c06fe29afed86ded1fc0f1c0e17e9df 100644 GIT binary patch delta 584 zcmV-O0=NCF1KuWQcObvoKG!N0}hrTa|xe8-(zw8a>!Xl>+s zw*kLor^xwHhAPHbNh~_UXY7MA7cDw{Sv>>7rz4uRXqcY%{C_=ukRxV!Y1Ml6%z&K2 z3F*+3=6wxKd8O((rAFgHCCG&`FsEkKE;f`PiA?8R1z|mp2tZIC42fYm8tQDWP#?7x z0ssI203Wm!p0)wb?YT^r%k^R;zdk_-MDF>T)@5|vBIFG9otT}vG_Aj5^PG8`<2~HdYnKeG zlN2@&PN^E&+?4ktG#x*mW?c2Lt^Fz~>^$*?s!rKpv{?(PSIRGX1{hs4=l#rF9t?HL z57`|H&Oy}~&@9K5F!{w;xV0r_+1$REgLX?Qzu*0|0{{R3000000000000000NB#pM W$!Pv;QncX!0000~n`C&H zB?69VGBO~5c)Z-yX+f__&)r~Sok@Fio2YPjJs|f`?G5E z6r*YK%NOci+iL1&)TW-Cm+Zl}`Cn~r>Dr)Ef%O;O&V6_Nm&fh5OOCCZ_EIkYxz9D5 zFl))?cGu_&k88KYFWNSL)A{s!`!*h0oG82ePtEH#(dY}(N^jn0Cl%ajiYoe9{$yH_ z=uX~K&w5y2Z5011T#zVjnpFMs^whY2CuZF?`uy?4=8%2D#)f;Id*-fN-kXzG*exhi zR{1yLjU}TeU;S5I=8bPzmRJ;TSnja z+J222=1=V-loh+`lmDIeJ9G1BnqJD*?Ht>g{H9s{KamuumSDvDJ*&yiDeUSo#hT3m v+75MgQ+hr-sLk0OfBgL{M8GjT2>#0yyjPb|ckTPTJRosTS3j3^P6uF4AvBozK8Thq zY|EQl=Mr;8{X@?_?wQNv%lb!0KmvOOmz2)xce>Zxszx!@6tIg-va!D88U+Rn5 zyh;>R*B$mc^1Jki@k1-6YsM?ndam@BnVS`F?0s*(-n^`c@2Ss@`178Jbj6K~ij|I|L!UEucr(SzJy5&O=zU6x<5KlktXPs|8E+r8v_*1Pd7 S^YeoSAVE)8KbLh*2~7ZJ;F}fz delta 416 zcmV;R0bl;(0=ff`B!7WPL_t(|obB1su7e;9fML#Z-h}smB;I8g%Sc0OWzJ$V|L?YGFsE>_?5GQ;gM zXJ*a1+Q}FqESiE|@1y?`$>%hm`J1;-SGd)!I_2ND?pQGe9gtyuUlT*%6eO9$e_&22 zXECQivpHvgM$AQH0#0nBN9+%ObELO7vu0UlJ|1%|HQ$Mu7>?PgEp)Xpn_Jvs2Ahw( zzAx^XfMRy_C4U`p+XR$6Ik=}pv(OFYT8Hl@d-rbbLT7H-y?D4-s6`vGPi5E%uaV*? z!rZA1TO_?>^3OPR<>qNC>|OEhTx1q-ZuiSyD8&fy$%EwsU6!Gj9oZA05BEPkqffq^ zBwd6D`g7RNxPAoqojbFHI*YLWF!{r|1ONa40000002u%P0MZjraXv3O=4HhI0000< KMNUMnLSTZ45W|)L diff --git a/tests_speculos/test-messages/nanox.24.png b/tests_speculos/test-messages/nanox.24.png new file mode 100644 index 0000000000000000000000000000000000000000..7e236da60aac4c243bde35b1f1e6e89b08667b7e GIT binary patch literal 428 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|=lvba4!+nDh2#VBTQ`0oTB& zQuR0Wo^O`Q2WmDw=j^nt5PA1=lMD~DM8GjkMxZtr5RaFeIxXl`>A9PWJ5Spt#mT?z zkH1&P;r-Yk#X0pV}Dj{o?hW-Zy=?izjJaqX7)Mcd|YI-h=T-^N3W6J?kG zsd?Qd8ht@p>COA>q=Gw5QAIz?pG+$f-N}3ESr6;0jpAR03lgPGld6B7o*MV>#H`y! zpFf`19I{W?*l^Et&)jv(dvo#%y9H&+D*r~jv1Ih*`>M;l@h!^|i{cH-9d=)6OPYIl z_s=a4YiAv+{Ce}N*k8fJ6E#+L=v`OauW`ftseOd9Vpo0gztetaZXQk3OWC@eV>^@I zG|T@dk^g@f$rvmoH=d6AC$%=Q=jSJKIT-wu*=_G3~M%K@Xo_i(g zHdj=f}0nbj2ce(`^ylg~}&|D3(uKYYj4wN_8> zZ+{nI$SOM_u`XWN`GJVa%)|8wewyiq%N;jcrZ>2qaZP6O%USIHhQGde$#(P2X_0Am za>cr)_d91w^xa&kTe8(~cJ!Sjw%PrA_UXTy*^pHBRaLg|Hp>(n%N@&IHecX<8rA+@ zt@?Z3Tc`BAn|mvEM67U?-sqotgLD1FM;eFjtmKVW*_-_7yhZ8LXPMe>Vn4o%Nf9f^ z`+hoJ<0!|6lg&?=W2Y^gE_+jW0snV<+r|F-=BUKBu>UH)aehY~%a6I%n_H~9H~cgB gd3YxaEEIwCC1L+UJAKP%sYgMAp00i_>zopr07kXNa{vGU literal 0 HcmV?d00001 diff --git a/tests_speculos/test-messages/nanox.26.png b/tests_speculos/test-messages/nanox.26.png new file mode 100644 index 0000000000000000000000000000000000000000..dbbdb276b0c5dc45bbcf2bcd75d07d53f0a031f5 GIT binary patch literal 409 zcmV;K0cQS*P)`q0{{R30002+7GHNy-~z3+ zxOVp&XYz#ayC?9f9DPMUcTeCNatlAGwxGj>ub2kO7Np*GGT|1~*LzQf;@a;dD_|$W z6|hGmlB|HC;pp}s0002s9p=4D>BG2Ty6&!i@L*=GwLE`;ov?JcXMGvPA0@dH4((5V zxxTI-O4%e5a2CGYj^^vb+lmmY0C%6mH>V_zM8|-(kd#;+t=%7JaK(0f%eWPL}q1q`rz3aP}SG$xsuId|*u#6EJu@eCs<4_8%*o zfT0NDWjr0rBa1hpifWIAL(vMrR?04a0000006xwyJ@(1R7Nm>p00000NkvXXu0mjf DP-wNr literal 0 HcmV?d00001