From a58d2ababb225e0f9321cd2cdad208443092e949 Mon Sep 17 00:00:00 2001 From: Alexandre Paillier Date: Tue, 30 Aug 2022 10:16:39 +0200 Subject: [PATCH 01/30] Removed unused bagl type references in EIP-191 code --- src/ui_callbacks.h | 4 ++-- src_bagl/ui_flow_signMessage.c | 4 ++-- src_features/signMessage/cmd_signMessage.c | 2 +- src_features/signMessage/ui_common_signMessage.c | 5 ++--- src_features/signMessageEIP712/cmd_signMessage712.c | 2 +- 5 files changed, 8 insertions(+), 9 deletions(-) diff --git a/src/ui_callbacks.h b/src/ui_callbacks.h index 46e3665..419706a 100644 --- a/src/ui_callbacks.h +++ b/src/ui_callbacks.h @@ -10,8 +10,8 @@ unsigned int io_seproxyhal_touch_tx_ok(const bagl_element_t *e); unsigned int io_seproxyhal_touch_tx_cancel(const bagl_element_t *e); unsigned int io_seproxyhal_touch_address_ok(const bagl_element_t *e); unsigned int io_seproxyhal_touch_address_cancel(const bagl_element_t *e); -unsigned int io_seproxyhal_touch_signMessage_ok(const bagl_element_t *e); -unsigned int io_seproxyhal_touch_signMessage_cancel(const bagl_element_t *e); +unsigned int io_seproxyhal_touch_signMessage_ok(void); +unsigned int io_seproxyhal_touch_signMessage_cancel(void); unsigned int io_seproxyhal_touch_data_ok(const bagl_element_t *e); unsigned int io_seproxyhal_touch_data_cancel(const bagl_element_t *e); unsigned int io_seproxyhal_touch_signMessage712_v0_ok(const bagl_element_t *e); diff --git a/src_bagl/ui_flow_signMessage.c b/src_bagl/ui_flow_signMessage.c index ee8e39e..5aa9500 100644 --- a/src_bagl/ui_flow_signMessage.c +++ b/src_bagl/ui_flow_signMessage.c @@ -20,7 +20,7 @@ UX_STEP_NOCB( UX_STEP_CB( ux_sign_flow_3_step, pbb, - io_seproxyhal_touch_signMessage_ok(NULL), + io_seproxyhal_touch_signMessage_ok(), { &C_icon_validate_14, "Sign", @@ -29,7 +29,7 @@ UX_STEP_CB( UX_STEP_CB( ux_sign_flow_4_step, pbb, - io_seproxyhal_touch_signMessage_cancel(NULL), + io_seproxyhal_touch_signMessage_cancel(), { &C_icon_crossmark, "Cancel", diff --git a/src_features/signMessage/cmd_signMessage.c b/src_features/signMessage/cmd_signMessage.c index 71876e0..e9d47e0 100644 --- a/src_features/signMessage/cmd_signMessage.c +++ b/src_features/signMessage/cmd_signMessage.c @@ -186,7 +186,7 @@ void handleSignPersonalMessage(uint8_t p1, cx_hash((cx_hash_t *) &tmpContent.sha2, CX_LAST, workBuffer, 0, hashMessage, 32); #ifdef NO_CONSENT - io_seproxyhal_touch_signMessage_ok(NULL); + io_seproxyhal_touch_signMessage_ok(); #else // NO_CONSENT ui_display_sign(); #endif // NO_CONSENT diff --git a/src_features/signMessage/ui_common_signMessage.c b/src_features/signMessage/ui_common_signMessage.c index b8fc9c3..6436093 100644 --- a/src_features/signMessage/ui_common_signMessage.c +++ b/src_features/signMessage/ui_common_signMessage.c @@ -2,7 +2,7 @@ #include "shared_context.h" #include "ui_callbacks.h" -unsigned int io_seproxyhal_touch_signMessage_ok(__attribute__((unused)) const bagl_element_t *e) { +unsigned int io_seproxyhal_touch_signMessage_ok(void) { uint8_t privateKeyData[INT256_LENGTH]; uint8_t signature[100]; cx_ecfp_private_key_t privateKey; @@ -46,8 +46,7 @@ unsigned int io_seproxyhal_touch_signMessage_ok(__attribute__((unused)) const ba return 0; // do not redraw the widget } -unsigned int io_seproxyhal_touch_signMessage_cancel(__attribute__((unused)) - const bagl_element_t *e) { +unsigned int io_seproxyhal_touch_signMessage_cancel(void) { reset_app_context(); G_io_apdu_buffer[0] = 0x69; G_io_apdu_buffer[1] = 0x85; diff --git a/src_features/signMessageEIP712/cmd_signMessage712.c b/src_features/signMessageEIP712/cmd_signMessage712.c index 5585d52..847c40a 100644 --- a/src_features/signMessageEIP712/cmd_signMessage712.c +++ b/src_features/signMessageEIP712/cmd_signMessage712.c @@ -27,7 +27,7 @@ void handleSignEIP712Message(uint8_t p1, memmove(tmpCtx.messageSigningContext712.messageHash, workBuffer + 32, 32); #ifdef NO_CONSENT - io_seproxyhal_touch_signMessage_ok(NULL); + io_seproxyhal_touch_signMessage_ok(); #else // NO_CONSENT ui_sign_712_v0(); #endif // NO_CONSENT From 493ce85c3bfa0b19a0296002b85202181b5f2e8b Mon Sep 17 00:00:00 2001 From: Alexandre Paillier Date: Fri, 2 Sep 2022 14:22:11 +0200 Subject: [PATCH 02/30] New implementation --- src/apdu_constants.h | 8 +- src/main.c | 5 +- src_bagl/ui_flow_signMessage.c | 65 +++- src_bagl/ui_flow_signMessage.h | 9 + src_features/signMessage/cmd_signMessage.c | 394 ++++++++++++--------- src_features/signMessage/sign_message.h | 17 + 6 files changed, 312 insertions(+), 186 deletions(-) create mode 100644 src_bagl/ui_flow_signMessage.h create mode 100644 src_features/signMessage/sign_message.h diff --git a/src/apdu_constants.h b/src/apdu_constants.h index 1937075..ce1c96a 100644 --- a/src/apdu_constants.h +++ b/src/apdu_constants.h @@ -88,12 +88,10 @@ void handleGetAppConfiguration(uint8_t p1, uint16_t dataLength, unsigned int *flags, unsigned int *tx); -void handleSignPersonalMessage(uint8_t p1, +bool handleSignPersonalMessage(uint8_t p1, uint8_t p2, - const uint8_t *dataBuffer, - uint16_t dataLength, - unsigned int *flags, - unsigned int *tx); + const uint8_t *const payload, + uint8_t length); void handleSignEIP712Message(uint8_t p1, uint8_t p2, const uint8_t *dataBuffer, diff --git a/src/main.c b/src/main.c index cf99d6f..fa3db8e 100644 --- a/src/main.c +++ b/src/main.c @@ -664,12 +664,11 @@ void handleApdu(unsigned int *flags, unsigned int *tx) { case INS_SIGN_PERSONAL_MESSAGE: memset(tmpCtx.transactionContext.tokenSet, 0, MAX_ITEMS); + *flags |= IO_ASYNCH_REPLY; handleSignPersonalMessage(G_io_apdu_buffer[OFFSET_P1], G_io_apdu_buffer[OFFSET_P2], G_io_apdu_buffer + OFFSET_CDATA, - G_io_apdu_buffer[OFFSET_LC], - flags, - tx); + G_io_apdu_buffer[OFFSET_LC]); break; case INS_SIGN_EIP_712_MESSAGE: diff --git a/src_bagl/ui_flow_signMessage.c b/src_bagl/ui_flow_signMessage.c index 5aa9500..29b3934 100644 --- a/src_bagl/ui_flow_signMessage.c +++ b/src_bagl/ui_flow_signMessage.c @@ -1,9 +1,11 @@ #include "shared_context.h" #include "ui_callbacks.h" +#include "sign_message.h" + // clang-format off UX_STEP_NOCB( - ux_sign_flow_1_step, + ux_191_step_review, pnn, { &C_icon_certificate, @@ -11,14 +13,36 @@ UX_STEP_NOCB( "message", }); UX_STEP_NOCB( - ux_sign_flow_2_step, + ux_191_step_message, bnnn_paging, { .title = "Message", .text = strings.tmp.tmp, }); +UX_STEP_INIT( + ux_191_step_dummy_pre, + NULL, + NULL, + { + dummy_pre_cb(); + }); UX_STEP_CB( - ux_sign_flow_3_step, + ux_191_step_theres_more, + bn, + theres_more_click_cb(), + { + "There's more!", + "Click to skip" + }); +UX_STEP_INIT( + ux_191_step_dummy_post, + NULL, + NULL, + { + dummy_post_cb(); + }); +UX_STEP_CB( + ux_191_step_sign, pbb, io_seproxyhal_touch_signMessage_ok(), { @@ -27,7 +51,7 @@ UX_STEP_CB( "message", }); UX_STEP_CB( - ux_sign_flow_4_step, + ux_191_step_cancel, pbb, io_seproxyhal_touch_signMessage_cancel(), { @@ -38,7 +62,32 @@ UX_STEP_CB( // clang-format on UX_FLOW(ux_sign_flow, - &ux_sign_flow_1_step, - &ux_sign_flow_2_step, - &ux_sign_flow_3_step, - &ux_sign_flow_4_step); + &ux_191_step_review, + &ux_191_step_message, + &ux_191_step_dummy_pre, + &ux_191_step_theres_more, + &ux_191_step_dummy_post, + &ux_191_step_sign, + &ux_191_step_cancel); + + +void ui_191_switch_to_message(void) +{ + ux_flow_init(0, ux_sign_flow, &ux_191_step_message); +} + +void ui_191_switch_to_message_end(void) +{ + ux_flow_init(0, ux_sign_flow, &ux_191_step_dummy_pre); + // with pos != REVIEW, automatically goes back to previous step +} + +void ui_191_switch_to_sign(void) +{ + ux_flow_init(0, ux_sign_flow, &ux_191_step_sign); +} + +void ui_191_switch_to_question(void) +{ + ux_flow_init(0, ux_sign_flow, &ux_191_step_theres_more); +} diff --git a/src_bagl/ui_flow_signMessage.h b/src_bagl/ui_flow_signMessage.h new file mode 100644 index 0000000..dd5e342 --- /dev/null +++ b/src_bagl/ui_flow_signMessage.h @@ -0,0 +1,9 @@ +#ifndef UI_FLOW_SIGNMESSAGE_H_ +#define UI_FLOW_SIGNMESSAGE_H_ + +void ui_191_switch_to_message(void); +void ui_191_switch_to_message_end(void); +void ui_191_switch_to_sign(void); +void ui_191_switch_to_question(void); + +#endif // UI_FLOW_SIGNMESSAGE_H_ diff --git a/src_features/signMessage/cmd_signMessage.c b/src_features/signMessage/cmd_signMessage.c index e9d47e0..d3d9786 100644 --- a/src_features/signMessage/cmd_signMessage.c +++ b/src_features/signMessage/cmd_signMessage.c @@ -3,197 +3,251 @@ #include "apdu_constants.h" #include "utils.h" #include "common_ui.h" +#include "sign_message.h" +#include "ui_flow_signMessage.h" + +static uint8_t state; +static bool ui_started; +static uint8_t processed_size; +static uint8_t ui_position; static const char SIGN_MAGIC[] = "\x19" "Ethereum Signed Message:\n"; -/** - * Check if a given character is a "special" displayable ASCII character - * - * @param[in] c character we're checking - * @return wether the character is special or not - */ -static inline bool is_char_special(char c) { - return ((c >= '\b') && (c <= '\r')); + +const uint8_t *unprocessed_data(void) +{ + return &G_io_apdu_buffer[OFFSET_CDATA] + processed_size; } -/** - * Check if a given data is made of ASCII characters - * - * @param[in] data the input data - * @param[in] the length of the input data - * @return wether the data is fully ASCII or not - */ -static bool is_data_ascii(const uint8_t *const data, size_t length) { - for (uint8_t idx = 0; idx < length; ++idx) { - if (!is_char_special(data[idx]) && ((data[idx] < 0x20) || (data[idx] > 0x7e))) { +uint8_t unprocessed_length(void) +{ + return G_io_apdu_buffer[OFFSET_LC] - processed_size; +} + +uint8_t remaining_ui_length(void) +{ + // -1 for the ending NULL byte + return (sizeof(strings.tmp.tmp) - 1) - strlen(strings.tmp.tmp); +} + +static void switch_to_message(void) +{ + ui_191_switch_to_message(); + ui_position = UI_191_REVIEW; +} + +static void switch_to_message_end(void) +{ + ui_191_switch_to_message_end(); + ui_position = UI_191_REVIEW; +} + +static void switch_to_sign(void) +{ + ui_191_switch_to_sign(); + ui_position = UI_191_END; +} + +static void switch_to_question(void) +{ + ui_191_switch_to_question(); + ui_position = UI_191_QUESTION; +} + +const uint8_t *first_apdu_data(const uint8_t *data, uint16_t *length) +{ + if (appState != APP_STATE_IDLE) { + reset_app_context(); + } + appState = APP_STATE_SIGNING_MESSAGE; + data = parseBip32(data, length, &tmpCtx.messageSigningContext.bip32); + if (data == NULL) { + return NULL; + } + + if (*length < sizeof(uint32_t)) { + PRINTF("Invalid data\n"); + return NULL; + } + + tmpCtx.messageSigningContext.remainingLength = U4BE(data, 0); + data += sizeof(uint32_t); + *length -= sizeof(uint32_t); + + // Initialize message header + length + cx_keccak_init(&global_sha3, 256); + cx_hash((cx_hash_t *) &global_sha3, + 0, + (uint8_t *) SIGN_MAGIC, + sizeof(SIGN_MAGIC) - 1, + NULL, + 0); + snprintf(strings.tmp.tmp2, + sizeof(strings.tmp.tmp2), + "%u", + tmpCtx.messageSigningContext.remainingLength); + cx_hash((cx_hash_t *) &global_sha3, + 0, + (uint8_t *) strings.tmp.tmp2, + strlen(strings.tmp.tmp2), + NULL, + 0); + strings.tmp.tmp[0] = '\0'; + state = STATE_191_HASH_DISPLAY; + ui_started = false; + ui_position = UI_191_REVIEW; + return data; +} + +bool feed_hash(const uint8_t *const data, uint8_t length) +{ + if (length > tmpCtx.messageSigningContext.remainingLength) + { + PRINTF("Error: Length mismatch ! (%u > %u)!\n", + length, + tmpCtx.messageSigningContext.remainingLength); + return false; + } + cx_hash((cx_hash_t *) &global_sha3, 0, data, length, NULL, 0); + if ((tmpCtx.messageSigningContext.remainingLength -= length) == 0) + { + // Finalize hash + cx_hash((cx_hash_t *) &global_sha3, + CX_LAST, + NULL, + 0, + tmpCtx.messageSigningContext.hash, + 32); + } + return true; +} + +bool feed_display(void) +{ + uint8_t ui_length; + + while ((unprocessed_length() > 0) && ((ui_length = remaining_ui_length()) > 0)) + { + sprintf(&strings.tmp.tmp[sizeof(strings.tmp.tmp) - 1 - ui_length], "%c", *(char*)unprocessed_data()); + processed_size += 1; + } + + if ((remaining_ui_length() == 0) || (tmpCtx.messageSigningContext.remainingLength == 0)) + { + if (!ui_started) + { + ui_display_sign(); + ui_started = true; + } + else + { + switch_to_message(); + } + } + + if ((unprocessed_length() == 0) && (tmpCtx.messageSigningContext.remainingLength > 0)) + { + *(uint16_t *) G_io_apdu_buffer = __builtin_bswap16(0x9000); + io_exchange(CHANNEL_APDU | IO_RETURN_AFTER_TX, 2); + } + + return true; +} + +bool handleSignPersonalMessage(uint8_t p1, + uint8_t p2, + const uint8_t *const payload, + uint8_t length) +{ + const uint8_t *data = payload; + + (void)p2; + processed_size = 0; + if (p1 == P1_FIRST) + { + if ((data = first_apdu_data(data, (uint16_t*)&length)) == NULL) + { return false; } + processed_size = data - payload; + } + else if (p1 != P1_MORE) + { + PRINTF("Error: Unexpected P1 (%u)!\n", p1); + } + + if (!feed_hash(data, length)) + { + return false; + } + + if (state == STATE_191_HASH_DISPLAY) + { + feed_display(); + } + else // hash only + { + if (tmpCtx.messageSigningContext.remainingLength == 0) + { + switch_to_sign(); + } + else + { + *(uint16_t *) G_io_apdu_buffer = __builtin_bswap16(0x9000); + io_exchange(CHANNEL_APDU | IO_RETURN_AFTER_TX, 2); + } } return true; } -/** - * Initialize value string that will be displayed in the UX STEP - * - * @param[in] if the value is ASCII - */ -static void init_value_str(bool is_ascii) { - if (is_ascii) { - strings.tmp.tmp[0] = '\0'; // init string as empty - } else { - strcpy(strings.tmp.tmp, "0x"); // will display the hex bytes instead +void dummy_pre_cb(void) +{ + if (ui_position == UI_191_REVIEW) + { + if ((state == STATE_191_HASH_DISPLAY) && ((tmpCtx.messageSigningContext.remainingLength > 0) || (unprocessed_length() > 0))) + { + switch_to_question(); + } + else + { + // Go to Sign / Cancel + switch_to_sign(); + } + } + else + { + ux_flow_prev(); + ui_position = UI_191_REVIEW; } } -/** - * @return Whether the currently stored data is initialized as ASCII or not - */ -static bool is_value_str_ascii() { - return (memcmp(strings.tmp.tmp, "0x", 2) != 0); -} +void theres_more_click_cb(void) +{ + state = STATE_191_HASH_ONLY; -/** - * Update the global UI string variable by formatting & appending the new data to it - * - * @param[in] data the input data - * @param[in] length the data length - * @param[in] is_ascii wether the data is ASCII or not - */ -static void feed_value_str(const uint8_t *const data, size_t length, bool is_ascii) { - uint16_t value_strlen = strlen(strings.tmp.tmp); - - if ((value_strlen + 1) < sizeof(strings.tmp.tmp)) { - if (is_ascii) { - uint8_t src_idx = 0; - uint16_t dst_idx = value_strlen; - bool prev_is_special = false; - - while ((src_idx < length) && (dst_idx < sizeof(strings.tmp.tmp))) { - if (prev_is_special) { - if (!is_char_special(data[src_idx])) { - prev_is_special = false; - } - } else { - if (is_char_special(data[src_idx])) { - prev_is_special = true; - strings.tmp.tmp[dst_idx] = ' '; - dst_idx += 1; - } - } - if (!is_char_special(data[src_idx])) { - strings.tmp.tmp[dst_idx] = data[src_idx]; - dst_idx += 1; - } - src_idx += 1; - } - - if (dst_idx < sizeof(strings.tmp.tmp)) { - strings.tmp.tmp[dst_idx] = '\0'; - } else { - const char marker[] = "..."; - - memcpy(strings.tmp.tmp + sizeof(strings.tmp.tmp) - sizeof(marker), - marker, - sizeof(marker)); - } - } else { - // truncate to strings.tmp.tmp 's size - length = MIN(length, (sizeof(strings.tmp.tmp) - value_strlen) / 2); - for (size_t i = 0; i < length; i++) { - snprintf(strings.tmp.tmp + value_strlen + 2 * i, - sizeof(strings.tmp.tmp) - value_strlen - 2 * i, - "%02X", - data[i]); - } - } + if (tmpCtx.messageSigningContext.remainingLength > 0) + { + *(uint16_t *) G_io_apdu_buffer = __builtin_bswap16(0x9000); + io_exchange(CHANNEL_APDU | IO_RETURN_AFTER_TX, 2); } } -void handleSignPersonalMessage(uint8_t p1, - uint8_t p2, - const uint8_t *workBuffer, - uint16_t dataLength, - unsigned int *flags, - unsigned int *tx) { - UNUSED(tx); - uint8_t hashMessage[INT256_LENGTH]; - - if (p1 == P1_FIRST) { - char tmp[11] = {0}; - - if (appState != APP_STATE_IDLE) { - reset_app_context(); +void dummy_post_cb(void) +{ + if (ui_position == UI_191_QUESTION) + { + strings.tmp.tmp[0] = '\0'; // empty display string + processed_size = 0; + if (unprocessed_length() > 0) + { + feed_display(); } - appState = APP_STATE_SIGNING_MESSAGE; - - workBuffer = parseBip32(workBuffer, &dataLength, &tmpCtx.messageSigningContext.bip32); - - if (workBuffer == NULL) { - THROW(0x6a80); - } - - if (dataLength < sizeof(uint32_t)) { - PRINTF("Invalid data\n"); - THROW(0x6a80); - } - - tmpCtx.messageSigningContext.remainingLength = U4BE(workBuffer, 0); - workBuffer += sizeof(uint32_t); - dataLength -= sizeof(uint32_t); - // Initialize message header + length - cx_keccak_init(&global_sha3, 256); - cx_hash((cx_hash_t *) &global_sha3, - 0, - (uint8_t *) SIGN_MAGIC, - sizeof(SIGN_MAGIC) - 1, - NULL, - 0); - snprintf(tmp, sizeof(tmp), "%u", tmpCtx.messageSigningContext.remainingLength); - cx_hash((cx_hash_t *) &global_sha3, 0, (uint8_t *) tmp, strlen(tmp), NULL, 0); - cx_sha256_init(&tmpContent.sha2); - - init_value_str(is_data_ascii(workBuffer, dataLength)); - - } else if (p1 != P1_MORE) { - THROW(0x6B00); + // TODO: respond to apdu ? } - if (p2 != 0) { - THROW(0x6B00); - } - if ((p1 == P1_MORE) && (appState != APP_STATE_SIGNING_MESSAGE)) { - PRINTF("Signature not initialized\n"); - THROW(0x6985); - } - if (dataLength > tmpCtx.messageSigningContext.remainingLength) { - THROW(0x6A80); - } - - cx_hash((cx_hash_t *) &global_sha3, 0, workBuffer, dataLength, NULL, 0); - cx_hash((cx_hash_t *) &tmpContent.sha2, 0, workBuffer, dataLength, NULL, 0); - tmpCtx.messageSigningContext.remainingLength -= dataLength; - - feed_value_str(workBuffer, dataLength, is_value_str_ascii()); - - if (tmpCtx.messageSigningContext.remainingLength == 0) { - cx_hash((cx_hash_t *) &global_sha3, - CX_LAST, - workBuffer, - 0, - tmpCtx.messageSigningContext.hash, - 32); - cx_hash((cx_hash_t *) &tmpContent.sha2, CX_LAST, workBuffer, 0, hashMessage, 32); - -#ifdef NO_CONSENT - io_seproxyhal_touch_signMessage_ok(); -#else // NO_CONSENT - ui_display_sign(); -#endif // NO_CONSENT - - *flags |= IO_ASYNCH_REPLY; - - } else { - THROW(0x9000); + else // UI_191_END + { + switch_to_message_end(); } } diff --git a/src_features/signMessage/sign_message.h b/src_features/signMessage/sign_message.h new file mode 100644 index 0000000..28348cd --- /dev/null +++ b/src_features/signMessage/sign_message.h @@ -0,0 +1,17 @@ +#ifndef SIGN_MESSAGE_H_ +#define SIGN_MESSAGE_H_ + +typedef enum { STATE_191_HASH_DISPLAY = 0, STATE_191_HASH_ONLY } sign_message_state; +typedef enum { UI_191_REVIEW = 0, UI_191_QUESTION, UI_191_END } ui_191_position; + + +#define UI_191_BUFFER strings.tmp.tmp + +void question_switcher(void); +void skip_rest_of_message(void); +void continue_displaying_message(void); +void dummy_pre_cb(void); +void theres_more_click_cb(void); +void dummy_post_cb(void); + +#endif // SIGN_MESSAGE_H_ From 81e15e51e88250c8ae17664674764ad61b8184db Mon Sep 17 00:00:00 2001 From: Alexandre Paillier Date: Tue, 6 Sep 2022 09:41:16 +0200 Subject: [PATCH 03/30] Fix skip issue --- src_features/signMessage/cmd_signMessage.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src_features/signMessage/cmd_signMessage.c b/src_features/signMessage/cmd_signMessage.c index d3d9786..6789186 100644 --- a/src_features/signMessage/cmd_signMessage.c +++ b/src_features/signMessage/cmd_signMessage.c @@ -232,6 +232,10 @@ void theres_more_click_cb(void) *(uint16_t *) G_io_apdu_buffer = __builtin_bswap16(0x9000); io_exchange(CHANNEL_APDU | IO_RETURN_AFTER_TX, 2); } + else + { + switch_to_sign(); + } } void dummy_post_cb(void) From aedf6026c745d615c0767320efc2cbde2bd6d3d7 Mon Sep 17 00:00:00 2001 From: Alexandre Paillier Date: Thu, 8 Sep 2022 10:20:44 +0200 Subject: [PATCH 04/30] Handling of EIP191 non ASCII messages --- src_bagl/ui_flow_signMessage.c | 4 +- src_features/signMessage/cmd_signMessage.c | 67 +++++++++++++++++----- 2 files changed, 55 insertions(+), 16 deletions(-) diff --git a/src_bagl/ui_flow_signMessage.c b/src_bagl/ui_flow_signMessage.c index 29b3934..ec08ad0 100644 --- a/src_bagl/ui_flow_signMessage.c +++ b/src_bagl/ui_flow_signMessage.c @@ -31,8 +31,8 @@ UX_STEP_CB( bn, theres_more_click_cb(), { - "There's more!", - "Click to skip" + "More to see!", + "Double-click to skip" }); UX_STEP_INIT( ux_191_step_dummy_post, diff --git a/src_features/signMessage/cmd_signMessage.c b/src_features/signMessage/cmd_signMessage.c index 6789186..3ae0c0f 100644 --- a/src_features/signMessage/cmd_signMessage.c +++ b/src_features/signMessage/cmd_signMessage.c @@ -1,4 +1,5 @@ #include +#include #include "shared_context.h" #include "apdu_constants.h" #include "utils.h" @@ -16,20 +17,35 @@ static const char SIGN_MAGIC[] = "Ethereum Signed Message:\n"; -const uint8_t *unprocessed_data(void) +static const uint8_t *unprocessed_data(void) { return &G_io_apdu_buffer[OFFSET_CDATA] + processed_size; } -uint8_t unprocessed_length(void) +static size_t unprocessed_length(void) { return G_io_apdu_buffer[OFFSET_LC] - processed_size; } -uint8_t remaining_ui_length(void) +static size_t ui_buffer_length(void) +{ + return strlen(UI_191_BUFFER); +} + +static size_t remaining_ui_buffer_length(void) { // -1 for the ending NULL byte - return (sizeof(strings.tmp.tmp) - 1) - strlen(strings.tmp.tmp); + return (sizeof(UI_191_BUFFER) - 1) - ui_buffer_length(); +} + +static char *remaining_ui_buffer(void) +{ + return &UI_191_BUFFER[ui_buffer_length()]; +} + +static void reset_ui_buffer(void) +{ + UI_191_BUFFER[0] = '\0'; } static void switch_to_message(void) @@ -94,7 +110,7 @@ const uint8_t *first_apdu_data(const uint8_t *data, uint16_t *length) strlen(strings.tmp.tmp2), NULL, 0); - strings.tmp.tmp[0] = '\0'; + reset_ui_buffer(); state = STATE_191_HASH_DISPLAY; ui_started = false; ui_position = UI_191_REVIEW; @@ -124,17 +140,43 @@ bool feed_hash(const uint8_t *const data, uint8_t length) return true; } -bool feed_display(void) +void feed_display(void) { uint8_t ui_length; + int c; - while ((unprocessed_length() > 0) && ((ui_length = remaining_ui_length()) > 0)) + while ((unprocessed_length() > 0) && (remaining_ui_buffer_length() > 0)) { - sprintf(&strings.tmp.tmp[sizeof(strings.tmp.tmp) - 1 - ui_length], "%c", *(char*)unprocessed_data()); - processed_size += 1; + c = *(char*)unprocessed_data(); + if (isspace(c)) // to replace all white-space characters as spaces + { + c = ' '; + } + if (isprint(c)) + { + sprintf(remaining_ui_buffer(), "%c", (char)c); + processed_size += 1; + } + else + { + if (remaining_ui_buffer_length() >= 4) // 4 being the fixed length of \x00 + { + snprintf(remaining_ui_buffer(), remaining_ui_buffer_length(), "\\x%02x", c); + processed_size += 1; + } + else + { + // fill the rest of the UI buffer spaces, to consider the buffer full + while (remaining_ui_buffer_length()) + { + sprintf(remaining_ui_buffer(), " "); + } + } + } } - if ((remaining_ui_length() == 0) || (tmpCtx.messageSigningContext.remainingLength == 0)) + if ((remaining_ui_buffer_length() == 0) + || (tmpCtx.messageSigningContext.remainingLength == 0)) { if (!ui_started) { @@ -152,8 +194,6 @@ bool feed_display(void) *(uint16_t *) G_io_apdu_buffer = __builtin_bswap16(0x9000); io_exchange(CHANNEL_APDU | IO_RETURN_AFTER_TX, 2); } - - return true; } bool handleSignPersonalMessage(uint8_t p1, @@ -242,8 +282,7 @@ void dummy_post_cb(void) { if (ui_position == UI_191_QUESTION) { - strings.tmp.tmp[0] = '\0'; // empty display string - processed_size = 0; + reset_ui_buffer(); if (unprocessed_length() > 0) { feed_display(); From 40f00bb01217905cd4aadfbf2bc11ce01312e351 Mon Sep 17 00:00:00 2001 From: Alexandre Paillier Date: Thu, 8 Sep 2022 10:21:58 +0200 Subject: [PATCH 05/30] Minimize the RAM used by EIP-191 global variables --- src_features/signMessage/cmd_signMessage.c | 43 ++++++++++++---------- 1 file changed, 23 insertions(+), 20 deletions(-) diff --git a/src_features/signMessage/cmd_signMessage.c b/src_features/signMessage/cmd_signMessage.c index 3ae0c0f..2cba389 100644 --- a/src_features/signMessage/cmd_signMessage.c +++ b/src_features/signMessage/cmd_signMessage.c @@ -7,10 +7,13 @@ #include "sign_message.h" #include "ui_flow_signMessage.h" -static uint8_t state; -static bool ui_started; static uint8_t processed_size; -static uint8_t ui_position; +static struct +{ + sign_message_state sign_state : 1; + bool ui_started : 1; + ui_191_position ui_pos : 2; +} states; static const char SIGN_MAGIC[] = "\x19" @@ -51,25 +54,25 @@ static void reset_ui_buffer(void) static void switch_to_message(void) { ui_191_switch_to_message(); - ui_position = UI_191_REVIEW; + states.ui_pos = UI_191_REVIEW; } static void switch_to_message_end(void) { ui_191_switch_to_message_end(); - ui_position = UI_191_REVIEW; + states.ui_pos = UI_191_REVIEW; } static void switch_to_sign(void) { ui_191_switch_to_sign(); - ui_position = UI_191_END; + states.ui_pos = UI_191_END; } static void switch_to_question(void) { ui_191_switch_to_question(); - ui_position = UI_191_QUESTION; + states.ui_pos = UI_191_QUESTION; } const uint8_t *first_apdu_data(const uint8_t *data, uint16_t *length) @@ -111,9 +114,9 @@ const uint8_t *first_apdu_data(const uint8_t *data, uint16_t *length) NULL, 0); reset_ui_buffer(); - state = STATE_191_HASH_DISPLAY; - ui_started = false; - ui_position = UI_191_REVIEW; + states.sign_state = STATE_191_HASH_DISPLAY; + states.ui_started = false; + states.ui_pos = UI_191_REVIEW; return data; } @@ -142,7 +145,6 @@ bool feed_hash(const uint8_t *const data, uint8_t length) void feed_display(void) { - uint8_t ui_length; int c; while ((unprocessed_length() > 0) && (remaining_ui_buffer_length() > 0)) @@ -178,10 +180,10 @@ void feed_display(void) if ((remaining_ui_buffer_length() == 0) || (tmpCtx.messageSigningContext.remainingLength == 0)) { - if (!ui_started) + if (!states.ui_started) { ui_display_sign(); - ui_started = true; + states.ui_started = true; } else { @@ -223,7 +225,7 @@ bool handleSignPersonalMessage(uint8_t p1, return false; } - if (state == STATE_191_HASH_DISPLAY) + if (states.sign_state == STATE_191_HASH_DISPLAY) { feed_display(); } @@ -244,9 +246,11 @@ bool handleSignPersonalMessage(uint8_t p1, void dummy_pre_cb(void) { - if (ui_position == UI_191_REVIEW) + if (states.ui_pos == UI_191_REVIEW) { - if ((state == STATE_191_HASH_DISPLAY) && ((tmpCtx.messageSigningContext.remainingLength > 0) || (unprocessed_length() > 0))) + if ((states.sign_state == STATE_191_HASH_DISPLAY) + && ((tmpCtx.messageSigningContext.remainingLength > 0) + || (unprocessed_length() > 0))) { switch_to_question(); } @@ -259,14 +263,13 @@ void dummy_pre_cb(void) else { ux_flow_prev(); - ui_position = UI_191_REVIEW; + states.ui_pos = UI_191_REVIEW; } } void theres_more_click_cb(void) { - state = STATE_191_HASH_ONLY; - + states.sign_state = STATE_191_HASH_ONLY; if (tmpCtx.messageSigningContext.remainingLength > 0) { *(uint16_t *) G_io_apdu_buffer = __builtin_bswap16(0x9000); @@ -280,7 +283,7 @@ void theres_more_click_cb(void) void dummy_post_cb(void) { - if (ui_position == UI_191_QUESTION) + if (states.ui_pos == UI_191_QUESTION) { reset_ui_buffer(); if (unprocessed_length() > 0) From 4bbc142ee5d528724a978ec1909818b645a648d3 Mon Sep 17 00:00:00 2001 From: Alexandre Paillier Date: Thu, 15 Sep 2022 11:45:05 +0200 Subject: [PATCH 06/30] Doxygen comments --- src_features/signMessage/cmd_signMessage.c | 74 +++++++++++++++++++++- 1 file changed, 71 insertions(+), 3 deletions(-) diff --git a/src_features/signMessage/cmd_signMessage.c b/src_features/signMessage/cmd_signMessage.c index 2cba389..1dd76f7 100644 --- a/src_features/signMessage/cmd_signMessage.c +++ b/src_features/signMessage/cmd_signMessage.c @@ -20,62 +20,111 @@ static const char SIGN_MAGIC[] = "Ethereum Signed Message:\n"; +/** + * Get unprocessed data from last received APDU + * + * @return pointer to data in APDU buffer + */ static const uint8_t *unprocessed_data(void) { return &G_io_apdu_buffer[OFFSET_CDATA] + processed_size; } +/** + * Get size of unprocessed data from last received APDU + * + * @return size of data in bytes + */ static size_t unprocessed_length(void) { return G_io_apdu_buffer[OFFSET_LC] - processed_size; } +/** + * Get used space from UI buffer + * + * @return size in bytes + */ static size_t ui_buffer_length(void) { return strlen(UI_191_BUFFER); } +/** + * Get remaining space from UI buffer + * + * @return size in bytes + */ static size_t remaining_ui_buffer_length(void) { // -1 for the ending NULL byte return (sizeof(UI_191_BUFFER) - 1) - ui_buffer_length(); } +/** + * Get free space from UI buffer + * + * @return pointer to the free space + */ static char *remaining_ui_buffer(void) { return &UI_191_BUFFER[ui_buffer_length()]; } +/** + * Reset the UI buffer + * + * Simply sets its first byte to a NULL character + */ static void reset_ui_buffer(void) { UI_191_BUFFER[0] = '\0'; } +/** + * Switch to the beginning of the Message UI page + */ static void switch_to_message(void) { ui_191_switch_to_message(); states.ui_pos = UI_191_REVIEW; } +/** + * Switch to the end of the Message UI page + */ static void switch_to_message_end(void) { ui_191_switch_to_message_end(); states.ui_pos = UI_191_REVIEW; } +/** + * Switch to the Sign UI page + */ static void switch_to_sign(void) { ui_191_switch_to_sign(); states.ui_pos = UI_191_END; } +/** + * Switch to the interactive question UI page + */ static void switch_to_question(void) { ui_191_switch_to_question(); states.ui_pos = UI_191_QUESTION; } -const uint8_t *first_apdu_data(const uint8_t *data, uint16_t *length) +/** + * Handle the data specific to the first APDU of an EIP-191 signature + * + * @param[in] data the APDU payload + * @param[in] length the payload size + * @return pointer to the start of the start of the message; \ref NULL if it failed + */ +static const uint8_t *first_apdu_data(const uint8_t *data, uint16_t *length) { if (appState != APP_STATE_IDLE) { reset_app_context(); @@ -120,7 +169,14 @@ const uint8_t *first_apdu_data(const uint8_t *data, uint16_t *length) return data; } -bool feed_hash(const uint8_t *const data, uint8_t length) +/** + * Feed the progressive hash with new data + * + * @param[in] data the new data + * @param[in] length the data length + * @return whether it was successful or not + */ +static bool feed_hash(const uint8_t *const data, uint8_t length) { if (length > tmpCtx.messageSigningContext.remainingLength) { @@ -143,7 +199,10 @@ bool feed_hash(const uint8_t *const data, uint8_t length) return true; } -void feed_display(void) +/** + * Feed the UI with new data + */ +static void feed_display(void) { int c; @@ -198,6 +257,15 @@ void feed_display(void) } } +/** + * EIP-191 APDU handler + * + * @param[in] p1 instruction parameter 1 + * @param[in] p2 instruction parameter 2 + * @param[in] payload received data + * @param[in] length data length + * @return whether the handling of the APDU was successful or not + */ bool handleSignPersonalMessage(uint8_t p1, uint8_t p2, const uint8_t *const payload, From e93d82c1045606ba9306930985f967cb3ff7c7d4 Mon Sep 17 00:00:00 2001 From: Alexandre Paillier Date: Thu, 8 Sep 2022 18:41:49 +0200 Subject: [PATCH 07/30] Better separation between EIP-191 UI & business logic --- src_bagl/common_ui.c | 6 +- src_bagl/ui_flow.h | 2 - src_bagl/ui_flow_signMessage.c | 53 ++++++++++-- src_bagl/ui_flow_signMessage.h | 3 + src_features/signMessage/cmd_signMessage.c | 99 +++++++--------------- src_features/signMessage/sign_message.h | 4 - 6 files changed, 79 insertions(+), 88 deletions(-) diff --git a/src_bagl/common_ui.c b/src_bagl/common_ui.c index 57be492..e1449f0 100644 --- a/src_bagl/common_ui.c +++ b/src_bagl/common_ui.c @@ -32,10 +32,6 @@ void ui_display_public_key(void) { ux_flow_init(0, ux_display_public_flow, NULL); } -void ui_display_sign(void) { - ux_flow_init(0, ux_sign_flow, NULL); -} - void ui_sign_712_v0(void) { ux_flow_init(0, ux_sign_712_v0_flow, NULL); } @@ -74,4 +70,4 @@ void ui_confirm_parameter(void) { ux_flow_init(0, ux_confirm_parameter_flow, NULL); } -#endif // HAVE_BAGL \ No newline at end of file +#endif // HAVE_BAGL diff --git a/src_bagl/ui_flow.h b/src_bagl/ui_flow.h index 7b18286..184036b 100644 --- a/src_bagl/ui_flow.h +++ b/src_bagl/ui_flow.h @@ -20,8 +20,6 @@ extern const ux_flow_step_t* const ux_confirm_parameter_flow[]; extern const ux_flow_step_t* const ux_approval_allowance_flow[]; -extern const ux_flow_step_t* const ux_sign_flow[]; - extern const ux_flow_step_t* const ux_sign_712_v0_flow[]; extern const ux_flow_step_t* const ux_display_public_eth2_flow[]; diff --git a/src_bagl/ui_flow_signMessage.c b/src_bagl/ui_flow_signMessage.c index ec08ad0..b620b56 100644 --- a/src_bagl/ui_flow_signMessage.c +++ b/src_bagl/ui_flow_signMessage.c @@ -1,7 +1,36 @@ #include "shared_context.h" #include "ui_callbacks.h" +#include "ui_flow_signMessage.h" #include "sign_message.h" +static uint8_t ui_pos; + + +static void dummy_pre_cb(void) +{ + if (ui_pos == UI_191_POS_REVIEW) + { + question_switcher(); + } + else + { + ux_flow_prev(); + ui_pos = UI_191_POS_REVIEW; + } +} + +static void dummy_post_cb(void) +{ + if (ui_pos == UI_191_POS_QUESTION) + { + continue_displaying_message(); + } + else // UI_191_END + { + ui_191_switch_to_message_end(); + } +} + // clang-format off UX_STEP_NOCB( @@ -29,7 +58,7 @@ UX_STEP_INIT( UX_STEP_CB( ux_191_step_theres_more, bn, - theres_more_click_cb(), + skip_rest_of_message(), { "More to see!", "Double-click to skip" @@ -61,7 +90,7 @@ UX_STEP_CB( }); // clang-format on -UX_FLOW(ux_sign_flow, +UX_FLOW(ux_191_flow, &ux_191_step_review, &ux_191_step_message, &ux_191_step_dummy_pre, @@ -71,23 +100,33 @@ UX_FLOW(ux_sign_flow, &ux_191_step_cancel); +void ui_191_start(void) +{ + ux_flow_init(0, ux_191_flow, NULL); + ui_pos = UI_191_POS_REVIEW; +} + void ui_191_switch_to_message(void) { - ux_flow_init(0, ux_sign_flow, &ux_191_step_message); + ux_flow_init(0, ux_191_flow, &ux_191_step_message); + ui_pos = UI_191_POS_REVIEW; } void ui_191_switch_to_message_end(void) { - ux_flow_init(0, ux_sign_flow, &ux_191_step_dummy_pre); - // with pos != REVIEW, automatically goes back to previous step + // Force it to a value that will make it automatically do a prev() + ui_pos = UI_191_POS_QUESTION; + ux_flow_init(0, ux_191_flow, &ux_191_step_dummy_pre); } void ui_191_switch_to_sign(void) { - ux_flow_init(0, ux_sign_flow, &ux_191_step_sign); + ux_flow_init(0, ux_191_flow, &ux_191_step_sign); + ui_pos = UI_191_POS_END; } void ui_191_switch_to_question(void) { - ux_flow_init(0, ux_sign_flow, &ux_191_step_theres_more); + ux_flow_init(0, ux_191_flow, &ux_191_step_theres_more); + ui_pos = UI_191_POS_QUESTION; } diff --git a/src_bagl/ui_flow_signMessage.h b/src_bagl/ui_flow_signMessage.h index dd5e342..69e047b 100644 --- a/src_bagl/ui_flow_signMessage.h +++ b/src_bagl/ui_flow_signMessage.h @@ -1,6 +1,9 @@ #ifndef UI_FLOW_SIGNMESSAGE_H_ #define UI_FLOW_SIGNMESSAGE_H_ +typedef enum { UI_191_POS_REVIEW, UI_191_POS_QUESTION, UI_191_POS_END } e_ui_191_position; + +void ui_191_start(void); void ui_191_switch_to_message(void); void ui_191_switch_to_message_end(void); void ui_191_switch_to_sign(void); diff --git a/src_features/signMessage/cmd_signMessage.c b/src_features/signMessage/cmd_signMessage.c index 1dd76f7..6c85e2c 100644 --- a/src_features/signMessage/cmd_signMessage.c +++ b/src_features/signMessage/cmd_signMessage.c @@ -12,7 +12,6 @@ static struct { sign_message_state sign_state : 1; bool ui_started : 1; - ui_191_position ui_pos : 2; } states; static const char SIGN_MAGIC[] = @@ -81,42 +80,6 @@ static void reset_ui_buffer(void) UI_191_BUFFER[0] = '\0'; } -/** - * Switch to the beginning of the Message UI page - */ -static void switch_to_message(void) -{ - ui_191_switch_to_message(); - states.ui_pos = UI_191_REVIEW; -} - -/** - * Switch to the end of the Message UI page - */ -static void switch_to_message_end(void) -{ - ui_191_switch_to_message_end(); - states.ui_pos = UI_191_REVIEW; -} - -/** - * Switch to the Sign UI page - */ -static void switch_to_sign(void) -{ - ui_191_switch_to_sign(); - states.ui_pos = UI_191_END; -} - -/** - * Switch to the interactive question UI page - */ -static void switch_to_question(void) -{ - ui_191_switch_to_question(); - states.ui_pos = UI_191_QUESTION; -} - /** * Handle the data specific to the first APDU of an EIP-191 signature * @@ -165,7 +128,6 @@ static const uint8_t *first_apdu_data(const uint8_t *data, uint16_t *length) reset_ui_buffer(); states.sign_state = STATE_191_HASH_DISPLAY; states.ui_started = false; - states.ui_pos = UI_191_REVIEW; return data; } @@ -241,12 +203,12 @@ static void feed_display(void) { if (!states.ui_started) { - ui_display_sign(); + ui_191_start(); states.ui_started = true; } else { - switch_to_message(); + ui_191_switch_to_message(); } } @@ -301,7 +263,11 @@ bool handleSignPersonalMessage(uint8_t p1, { if (tmpCtx.messageSigningContext.remainingLength == 0) { - switch_to_sign(); +#ifdef NO_CONSENT + io_seproxyhal_touch_signMessage_ok(); +#else + ui_191_switch_to_sign(); +#endif } else { @@ -312,30 +278,28 @@ bool handleSignPersonalMessage(uint8_t p1, return true; } -void dummy_pre_cb(void) +/** + * Decide whether to show the question to show more of the message or not + */ +void question_switcher(void) { - if (states.ui_pos == UI_191_REVIEW) + if ((states.sign_state == STATE_191_HASH_DISPLAY) + && ((tmpCtx.messageSigningContext.remainingLength > 0) + || (unprocessed_length() > 0))) { - if ((states.sign_state == STATE_191_HASH_DISPLAY) - && ((tmpCtx.messageSigningContext.remainingLength > 0) - || (unprocessed_length() > 0))) - { - switch_to_question(); - } - else - { - // Go to Sign / Cancel - switch_to_sign(); - } + ui_191_switch_to_question(); } else { - ux_flow_prev(); - states.ui_pos = UI_191_REVIEW; + // Go to Sign / Cancel + ui_191_switch_to_sign(); } } -void theres_more_click_cb(void) +/** + * The user has decided to skip the rest of the message + */ +void skip_rest_of_message(void) { states.sign_state = STATE_191_HASH_ONLY; if (tmpCtx.messageSigningContext.remainingLength > 0) @@ -345,23 +309,18 @@ void theres_more_click_cb(void) } else { - switch_to_sign(); + ui_191_switch_to_sign(); } } -void dummy_post_cb(void) +/** + * The user has decided to see the next chunk of the message + */ +void continue_displaying_message(void) { - if (states.ui_pos == UI_191_QUESTION) + reset_ui_buffer(); + if (unprocessed_length() > 0) { - reset_ui_buffer(); - if (unprocessed_length() > 0) - { - feed_display(); - } - // TODO: respond to apdu ? - } - else // UI_191_END - { - switch_to_message_end(); + feed_display(); } } diff --git a/src_features/signMessage/sign_message.h b/src_features/signMessage/sign_message.h index 28348cd..bb369b5 100644 --- a/src_features/signMessage/sign_message.h +++ b/src_features/signMessage/sign_message.h @@ -2,7 +2,6 @@ #define SIGN_MESSAGE_H_ typedef enum { STATE_191_HASH_DISPLAY = 0, STATE_191_HASH_ONLY } sign_message_state; -typedef enum { UI_191_REVIEW = 0, UI_191_QUESTION, UI_191_END } ui_191_position; #define UI_191_BUFFER strings.tmp.tmp @@ -10,8 +9,5 @@ typedef enum { UI_191_REVIEW = 0, UI_191_QUESTION, UI_191_END } ui_191_position; void question_switcher(void); void skip_rest_of_message(void); void continue_displaying_message(void); -void dummy_pre_cb(void); -void theres_more_click_cb(void); -void dummy_post_cb(void); #endif // SIGN_MESSAGE_H_ From f46ed72c60178e3be753335a33cac89de715040f Mon Sep 17 00:00:00 2001 From: Alexandre Paillier Date: Thu, 15 Sep 2022 13:26:11 +0200 Subject: [PATCH 08/30] Reimplement the status words for EIP-191 error cases without throwing --- src_features/signMessage/cmd_signMessage.c | 25 ++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/src_features/signMessage/cmd_signMessage.c b/src_features/signMessage/cmd_signMessage.c index 6c85e2c..3f4d51a 100644 --- a/src_features/signMessage/cmd_signMessage.c +++ b/src_features/signMessage/cmd_signMessage.c @@ -19,6 +19,17 @@ static const char SIGN_MAGIC[] = "Ethereum Signed Message:\n"; +/** + * Send a response APDU with the given Status Word + * + * @param[in] sw status word + */ +static void apdu_reply(uint16_t sw) +{ + *(uint16_t *) G_io_apdu_buffer = __builtin_bswap16(sw); + io_exchange(CHANNEL_APDU | IO_RETURN_AFTER_TX, 2); +} + /** * Get unprocessed data from last received APDU * @@ -95,11 +106,13 @@ static const uint8_t *first_apdu_data(const uint8_t *data, uint16_t *length) appState = APP_STATE_SIGNING_MESSAGE; data = parseBip32(data, length, &tmpCtx.messageSigningContext.bip32); if (data == NULL) { + apdu_reply(0x6a80); return NULL; } if (*length < sizeof(uint32_t)) { PRINTF("Invalid data\n"); + apdu_reply(0x6a80); return NULL; } @@ -145,6 +158,7 @@ static bool feed_hash(const uint8_t *const data, uint8_t length) PRINTF("Error: Length mismatch ! (%u > %u)!\n", length, tmpCtx.messageSigningContext.remainingLength); + apdu_reply(0x6a80); return false; } cx_hash((cx_hash_t *) &global_sha3, 0, data, length, NULL, 0); @@ -214,8 +228,7 @@ static void feed_display(void) if ((unprocessed_length() == 0) && (tmpCtx.messageSigningContext.remainingLength > 0)) { - *(uint16_t *) G_io_apdu_buffer = __builtin_bswap16(0x9000); - io_exchange(CHANNEL_APDU | IO_RETURN_AFTER_TX, 2); + apdu_reply(0x9000); } } @@ -248,6 +261,8 @@ bool handleSignPersonalMessage(uint8_t p1, else if (p1 != P1_MORE) { PRINTF("Error: Unexpected P1 (%u)!\n", p1); + apdu_reply(0x6B00); + return false; } if (!feed_hash(data, length)) @@ -271,8 +286,7 @@ bool handleSignPersonalMessage(uint8_t p1, } else { - *(uint16_t *) G_io_apdu_buffer = __builtin_bswap16(0x9000); - io_exchange(CHANNEL_APDU | IO_RETURN_AFTER_TX, 2); + apdu_reply(0x9000); } } return true; @@ -304,8 +318,7 @@ void skip_rest_of_message(void) states.sign_state = STATE_191_HASH_ONLY; if (tmpCtx.messageSigningContext.remainingLength > 0) { - *(uint16_t *) G_io_apdu_buffer = __builtin_bswap16(0x9000); - io_exchange(CHANNEL_APDU | IO_RETURN_AFTER_TX, 2); + apdu_reply(0x9000); } else { From eec44e994aa54b3903d153865a427cdbdf7357f5 Mon Sep 17 00:00:00 2001 From: Alexandre Paillier Date: Fri, 9 Sep 2022 17:21:35 +0200 Subject: [PATCH 09/30] Removed duplicated function signature of ui_idle --- src/ui_callbacks.h | 1 - src_bagl/ui_flow.c | 4 ++-- src_features/getEth2PublicKey/ui_common_getEth2PublicKey.c | 2 +- src_features/getPublicKey/ui_common_getPublicKey.c | 2 +- .../ui_common_performPrivacyOperation.c | 2 +- src_features/signMessage/ui_common_signMessage.c | 2 +- src_features/signMessageEIP712/ui_common_signMessage712.c | 2 +- src_features/signTx/ui_common_signTx.c | 2 +- .../stark_getPublicKey/ui_common_stark_getPublicKey.c | 2 +- src_features/stark_sign/ui_common_stark_sign.c | 2 +- src_features/stark_unsafe_sign/ui_common_stark_unsafe_sign.c | 2 +- 11 files changed, 11 insertions(+), 12 deletions(-) diff --git a/src/ui_callbacks.h b/src/ui_callbacks.h index 419706a..1616e3e 100644 --- a/src/ui_callbacks.h +++ b/src/ui_callbacks.h @@ -23,7 +23,6 @@ unsigned int io_seproxyhal_touch_stark_unsafe_sign_ok(const bagl_element_t *e); unsigned int io_seproxyhal_touch_stark_pubkey_ok(const bagl_element_t *e); unsigned int io_seproxyhal_touch_stark_ok(const bagl_element_t *e); -void ui_idle(void); void ui_warning_contract_data(void); void io_seproxyhal_send_status(uint32_t sw); diff --git a/src_bagl/ui_flow.c b/src_bagl/ui_flow.c index d6c0a16..79cedf4 100644 --- a/src_bagl/ui_flow.c +++ b/src_bagl/ui_flow.c @@ -1,5 +1,5 @@ #include "shared_context.h" -#include "ui_callbacks.h" +#include "common_ui.h" void display_settings(const ux_flow_step_t* const start_step); void switch_settings_blind_signing(void); @@ -184,4 +184,4 @@ UX_STEP_CB( #endif // clang-format on -UX_FLOW(ux_warning_contract_data_flow, &ux_warning_contract_data_step); \ No newline at end of file +UX_FLOW(ux_warning_contract_data_flow, &ux_warning_contract_data_step); diff --git a/src_features/getEth2PublicKey/ui_common_getEth2PublicKey.c b/src_features/getEth2PublicKey/ui_common_getEth2PublicKey.c index ca10fc3..77b38c0 100644 --- a/src_features/getEth2PublicKey/ui_common_getEth2PublicKey.c +++ b/src_features/getEth2PublicKey/ui_common_getEth2PublicKey.c @@ -2,7 +2,7 @@ #include "shared_context.h" #include "feature_getEth2PublicKey.h" -#include "ui_callbacks.h" +#include "common_ui.h" unsigned int io_seproxyhal_touch_eth2_address_ok(__attribute__((unused)) const bagl_element_t *e) { uint32_t tx = set_result_get_eth2_publicKey(); diff --git a/src_features/getPublicKey/ui_common_getPublicKey.c b/src_features/getPublicKey/ui_common_getPublicKey.c index c7bd3a3..d38724a 100644 --- a/src_features/getPublicKey/ui_common_getPublicKey.c +++ b/src_features/getPublicKey/ui_common_getPublicKey.c @@ -1,6 +1,6 @@ #include "shared_context.h" #include "feature_getPublicKey.h" -#include "ui_callbacks.h" +#include "common_ui.h" unsigned int io_seproxyhal_touch_address_ok(__attribute__((unused)) const bagl_element_t *e) { uint32_t tx = set_result_get_publicKey(); diff --git a/src_features/performPrivacyOperation/ui_common_performPrivacyOperation.c b/src_features/performPrivacyOperation/ui_common_performPrivacyOperation.c index ac045f2..a2cb1c3 100644 --- a/src_features/performPrivacyOperation/ui_common_performPrivacyOperation.c +++ b/src_features/performPrivacyOperation/ui_common_performPrivacyOperation.c @@ -1,6 +1,6 @@ #include "shared_context.h" #include "feature_getPublicKey.h" -#include "ui_callbacks.h" +#include "common_ui.h" #include "feature_performPrivacyOperation.h" unsigned int io_seproxyhal_touch_privacy_ok(__attribute__((unused)) const bagl_element_t *e) { diff --git a/src_features/signMessage/ui_common_signMessage.c b/src_features/signMessage/ui_common_signMessage.c index 6436093..4f5c8f2 100644 --- a/src_features/signMessage/ui_common_signMessage.c +++ b/src_features/signMessage/ui_common_signMessage.c @@ -1,6 +1,6 @@ #include "os_io_seproxyhal.h" #include "shared_context.h" -#include "ui_callbacks.h" +#include "common_ui.h" unsigned int io_seproxyhal_touch_signMessage_ok(void) { uint8_t privateKeyData[INT256_LENGTH]; diff --git a/src_features/signMessageEIP712/ui_common_signMessage712.c b/src_features/signMessageEIP712/ui_common_signMessage712.c index e7dea8f..4d5e266 100644 --- a/src_features/signMessageEIP712/ui_common_signMessage712.c +++ b/src_features/signMessageEIP712/ui_common_signMessage712.c @@ -1,6 +1,6 @@ #include "os_io_seproxyhal.h" #include "shared_context.h" -#include "ui_callbacks.h" +#include "common_ui.h" static const uint8_t EIP_712_MAGIC[] = {0x19, 0x01}; diff --git a/src_features/signTx/ui_common_signTx.c b/src_features/signTx/ui_common_signTx.c index 6c482d0..ef8171f 100644 --- a/src_features/signTx/ui_common_signTx.c +++ b/src_features/signTx/ui_common_signTx.c @@ -1,7 +1,7 @@ #include "os_io_seproxyhal.h" #include "shared_context.h" #include "utils.h" -#include "ui_callbacks.h" +#include "common_ui.h" unsigned int io_seproxyhal_touch_tx_ok(__attribute__((unused)) const bagl_element_t *e) { uint8_t privateKeyData[INT256_LENGTH]; diff --git a/src_features/stark_getPublicKey/ui_common_stark_getPublicKey.c b/src_features/stark_getPublicKey/ui_common_stark_getPublicKey.c index 94a6658..31b9714 100644 --- a/src_features/stark_getPublicKey/ui_common_stark_getPublicKey.c +++ b/src_features/stark_getPublicKey/ui_common_stark_getPublicKey.c @@ -1,7 +1,7 @@ #ifdef HAVE_STARKWARE #include "shared_context.h" -#include "ui_callbacks.h" +#include "common_ui.h" #include "feature_stark_getPublicKey.h" unsigned int io_seproxyhal_touch_stark_pubkey_ok(__attribute__((unused)) const bagl_element_t *e) { diff --git a/src_features/stark_sign/ui_common_stark_sign.c b/src_features/stark_sign/ui_common_stark_sign.c index a44ee99..a45f7f9 100644 --- a/src_features/stark_sign/ui_common_stark_sign.c +++ b/src_features/stark_sign/ui_common_stark_sign.c @@ -3,7 +3,7 @@ #include "os_io_seproxyhal.h" #include "shared_context.h" #include "stark_utils.h" -#include "ui_callbacks.h" +#include "common_ui.h" unsigned int io_seproxyhal_touch_stark_ok(__attribute__((unused)) const bagl_element_t *e) { uint8_t privateKeyData[32]; diff --git a/src_features/stark_unsafe_sign/ui_common_stark_unsafe_sign.c b/src_features/stark_unsafe_sign/ui_common_stark_unsafe_sign.c index 899c59d..4774627 100644 --- a/src_features/stark_unsafe_sign/ui_common_stark_unsafe_sign.c +++ b/src_features/stark_unsafe_sign/ui_common_stark_unsafe_sign.c @@ -3,7 +3,7 @@ #include "os_io_seproxyhal.h" #include "shared_context.h" #include "stark_utils.h" -#include "ui_callbacks.h" +#include "common_ui.h" unsigned int io_seproxyhal_touch_stark_unsafe_sign_ok(__attribute__((unused)) const bagl_element_t *e) { From 218098efe9823579bb6b61661967c1608320895e Mon Sep 17 00:00:00 2001 From: Alexandre Paillier Date: Fri, 9 Sep 2022 17:23:24 +0200 Subject: [PATCH 10/30] Removed unused header includes from EIP-191 --- src_features/signMessage/cmd_signMessage.c | 4 +--- src_features/signMessage/ui_common_signMessage.c | 1 - 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/src_features/signMessage/cmd_signMessage.c b/src_features/signMessage/cmd_signMessage.c index 3f4d51a..b70d018 100644 --- a/src_features/signMessage/cmd_signMessage.c +++ b/src_features/signMessage/cmd_signMessage.c @@ -1,9 +1,7 @@ #include #include -#include "shared_context.h" +#include #include "apdu_constants.h" -#include "utils.h" -#include "common_ui.h" #include "sign_message.h" #include "ui_flow_signMessage.h" diff --git a/src_features/signMessage/ui_common_signMessage.c b/src_features/signMessage/ui_common_signMessage.c index 4f5c8f2..eb6707d 100644 --- a/src_features/signMessage/ui_common_signMessage.c +++ b/src_features/signMessage/ui_common_signMessage.c @@ -1,5 +1,4 @@ #include "os_io_seproxyhal.h" -#include "shared_context.h" #include "common_ui.h" unsigned int io_seproxyhal_touch_signMessage_ok(void) { From 50dd4f5965022afee330227d8d73273906daa220 Mon Sep 17 00:00:00 2001 From: Alexandre Paillier Date: Thu, 15 Sep 2022 16:29:45 +0200 Subject: [PATCH 11/30] Linting + updated to clang-format 12.0.1 --- .github/workflows/lint-workflow.yml | 4 +- src/eth_plugin_handler.c | 2 +- src_bagl/ui_flow_signMessage.c | 37 ++--- src_features/signMessage/cmd_signMessage.c | 151 +++++++-------------- src_features/signMessage/sign_message.h | 5 +- 5 files changed, 65 insertions(+), 134 deletions(-) diff --git a/.github/workflows/lint-workflow.yml b/.github/workflows/lint-workflow.yml index b9ea676..f74416d 100644 --- a/.github/workflows/lint-workflow.yml +++ b/.github/workflows/lint-workflow.yml @@ -19,8 +19,8 @@ jobs: uses: actions/checkout@v2 - name: Lint - uses: DoozyX/clang-format-lint-action@v0.13 + uses: DoozyX/clang-format-lint-action@v0.14 with: source: "./" extensions: "h,c" - clangFormatVersion: 12.0.0 + clangFormatVersion: 12.0.1 diff --git a/src/eth_plugin_handler.c b/src/eth_plugin_handler.c index d0de69c..e5187ca 100644 --- a/src/eth_plugin_handler.c +++ b/src/eth_plugin_handler.c @@ -113,7 +113,7 @@ static bool eth_plugin_perform_init_old_internal(uint8_t *contractAddress, j++) { if (memcmp(init->selector, (const void *) PIC(selectors[j]), SELECTOR_SIZE) == 0) { if ((INTERNAL_ETH_PLUGINS[i].availableCheck == NULL) || - ((PluginAvailableCheck) PIC(INTERNAL_ETH_PLUGINS[i].availableCheck)) ()) { + ((PluginAvailableCheck) PIC(INTERNAL_ETH_PLUGINS[i].availableCheck))()) { strlcpy(dataContext.tokenContext.pluginName, INTERNAL_ETH_PLUGINS[i].alias, PLUGIN_ID_LENGTH); diff --git a/src_bagl/ui_flow_signMessage.c b/src_bagl/ui_flow_signMessage.c index b620b56..97546a3 100644 --- a/src_bagl/ui_flow_signMessage.c +++ b/src_bagl/ui_flow_signMessage.c @@ -5,33 +5,24 @@ static uint8_t ui_pos; - -static void dummy_pre_cb(void) -{ - if (ui_pos == UI_191_POS_REVIEW) - { +static void dummy_pre_cb(void) { + if (ui_pos == UI_191_POS_REVIEW) { question_switcher(); - } - else - { + } else { ux_flow_prev(); ui_pos = UI_191_POS_REVIEW; } } -static void dummy_post_cb(void) -{ - if (ui_pos == UI_191_POS_QUESTION) - { +static void dummy_post_cb(void) { + if (ui_pos == UI_191_POS_QUESTION) { continue_displaying_message(); - } - else // UI_191_END + } else // UI_191_END { ui_191_switch_to_message_end(); } } - // clang-format off UX_STEP_NOCB( ux_191_step_review, @@ -99,34 +90,28 @@ UX_FLOW(ux_191_flow, &ux_191_step_sign, &ux_191_step_cancel); - -void ui_191_start(void) -{ +void ui_191_start(void) { ux_flow_init(0, ux_191_flow, NULL); ui_pos = UI_191_POS_REVIEW; } -void ui_191_switch_to_message(void) -{ +void ui_191_switch_to_message(void) { ux_flow_init(0, ux_191_flow, &ux_191_step_message); ui_pos = UI_191_POS_REVIEW; } -void ui_191_switch_to_message_end(void) -{ +void ui_191_switch_to_message_end(void) { // Force it to a value that will make it automatically do a prev() ui_pos = UI_191_POS_QUESTION; ux_flow_init(0, ux_191_flow, &ux_191_step_dummy_pre); } -void ui_191_switch_to_sign(void) -{ +void ui_191_switch_to_sign(void) { ux_flow_init(0, ux_191_flow, &ux_191_step_sign); ui_pos = UI_191_POS_END; } -void ui_191_switch_to_question(void) -{ +void ui_191_switch_to_question(void) { ux_flow_init(0, ux_191_flow, &ux_191_step_theres_more); ui_pos = UI_191_POS_QUESTION; } diff --git a/src_features/signMessage/cmd_signMessage.c b/src_features/signMessage/cmd_signMessage.c index b70d018..77f5ac0 100644 --- a/src_features/signMessage/cmd_signMessage.c +++ b/src_features/signMessage/cmd_signMessage.c @@ -6,8 +6,7 @@ #include "ui_flow_signMessage.h" static uint8_t processed_size; -static struct -{ +static struct { sign_message_state sign_state : 1; bool ui_started : 1; } states; @@ -16,14 +15,12 @@ static const char SIGN_MAGIC[] = "\x19" "Ethereum Signed Message:\n"; - /** * Send a response APDU with the given Status Word * * @param[in] sw status word */ -static void apdu_reply(uint16_t sw) -{ +static void apdu_reply(uint16_t sw) { *(uint16_t *) G_io_apdu_buffer = __builtin_bswap16(sw); io_exchange(CHANNEL_APDU | IO_RETURN_AFTER_TX, 2); } @@ -33,8 +30,7 @@ static void apdu_reply(uint16_t sw) * * @return pointer to data in APDU buffer */ -static const uint8_t *unprocessed_data(void) -{ +static const uint8_t *unprocessed_data(void) { return &G_io_apdu_buffer[OFFSET_CDATA] + processed_size; } @@ -43,8 +39,7 @@ static const uint8_t *unprocessed_data(void) * * @return size of data in bytes */ -static size_t unprocessed_length(void) -{ +static size_t unprocessed_length(void) { return G_io_apdu_buffer[OFFSET_LC] - processed_size; } @@ -53,8 +48,7 @@ static size_t unprocessed_length(void) * * @return size in bytes */ -static size_t ui_buffer_length(void) -{ +static size_t ui_buffer_length(void) { return strlen(UI_191_BUFFER); } @@ -63,8 +57,7 @@ static size_t ui_buffer_length(void) * * @return size in bytes */ -static size_t remaining_ui_buffer_length(void) -{ +static size_t remaining_ui_buffer_length(void) { // -1 for the ending NULL byte return (sizeof(UI_191_BUFFER) - 1) - ui_buffer_length(); } @@ -74,8 +67,7 @@ static size_t remaining_ui_buffer_length(void) * * @return pointer to the free space */ -static char *remaining_ui_buffer(void) -{ +static char *remaining_ui_buffer(void) { return &UI_191_BUFFER[ui_buffer_length()]; } @@ -84,8 +76,7 @@ static char *remaining_ui_buffer(void) * * Simply sets its first byte to a NULL character */ -static void reset_ui_buffer(void) -{ +static void reset_ui_buffer(void) { UI_191_BUFFER[0] = '\0'; } @@ -96,8 +87,7 @@ static void reset_ui_buffer(void) * @param[in] length the payload size * @return pointer to the start of the start of the message; \ref NULL if it failed */ -static const uint8_t *first_apdu_data(const uint8_t *data, uint16_t *length) -{ +static const uint8_t *first_apdu_data(const uint8_t *data, uint16_t *length) { if (appState != APP_STATE_IDLE) { reset_app_context(); } @@ -120,12 +110,7 @@ static const uint8_t *first_apdu_data(const uint8_t *data, uint16_t *length) // Initialize message header + length cx_keccak_init(&global_sha3, 256); - cx_hash((cx_hash_t *) &global_sha3, - 0, - (uint8_t *) SIGN_MAGIC, - sizeof(SIGN_MAGIC) - 1, - NULL, - 0); + cx_hash((cx_hash_t *) &global_sha3, 0, (uint8_t *) SIGN_MAGIC, sizeof(SIGN_MAGIC) - 1, NULL, 0); snprintf(strings.tmp.tmp2, sizeof(strings.tmp.tmp2), "%u", @@ -149,19 +134,16 @@ static const uint8_t *first_apdu_data(const uint8_t *data, uint16_t *length) * @param[in] length the data length * @return whether it was successful or not */ -static bool feed_hash(const uint8_t *const data, uint8_t length) -{ - if (length > tmpCtx.messageSigningContext.remainingLength) - { +static bool feed_hash(const uint8_t *const data, uint8_t length) { + if (length > tmpCtx.messageSigningContext.remainingLength) { PRINTF("Error: Length mismatch ! (%u > %u)!\n", - length, - tmpCtx.messageSigningContext.remainingLength); + length, + tmpCtx.messageSigningContext.remainingLength); apdu_reply(0x6a80); return false; } cx_hash((cx_hash_t *) &global_sha3, 0, data, length, NULL, 0); - if ((tmpCtx.messageSigningContext.remainingLength -= length) == 0) - { + if ((tmpCtx.messageSigningContext.remainingLength -= length) == 0) { // Finalize hash cx_hash((cx_hash_t *) &global_sha3, CX_LAST, @@ -176,56 +158,43 @@ static bool feed_hash(const uint8_t *const data, uint8_t length) /** * Feed the UI with new data */ -static void feed_display(void) -{ +static void feed_display(void) { int c; - while ((unprocessed_length() > 0) && (remaining_ui_buffer_length() > 0)) - { - c = *(char*)unprocessed_data(); - if (isspace(c)) // to replace all white-space characters as spaces + while ((unprocessed_length() > 0) && (remaining_ui_buffer_length() > 0)) { + c = *(char *) unprocessed_data(); + if (isspace(c)) // to replace all white-space characters as spaces { c = ' '; } - if (isprint(c)) - { - sprintf(remaining_ui_buffer(), "%c", (char)c); + if (isprint(c)) { + sprintf(remaining_ui_buffer(), "%c", (char) c); processed_size += 1; - } - else - { - if (remaining_ui_buffer_length() >= 4) // 4 being the fixed length of \x00 + } else { + if (remaining_ui_buffer_length() >= 4) // 4 being the fixed length of \x00 { snprintf(remaining_ui_buffer(), remaining_ui_buffer_length(), "\\x%02x", c); processed_size += 1; - } - else - { + } else { // fill the rest of the UI buffer spaces, to consider the buffer full - while (remaining_ui_buffer_length()) - { + while (remaining_ui_buffer_length()) { sprintf(remaining_ui_buffer(), " "); } } } } - if ((remaining_ui_buffer_length() == 0) - || (tmpCtx.messageSigningContext.remainingLength == 0)) - { - if (!states.ui_started) - { + if ((remaining_ui_buffer_length() == 0) || + (tmpCtx.messageSigningContext.remainingLength == 0)) { + if (!states.ui_started) { ui_191_start(); states.ui_started = true; - } - else - { + } else { ui_191_switch_to_message(); } } - if ((unprocessed_length() == 0) && (tmpCtx.messageSigningContext.remainingLength > 0)) - { + if ((unprocessed_length() == 0) && (tmpCtx.messageSigningContext.remainingLength > 0)) { apdu_reply(0x9000); } } @@ -242,48 +211,37 @@ static void feed_display(void) bool handleSignPersonalMessage(uint8_t p1, uint8_t p2, const uint8_t *const payload, - uint8_t length) -{ + uint8_t length) { const uint8_t *data = payload; - (void)p2; + (void) p2; processed_size = 0; - if (p1 == P1_FIRST) - { - if ((data = first_apdu_data(data, (uint16_t*)&length)) == NULL) - { + if (p1 == P1_FIRST) { + if ((data = first_apdu_data(data, (uint16_t *) &length)) == NULL) { return false; } processed_size = data - payload; - } - else if (p1 != P1_MORE) - { + } else if (p1 != P1_MORE) { PRINTF("Error: Unexpected P1 (%u)!\n", p1); apdu_reply(0x6B00); return false; } - if (!feed_hash(data, length)) - { + if (!feed_hash(data, length)) { return false; } - if (states.sign_state == STATE_191_HASH_DISPLAY) - { + if (states.sign_state == STATE_191_HASH_DISPLAY) { feed_display(); - } - else // hash only + } else // hash only { - if (tmpCtx.messageSigningContext.remainingLength == 0) - { + if (tmpCtx.messageSigningContext.remainingLength == 0) { #ifdef NO_CONSENT io_seproxyhal_touch_signMessage_ok(); #else ui_191_switch_to_sign(); #endif - } - else - { + } else { apdu_reply(0x9000); } } @@ -293,16 +251,11 @@ bool handleSignPersonalMessage(uint8_t p1, /** * Decide whether to show the question to show more of the message or not */ -void question_switcher(void) -{ - if ((states.sign_state == STATE_191_HASH_DISPLAY) - && ((tmpCtx.messageSigningContext.remainingLength > 0) - || (unprocessed_length() > 0))) - { +void question_switcher(void) { + if ((states.sign_state == STATE_191_HASH_DISPLAY) && + ((tmpCtx.messageSigningContext.remainingLength > 0) || (unprocessed_length() > 0))) { ui_191_switch_to_question(); - } - else - { + } else { // Go to Sign / Cancel ui_191_switch_to_sign(); } @@ -311,15 +264,11 @@ void question_switcher(void) /** * The user has decided to skip the rest of the message */ -void skip_rest_of_message(void) -{ +void skip_rest_of_message(void) { states.sign_state = STATE_191_HASH_ONLY; - if (tmpCtx.messageSigningContext.remainingLength > 0) - { + if (tmpCtx.messageSigningContext.remainingLength > 0) { apdu_reply(0x9000); - } - else - { + } else { ui_191_switch_to_sign(); } } @@ -327,11 +276,9 @@ void skip_rest_of_message(void) /** * The user has decided to see the next chunk of the message */ -void continue_displaying_message(void) -{ +void continue_displaying_message(void) { reset_ui_buffer(); - if (unprocessed_length() > 0) - { + if (unprocessed_length() > 0) { feed_display(); } } diff --git a/src_features/signMessage/sign_message.h b/src_features/signMessage/sign_message.h index bb369b5..6d35e49 100644 --- a/src_features/signMessage/sign_message.h +++ b/src_features/signMessage/sign_message.h @@ -1,11 +1,10 @@ #ifndef SIGN_MESSAGE_H_ #define SIGN_MESSAGE_H_ -typedef enum { STATE_191_HASH_DISPLAY = 0, STATE_191_HASH_ONLY } sign_message_state; - - #define UI_191_BUFFER strings.tmp.tmp +typedef enum { STATE_191_HASH_DISPLAY = 0, STATE_191_HASH_ONLY } sign_message_state; + void question_switcher(void); void skip_rest_of_message(void); void continue_displaying_message(void); From 9fc45a7adea664860d218b181734bb949505c2fc Mon Sep 17 00:00:00 2001 From: Alexandre Paillier Date: Mon, 12 Sep 2022 10:49:46 +0200 Subject: [PATCH 12/30] Updated EIP-191 Zemu tests --- .../{test_eip191.py => old_test_eip191.py} | 0 .../snapshots/nanos_eip191_nonascii/00001.png | Bin 492 -> 409 bytes .../snapshots/nanos_eip191_nonascii/00002.png | Bin 489 -> 486 bytes .../snapshots/nanos_eip191_nonascii/00003.png | Bin 474 -> 481 bytes .../snapshots/nanos_eip191_nonascii/00004.png | Bin 490 -> 465 bytes .../snapshots/nanos_eip191_nonascii/00005.png | Bin 407 -> 484 bytes .../snapshots/nanos_eip191_nonascii/00006.png | Bin 449 -> 426 bytes .../snapshots/nanos_eip191_nonascii/00008.png | Bin 349 -> 449 bytes .../snapshots/nanos_eip191_nonascii/00009.png | Bin 0 -> 407 bytes .../snapshots/nanos_eip191_nonascii/00010.png | Bin 0 -> 349 bytes .../snapshots/nanos_eip191_opensea/00002.png | Bin 471 -> 472 bytes .../snapshots/nanos_eip191_opensea/00005.png | Bin 466 -> 478 bytes .../snapshots/nanos_eip191_opensea/00006.png | Bin 407 -> 464 bytes .../snapshots/nanos_eip191_opensea/00007.png | Bin 449 -> 463 bytes .../snapshots/nanos_eip191_opensea/00008.png | Bin 407 -> 426 bytes .../snapshots/nanos_eip191_opensea/00009.png | Bin 349 -> 404 bytes .../snapshots/nanos_eip191_opensea/00010.png | Bin 0 -> 448 bytes .../snapshots/nanos_eip191_opensea/00011.png | Bin 0 -> 470 bytes .../snapshots/nanos_eip191_opensea/00012.png | Bin 0 -> 406 bytes .../snapshots/nanos_eip191_opensea/00013.png | Bin 0 -> 464 bytes .../snapshots/nanos_eip191_opensea/00014.png | Bin 0 -> 407 bytes .../snapshots/nanos_eip191_opensea/00015.png | Bin 0 -> 449 bytes .../snapshots/nanos_eip191_opensea/00016.png | Bin 0 -> 407 bytes .../snapshots/nanos_eip191_opensea/00017.png | Bin 0 -> 349 bytes .../snapshots/nanox_eip191_nonascii/00001.png | Bin 882 -> 814 bytes .../snapshots/nanox_eip191_nonascii/00002.png | Bin 570 -> 846 bytes .../snapshots/nanox_eip191_opensea/00001.png | Bin 853 -> 857 bytes .../snapshots/nanox_eip191_opensea/00002.png | Bin 852 -> 829 bytes .../snapshots/nanox_eip191_opensea/00003.png | Bin 837 -> 723 bytes .../snapshots/nanox_eip191_opensea/00004.png | Bin 814 -> 849 bytes .../snapshots/nanox_eip191_opensea/00005.png | Bin 522 -> 626 bytes .../snapshots/nanox_eip191_opensea/00006.png | Bin 463 -> 496 bytes .../snapshots/nanox_eip191_opensea/00007.png | Bin 499 -> 912 bytes .../snapshots/nanox_eip191_opensea/00008.png | Bin 463 -> 692 bytes .../snapshots/nanox_eip191_opensea/00009.png | Bin 382 -> 463 bytes .../snapshots/nanox_eip191_opensea/00010.png | Bin 0 -> 499 bytes .../snapshots/nanox_eip191_opensea/00011.png | Bin 0 -> 463 bytes .../snapshots/nanox_eip191_opensea/00012.png | Bin 0 -> 382 bytes tests/zemu/src/eip191.test.js | 11 +++++++++-- 39 files changed, 9 insertions(+), 2 deletions(-) rename tests/speculos/{test_eip191.py => old_test_eip191.py} (100%) create mode 100644 tests/zemu/snapshots/nanos_eip191_nonascii/00009.png create mode 100644 tests/zemu/snapshots/nanos_eip191_nonascii/00010.png create mode 100644 tests/zemu/snapshots/nanos_eip191_opensea/00010.png create mode 100644 tests/zemu/snapshots/nanos_eip191_opensea/00011.png create mode 100644 tests/zemu/snapshots/nanos_eip191_opensea/00012.png create mode 100644 tests/zemu/snapshots/nanos_eip191_opensea/00013.png create mode 100644 tests/zemu/snapshots/nanos_eip191_opensea/00014.png create mode 100644 tests/zemu/snapshots/nanos_eip191_opensea/00015.png create mode 100644 tests/zemu/snapshots/nanos_eip191_opensea/00016.png create mode 100644 tests/zemu/snapshots/nanos_eip191_opensea/00017.png create mode 100644 tests/zemu/snapshots/nanox_eip191_opensea/00010.png create mode 100644 tests/zemu/snapshots/nanox_eip191_opensea/00011.png create mode 100644 tests/zemu/snapshots/nanox_eip191_opensea/00012.png diff --git a/tests/speculos/test_eip191.py b/tests/speculos/old_test_eip191.py similarity index 100% rename from tests/speculos/test_eip191.py rename to tests/speculos/old_test_eip191.py diff --git a/tests/zemu/snapshots/nanos_eip191_nonascii/00001.png b/tests/zemu/snapshots/nanos_eip191_nonascii/00001.png index ad00cb8edc31a05942dc4ee03826d9970437dff4..51efae0648b72e384482aee83f67c76c1ac27a46 100644 GIT binary patch delta 382 zcmV-^0fGMP1DOMmB!6H@L_t(|ob8yw5`-WKhHYni{|D~S9-LuZKqNO2TfS3~k)iyk zDFs0g1i=u_Bb`UXV%ZtF8(_&#%iCeR$GP^)d8BP;X2!OEU6?R?03ZtR^O{@MQhSSH z7~k3CSfE^{sa;FWR164>`Fj3>BB953UL1kn$ML3C44oSln;cRDzis}!_D${k* ztVMbU%8IRTaQll2S1!5G5f_B2f z#`qr*beXR7^*SRTDbJq!8TT1*^(=Zd{MCT0>A#2jMpq;8kpc2iCA29UBcsMu5ClOG c1VP}254#v3MwAQOFaQ7m07*qoM6N<$g3t%BRsaA1 delta 466 zcmV;@0WJQS1MCBkB!9C>L_t(|ob8#-vcn(Uz26F$JEl($SpI@IdZ#xp!1mc%DCZYtM*!+%ULD9vL01_WQ0i%cXT zhWLl1=}_d6GdG%2y6ND(S?U20zhSY_i50qAC+B~|ShoRjmeV9*M?-mV8kmI1E-I}& zFHG%{`fD>}6Fji6mDPf|t=mNm5GUePp+)fpyoMTw#Rw;fax4=WDCP zwYu>NGp{KXOHaAUXqm(X}=Q7=~dOhG7_jFM!rq)iQ_Cr~m)}07*qo IM6N<$f^|~inE(I) diff --git a/tests/zemu/snapshots/nanos_eip191_nonascii/00002.png b/tests/zemu/snapshots/nanos_eip191_nonascii/00002.png index b435297ceef023e32abbad51ebe89fcd01e7ac71..b4e4df511fa404ff831937edbcfd67ae26703c13 100644 GIT binary patch delta 460 zcmV;-0W<#T1LgyeB!8_*L_t(|ob6c45`!QN#7_JFAMC*%beuFVLI6RVJ!yb70@*-P z3IqayK%fh@HEnCga-}oS2kM5@p{K*|e$?|~`5X`1$~;43e~ey$b90?PZ+T@c(x|`2 zJ{KsKX=qEqF2%lu!9oR%RDamk)|e&&pat$+q!K<(sT-?BNq-2hKDcB7me27sR1=T| zsW25~IyIEpqCD3My@JC5kx!$pUaR0~c?1Z=-`dE>WP`PPTi zH0U6)&^kyE^t22USQOdj#3Ht!NQ?yx1OkCTpe?>{OQU<=6P6GF0000Cq+e;2uc6~ zfj}S-XpduuW6w}V3WH_fV%U^!Vm~|aT^HNy(>QjyohU;v)d5M#Q+a1sq-d*(1>0WJ z4r?=<3gENPyJAD^a(X2zEy7%trw(hJ08GJOE{PIlJhf>?{C^pU{tifInJY;sDTbU4 z(gi8Mp7OYKE-TtCd+8p9dYDmyZ4d*6sE#-+n@R)80{X2Px1K;e(m@ohWoid>eTa zhQ+cJxgdjdJAV}Ki`um8EtBLcqyFQe+so7BtnT7ukL21G8IYHuNFhVwsByN8RoOWr z-7ki%m(9m6R=Z=#BQu_@AN(PjUe+7EgtagQj!2bN#{XC){54_?{MPqv-N*r2;Y^%k ztkOcKUj|VO&pR0xGp?3kL6Y1j|6;{BF7&X+Ikz=;gGf;;EfsPx2TX+LtM5=NZQ%e< z@a2C6ileh}!y^!XMc6SAP!y`nAI;NGAP@)y0)fB};SE`@T;II*gBt(<002ovPDHLk FV1m>z*_i+U diff --git a/tests/zemu/snapshots/nanos_eip191_nonascii/00003.png b/tests/zemu/snapshots/nanos_eip191_nonascii/00003.png index fcd68b2ff0dd294d869ba59869833833ab338336..d95e83116fb3fd0939b17ef41eff75e3b6bd2b20 100644 GIT binary patch delta 455 zcmV;&0XY8J1K|UZB!8$$L_t(|ob8xh7s4P2hN)Bk{|E14UDVkjzGNh+#dB3o0Y%w- z0g9q1iXw%5gMDkXd@~pv0}n&%kQwkT&-A=p?yn#FCj7>Y`HW7$vAK@Pd;W?o+Ni(g zxfbLs^P{aDcJ1tYEZC;R+K3;K4rx_rniGIq@XjSwB4(3As(%e}Dju&KzLJ2;{WTe0 z6G#hL4!$~kX}IO3D$jLv01`*S#J{}rQY%gvT7vM(dS1eylq}qb+r+*!FT5uxA4}s2q&sr>f9$G#1%^+tlvv zr?MDU9AkS$Q-5ds%AdwM^x5KmiNLPOs;iRn%MT-63|< zZdjTZE}e$4r*KxPdguI27+)#HD4S@R5O1EMUhj;PyXXZECLkIDfGYuplx7bh+CcX! zp6%ts65O1EQ*&+Y%T8L*oL6YSpcFR#F%C8Kxwy6@nLsyu1}~Y$)6`Jo^l39O-mw8M xz;-&f&m++URM9UUqD{(Cg^HpmilQj~kOzY&bdFF#348zm002ovPDHLkV1kKb+YbN$ delta 448 zcmV;x0YCoX1KI)(ZrA z-EN!XIF94ka~|7y6e1%lL+gOmkR#oy{p_T>F8k|qaUT42j0|CF2gF8(#w%~xNbarb zitVpygVl`C06O;Zmc3waFryXP`NRcI7~bD&3cP)=rEdeAq(c&$&J5m%1bh6f+2-Une0oP0&#pPASJ1p9#a5CPSH7*q~lq q*t}}c%=q#eAV@im<2a7vID|Jb{A919z&gIWr6$vPGZx~O6|$UnG)kGGx?0k{RPTzqSse}A)?vZ2`^bHLvL5a~20 zWGz|#rRkU&g-R~wZW@TA(ml)bHsQ-**yxIl8f+&;*d*pT0Plg8O*jcD3-_Ti@mPwj zY5vJ#Yn-cAIT#psY{NqF&|h&};#KED>L;niIGpr!m>R8x>rc6hBpoj|_>~rB zc2O)#)GA=XNe#A}S+UkH;q$nCuNFTwJ(%#BYNJLmn*-Q_n(krj5~UvJAweo7IjPZ? z);nrJk6LuV;Ap6=mJ`f-z_z#lh1B`FU4o_JHb9LUS}-F(syos?J?l}Iz$!o+UDYt^ h5ClOG1VIqo`2n2Pf+DkvF&O{=002ovPDHLkV1l|J(Cz>L delta 464 zcmV;>0Wbd11L^~iB!96M$1n-NPowlt1$Th(k<5JWs(#_ z;z!mDDDvo;t4`DxQ4g``jKjJc01*#NI-S^m!Y`#8)~YiOiw;2MH%k%@g^(q6^qg`n z;zy&GFA7sz%AGro;%3BoDq;d)?c8ythnoGK3kC9;e2y_}!X zy_|N28QVeuaYavxTJaAb-bw1ed5XB1yULD)${gD_ty=A>C-P1W7KsZT+@_jGI9>8h?fRaV@G0 zZ32m&Tq3(jVt_TGE)ZcoI;0HcmGp=l;BYt`4u`|>oA?LdLt?gj;+3xe0000V|ie>U8 zCNU(XAP9mW7{Ya?>nvDi218>|V`BxFeE>h>q#w=k=9cUH81t7YtnPq3xN_x@N7Z8e z>RD3q58APzxQo^bu@@Vt+9y$egOvYYbC5;CO#3 zBXa_?uq-T-vTPcuyjA9TtqwpVcbNJp3vbopjHM}vwk)y;CnIIiGE$TJvb@NW%;~&7 zUbRVY09>*00=NGVkb3dgJ5T2g@Y3lN-AI|_}gzNV?R z>WMXc2ekwRhv6*N{~M^B*kHhV5`2NZMb)%}-VzeB=ZBGY8i4scwm*^s_Ur8U4& zNZN&Htq7uEUD5cl6&(QzM}@9b4}u^Ff*{zHUuRC#;T`$bPyhe`07*qoM6N<$f|)PU Ar~m)} delta 380 zcmV-?0fYYJ1D6AkB!6B>L_t(|ob8!G5`!QNMT1lCe_$7OK_`t6FajEcyp>f)>HkTP z0ALt~Va$rt9st0;{g2)H`{`D#;Y`N99SoR{kM;l}Xa>aI_!PlJf!F8CqCEfr;Dn~2 z#CYI67y@krsHRh*Z2$;77X{;(33tDmYc&D9U$Wf)T#sV`+WTVz^Qo=ISYs`0?ozXTD= zg%{*$&h`n6Q%*!K%L9vjA?<}S_3O~y51_40w#ON-)XL64x@JligSXK^F9>U5TpZCD zR;l1-dd45KJ$3D%x0-pyBlNc)fY48@)K%(1ej}ma6_3!d0Z1I_R5%~Jv6Lw%*j1$7 z_ge=gC`Cq;eEm6nY`nvxN8cIXLpu}HnKSv_1-z4eh0&f~d#fFnpgGW92RzBBy;Z|7 aj8eX+dC!iXSYf>Y0000Se_$8(f-Z{6fDyrf{ojr$LLec; z5C8xGfG!++IQEm8CnrOu!RIEn_MGsipXhNp_ONVfrP$gH?+r+YD=pqq6l=6me@)Z{ zv1M-Bnz3uPZ;?boLWs$T&X2Z0B0Q3&0+D@+vPh9Vbe5+=HvGygKa3 zuZ^pr)J?`c;(wQNzsAmDYvCo~p&h4}uw~6!grmjEqD)JS6hlL&5ZpT%SAf5MwSOD`O!Ud7)^nCSV zm48R~fHVz_gJJ3!JB$;A73W%!0pdWH0?92?e|oM4;Hw|TmLUMNuLZb};ok^+|xiwFd1}a)rFBE)`xpff&pC(>OcSi33 zPQ<&-toCh`ir8`YG?Q(ksdQ&h4}&!Q)A~Sx3z{1R{~!y>Kz^Aq48t%Q@d5O+z+!)U RBVhml002ovPDHLkV1je`!2tjO diff --git a/tests/zemu/snapshots/nanos_eip191_nonascii/00008.png b/tests/zemu/snapshots/nanos_eip191_nonascii/00008.png index ce795f34e8569e986af689fded3b59c9a8af2961..d55782f429e629a5ae929916914befa14613edba 100644 GIT binary patch delta 423 zcmV;Y0a*Us0>J~2B!7rWL_t(|ob8&+5`!QNMWIvw|ASrFg%x867y?3Ca;6JM5t$pw z%Q|NmhGEQ#AH4wQw)H&r%Y%=2X!1JVgP*Thnm&v+013G#w$=INyadmq!5y|#J6@v~ zK;f6~&t28rZ2$=y2#qIiSBd%^P&6!@QLlSIWPrTmu5|10c7L&s>OD`O!Ud7)^nCSV zm48R~fHVz_gJJ3!JB$;A73W%!0pdWH0?92?e|oM4;Hw|TmLUMNuLZb};ok^+|xiwFd1}a)rFBE)`xpff&pC(>OcSi33 zPQ<&-toCh`ir8`YG?Q(ksdQ&h4}&!Q)A~Sx3z{1R{~!y>Kz^Aq48t%Q@d5O+z+!)U RBVhml002ovPDHLkV1mY&!7~5= delta 322 zcmV-I0logg1Kk3UB!47HL_t(|ob8#-62c%1gsEfS|A9T|fw6-G0=6YAu-~c0@)I@* zLv)T1LI|CfH^_}!yz*BZkv^2=?Hdxc{A*JQ7n8RtPp zK=N5{Easxhaf*%Yv5kPk2P1#Has1IRPeHBs$cs9T66OLVbARr_7zz;OoG=T?BQe() z5gxob-#-pvr56zPj+vZs*7zvc)y3?k1aOLJy=-1h0GG6GZi4}#20ekxLQ8>o4!52c z$FXo$VhXU?0M$^Bekqgf%Ka;M*^X|4Es9YCQ(xfJKmNC#+8dY%2&wT+>D^<3C%}l9*&it<8 diff --git a/tests/zemu/snapshots/nanos_eip191_nonascii/00009.png b/tests/zemu/snapshots/nanos_eip191_nonascii/00009.png new file mode 100644 index 0000000000000000000000000000000000000000..f5c2d6774a86d59f5cad0974eb03748765433d08 GIT binary patch literal 407 zcmV;I0cie-P)H|@ zz8wshkB{~MB4`H0-uM*3M1j}m%A!300N{kCpu~9KJs1LQ1E{7`qHO>OJQ#XfRy9Bv z^==(ieYk597RD@{OEdS6GT+Lmuf_h$vek1^KVM4p7nbmHWt7bot=9>X{;(33tDmYc z&D9U$Wf)T#sV`+WTVz^Qo=ISYs`0?ozXTD=g%{*$&h`n6Q%*!K%L9vjA?<}S_3O~y z51_40w#ON-)XL64x@JligSXK^F9>U5TpZCDR;l1-dd45KJ?)^knt8<|^tT^?&`+$? zRq8>0Bcb3GkI=CJNF3=@I3K*Rlqo0JRixhcTL&d5MMji-{W*PXyu+hM-x=UTI}_BI zGx^;Gypw%}(Vkv=s~wl1InZ7QJjtlNRl_ihQog8p&yJp0VZ8tV002ovPDHLkV1iJ- Bw$=au literal 0 HcmV?d00001 diff --git a/tests/zemu/snapshots/nanos_eip191_nonascii/00010.png b/tests/zemu/snapshots/nanos_eip191_nonascii/00010.png new file mode 100644 index 0000000000000000000000000000000000000000..ce795f34e8569e986af689fded3b59c9a8af2961 GIT binary patch literal 349 zcmV-j0iyniP)O41}p;-~WL<=z+0=1Om1tEU@3H#qtw22}5*_5JCvCo4!52c$FXo$VhXU?0M$^Bekqgf%Ka;M*^X|4 zEs9YCQ(xfJKmNC#+8dY%2&wT+>D^<3C%}_*k1^mvtO~`RE00000NkvXXu0mjf-kqOA literal 0 HcmV?d00001 diff --git a/tests/zemu/snapshots/nanos_eip191_opensea/00002.png b/tests/zemu/snapshots/nanos_eip191_opensea/00002.png index 067695318480f24f94c3796e8db5575dc9e6b923..1fd81705bc78594c1158889513be33125240a285 100644 GIT binary patch delta 446 zcmV;v0YU!P1K0zQB!8btL_t(|ob8#(62l+}KuxFp{}0X~J(yvrEFtcuyps#!fvzQ;k!#Y&FY82E(ouz^tNy?>8`x$K1 zB|QVG4H9Drt{Rvcl36Oz&OMV+?%i@>$W-5uu1G&%K^+#+LhfL@-Vdt{F8*O5({> z-8LB^KO1ER$X>^C8%Ro;tyCilTu_|9a#Uh5T?T+dST}E#S5<;#yHwd#3v)L(ItNq! okohOJ(F3T8ew}w5$8mo70%m+rH`ry~d;kCd07*qoM6N<$g6Pl7Bme*a delta 445 zcmV;u0Yd)R1J?tPB!8YsL_t(|ob8#(4ul{KK+(+n{|9?;4osScE>?E5@5EBdQY=tI za2&^RoF<${IFE~xo`b<-pu>nIP>bc8@oA@eUbgQ)aUOgc673mn0N7k{&c-ZTBDH!o z@KGySHo<0Td7&y?NF5YgTbpUV09=B1ZsH~KbV_2n|LJm8b$>Cy_We(W`h=ted`L_r z*}!=os@dXs5;KouA3XpLFc_Pq!grT)n$-`3T@YSb%OM;DmxX1hPTUvOlax!H_A}V1 zOL_*z6WcCOy`e$Xo>ouuZ9Wstoi4QZ0rtu`Kg?*?n!p2a8;s;pUT8Tk7TInCC2DvX zLa4|LcN@FrYJZ(7;at5{M%8lMnM=V#Ou4X1PaakPWN=VHiD=TtniLtO(NlJimtsk+ zB;R!p>A^)kBxw&!vcl5)OYdFLV~l$0^0}eY?xBb(Z@r!m#>V@)doWIqtQj>(O5({> z-8LEVJ~IUd$X>^C8%Ro8u2ds(T~M6Aa#Uh5T?T+dST=8!S5<;#yHwd#3v)LzIt^3) nka-i^=mFG2zs@_3<2ZyLE8I{w$X8Zv00000NkvXXu0mjfQfSMU diff --git a/tests/zemu/snapshots/nanos_eip191_opensea/00005.png b/tests/zemu/snapshots/nanos_eip191_opensea/00005.png index 228f924e98e3960a1e485a5d6119e2397b000bf4..b1bddfeb436638f9617d76879acea9e049076a23 100644 GIT binary patch delta 452 zcmV;#0XzQE1KtCWB!8tzL_t(|ob8#*c7!kphU1+2{txWJS=gp2{2G3^~XCAJ3s?781Z2*G5iYURjtaEvs&@}~>p0#YkNl00x4A)tXC5^&g zl*yp&=D11XtAlaJwhL76Xi)W{w`X3?6QHHjiDEwkUm3>-SUcAPd;l>AJ^83CG#w{S z)^B^yP?OXDeSa(_`8p8xujRGDy>CIPM9Ew~h{3ZGtPQ}jyM73=j7Wx4&QKNujJ>j? zqKBB_^5sJ+AL;^<@NMOKqrI*kV@Q?)jlPk`%3 zK8sGN!U|>l=~NBX3!G0d;D<^ppxkiy|8%wqEBQyNZawlwNfMfxWneF!l=ydx)3*ti uP52UiAvQ+vR$<5wGEX8VAP9osxx4{|Ra$+bZhj5`0000|2`&E<>i5qJwP;4N>zr|LZZe^96Lv^K-6fUWq(Q7sFT1I!u;dr^pYkM zkasqo6G#i$^!OggGY{81Rpxp0HUPn2MU-IN_PIPx=$e8`&ssL&B&4iThU+ZHl1AY# z%4E=XbKE5H)xo%9+Xbq3G^l#e$1^YI3DDB%M6sWNuZ-gZtexu*d;u{BJ^89EG#xLT ztUvaip(dyQ`+t0H(x)0=|5{!f-1|Pfe-MLbC0HAPWq17$WEqhRr<|cI1{ix~NkvZ! zr1GIIAPL`At~c8I>V_#T^%iT7QUr{85?uGf%3dyo>*g&bm1sTzt{?dKfu3*3)l~zDml;_v!)h4XuAE~;@8zo6-YLJhIN_m|G-|j3o_R9L{}+d?3Y~_tUu67 z!ERZSBuSE|vIc4&`?r%#Y`F_%!xGV`6h!?_r(|hSFbbkYX6!L+w~s%DvMWG2n9>8E zz9k}spiMaJ7)rSLscv=}?oICxKy-3?e;ACb)BA(T7+gtap)2w4!{sbof4%xXDJ4A~ z@iMU=+b0$L4}UwfA_CwraC;#jsGUj?Qc;t=MwYrx^KMfdRfJH*P485?RW;#7CF*-k zS^>>sma$RKD$U+mgQk>pZPe7KW?-^EWcrp|*lMUlq`M|yvH+A~8B8f>;^8j7qVb^g z(sd`8EC2`?47b90e?`XN&rMkRLrU8H6a}_c?7nL;pfAHfFSvaZRy2*qNoTxkV(t|5 g05Skck|fXN11JYR+5rjyL_t(|ob8!G5`!QNMT1lCe_$7OK_`t6FajEcyp>f)>HkTP z0ALt~Va$rt9st0;{g2)H`{`D#;Y`N99SoR{kM;l}Xa>aI_!PlJf!F8CqCEfr;Dn~2 z#CYI67y@krsHRh*Z2$;77X{;(33tDmYc&D9U$Wf)T#sV`+WTVz^Qo=ISYs`0?ozXTD= zg%{*$&h`n6Q%*!K%L9vjA?<}S_3O~y51_40w#ON-)XL64x@JligSXK^F9>U5TpZCD zR;l1-dd45KJ$3D%x0-pyBlNc)fY48@)K%(1ej}ma6_3!d0Z1I_R5%~Jv6Lw%*j1$7 z_ge=gC`Cq;eEm6nY`nvxN8cIXLpu}HnKSv_1-z4eh0&f~d#fFnpgGW92RzBBy;Z|7 aj8eX+dC!iXSYf>Y0000U8lEHft~Pa|6HtMGIf?{Tiz$9AR35U}QC$a1cv*Od56*zU}N%(fWh3 zYHD9()udOT+_CjHbRVd2b>Pc8r}G9#<#eNWKf<<*>%+`;uOILLd<`slR2ABeOpv>; z0W8z9zPRu5XMcqddgp9PTSi;j8&R_EfCcDz)uRKa=EK*_N!j#IoX?kcuBkGC9XG{A}#~M||W-VyMzeq}-El-qH z*okyfLuJ8o9iJ^vgtfk3-7m=iR%oo=gatG{>10yjqb|m*3L7o1j8(FDn+sU-51D_$ f7r=2G=YRPEfjU?+9`Ex500000NkvXXu0mjfuC>j3 delta 423 zcmV;Y0a*Ue1Hl83B!7rWL_t(|ob8&+5`!QNMWIvw|ASrFg%x867y?3Ca;6JM5t$pw z%Q|NmhGEQ#AH4wQw)H&r%Y%=2X!1JVgP*Thnm&v+013G#w$=INyadmq!5y|#J6@v~ zK;f6~&t28rZ2$=y2#qIiSBd%^P&6!@QLlSIWPrTmu5|10c7L&s>OD`O!Ud7)^nCSV zm48R~fHVz_gJJ3!JB$;A73W%!0pdWH0?92?e|oM4;Hw|TmLUMNuLZb};ok^+|xiwFd1}a)rFBE)`xpff&pC(>OcSi33 zPQ<&-toCh`ir8`YG?Q(ksdQ&h4}&!Q)A~Sx3z{1R{~!y>Kz^Aq48t%Q@d5O+z+!)U RBVhml002ovPDHLkV1lt6!6pCz diff --git a/tests/zemu/snapshots/nanos_eip191_opensea/00008.png b/tests/zemu/snapshots/nanos_eip191_opensea/00008.png index f5c2d6774a86d59f5cad0974eb03748765433d08..d5c4fde635b43d9bdf246bf35def68777080c917 100644 GIT binary patch delta 400 zcmV;B0dM}71F8d%B!6*9L_t(|ob8&;5`-WKfN5uY{|D~S9=35Dew3U@j5qtw6W#j>_L0#)jJ0!Jzyd@JMzT~DnvRN-r;EW{ z2G3z_wQsW!n}6M@XfG4VrIsfZvaeCJGpgy8vTtpYsdFQ>9?Qb=baqzTM%Cs%jP8co zqw%R>xmzm$v@_b)D+R6|_F=66RNLMD7##qqdC7i1kUlD)0l=-^L_t(|ob8!G5`!QNMT1lCe_$7OK_`t6FajEcyp>f)>HkTP z0ALt~Va$rt9st0;{g2)H`{`D#;Y`N99SoR{kM;l}Xa>aI_!PlJf!F8CqCEfr;Dn~2 z#CYI67y@krsHRh*Z2$;77X{;(33tDmYc&D9U$Wf)T#sV`+WTVz^Qo=ISYs`0?ozXTD= zg%{*$&h`n6Q%*!K%L9vjA?<}S_3O~y51_40w#ON-)XL64x@JligSXK^F9>U5TpZCD zR;l1-dd45KJ$3D%x0-pyBlNc)fY48@)K%(1ej}ma6_3!d0Z1I_R5%~Jv6Lw%*j1$7 z_ge=gC`Cq;eEm6nY`nvxN8cIXLpu}HnKSv_1-z4eh0&f~d#fFnpgGW92RzBBy;Z|7 aj8eX+dC!iXSYf>Y0000%XWSoJMrBXj>p;ob#c|nYktWRuGe4l zu?5)6cx!W;o!k2w39=|MHnvru!LTUgW(Tw-?aBpFqE99UM1LEgl-yopnBstCJ12u< z0w@9Iz}CU0!IDEop4EB)6xCtmFK!&l;sDbS)LK?^2p1+~wQaD>Ru`uQw=B$MX*gDw z^bV9Kw!Xpb9TlQhSRHvg2S5s^f!2P7yfXTS7;UTxJb?6pC69_i;kYpJ93PNczEXYH zooDizySN3FU~3FQOp})}aZ1i`_aG8u#A}8sDUY;UMWCxU9A9%v$Axvg8xiqKTOVFDnNs=TCfH^_}!yz*BZkv^2=?Hdxc{A*JQ7n8RtPp zK=N5{Easxhaf*%Yv5kPk2P1#Has1IRPeHBs$cs9T66OLVbARr_7zz;OoG=T?BQe() z5gxob-#-pvr56zPj+vZs*7zvc)y3?k1aOLJy=-1h0GG6GZi4}#20ekxLQ8>o4!52c z$FXo$VhXU?0M$^Bekqgf%Ka;M*^X|4Es9YCQ(xfJKmNC#+8dY%2&wT+>D^<3C%}l9*&i=H2tc({?|)zy?ZTN1^7lg`4sTUck`NG*;4~FQQ541f{MPBW8ZAAQ@iexUO;z|9 z!#8N$1hCehm)(zehB}~`pe@_;$hJtml&R-sSU7fKTONvH8q`vlOV;s>pbuq=wfqAG zV!ZW?2!Ji{&4rK7^`ABqnwkx=0OB3cBAw<0)PnLaO~=$IbYwGk(?IN%?pdC<32zRA zMptZf!gf-G4Pu-F;2!ANgeM_oK^ZzGoJ+Aa%|9r%`nf90!N9p=`vpR~%j10T-=jnF z zc>B4Yn(c!v$9@{~MHfa-KwezA^OjrIBE9u!eq(`RnTEC$>{9GoJSeW%6r?98w=6VG z1V9U1x$xFF3dLg7A*z%OFCV&0!1g&iLvsSMpe#(2G94P~d8y3v8r=YnJYnoDExgo- zBZj6RII@;aI0-2WmZ3gjT~aNyB&xLE9FO`)zkzYbwijsrqQTV*KVCVU7eGs=3$6W( zbf%pgrnPHz;17s77|CB{q2(wH@+x!Sl=rWGSylR971wTbQK2(;4`RA7$sTa%Ergza z6FD)#7wK6El`Nj=F2VYz*8_xDcD)p}$=i=u`wekaN0CB}{Wa4f0$RcPG@cEWS-k2h zmDH!ERA@oROG`7{xN;ZglI14xNO)b{^wMT!)KDk%W~003P$k8~avl1OKW8{9W>w5P-G zex~Q;JkqvTh2m&8MlV3#T>0ZIkD{dZ)}#5xg5)w!?OL+ea^GS>F_kL}5n4vQnI;2D zNx5^&M`IK$Y9v?4q+)vYA!Grz{r54vCJ+g!!n`Q+&~VF3Ri4*q2PE=>iH}@)sfZJX zmY_1SmY;B{l&n&R+briII^wa1=WFP>Xw)IS0plOruHgQn!PJWmubj>cpq0~w_I^e@ zGR}|S?OGpj1F!}oxm6Wfj*B4Awgz7QwApcw#%$r0@oK_M5_FX2x=>VTuw(DAD$0Juwjz37DF@qWCA=5p)#-Jt41vvO&XnEI zClQ_jN;{JaYumim^0e4dTCm310RR910KngT0Ju6Fb@P;L+yDRo07*qoM6N<$f~J(a A&;S4c literal 0 HcmV?d00001 diff --git a/tests/zemu/snapshots/nanos_eip191_opensea/00013.png b/tests/zemu/snapshots/nanos_eip191_opensea/00013.png new file mode 100644 index 0000000000000000000000000000000000000000..6b52a0997659c7bd5e30e09a5d5917a51dd9668f GIT binary patch literal 464 zcmV;>0WbcEP)DUfW#j?F zesxzI%CY}~dQaXXIyv@b-FQ#2tE3v2M))9n2WvZPOy5>k$KDvjr7J-4GQD0mEg0x7 zwS-h-NnGhMfFUb@g-)!z`vo+4ix+f3WCm9x8~ah2Ej|Ens!}4di1ZyvGp(T>!xGV` z6h!?_r(|hSFbbkYX6!L+w~s%DvMWG2n9>8Ez9k}spiMaJ7)rSLscv=}?oICxKy-3? ze;ACb)BA(T7+gtap)2w4!{sbof4%xXDJ4A~@iMU=+b0$L4?DCX0^l%kdm$jGok|f> zQIow!mby;!Zc`jpgiysz?^L=~HQ_}i>U&LE0nK8Tu~E+|&E8pqrj>)YPYDV6s1C z`j%YSYN$h`yCz_=0F+`GOetsL;V!%eG^tRjmAl5ylZ0a6!ZWx07;T0&*cLs2R_;X3IXK+0000H|@ zz8wshkB{~MB4`H0-uM*3M1j}m%A!300N{kCpu~9KJs1LQ1E{7`qHO>OJQ#XfRy9Bv z^==(ieYk597RD@{OEdS6GT+Lmuf_h$vek1^KVM4p7nbmHWt7bot=9>X{;(33tDmYc z&D9U$Wf)T#sV`+WTVz^Qo=ISYs`0?ozXTD=g%{*$&h`n6Q%*!K%L9vjA?<}S_3O~y z51_40w#ON-)XL64x@JligSXK^F9>U5TpZCDR;l1-dd45KJ?)^knt8<|^tT^?&`+$? zRq8>0Bcb3GkI=CJNF3=@I3K*Rlqo0JRixhcTL&d5MMji-{W*PXyu+hM-x=UTI}_BI zGx^;Gypw%}(Vkv=s~wl1InZ7QJjtlNRl_ihQog8p&yJp0VZ8tV002ovPDHLkV1iJ- Bw$=au literal 0 HcmV?d00001 diff --git a/tests/zemu/snapshots/nanos_eip191_opensea/00015.png b/tests/zemu/snapshots/nanos_eip191_opensea/00015.png new file mode 100644 index 0000000000000000000000000000000000000000..d55782f429e629a5ae929916914befa14613edba GIT binary patch literal 449 zcmV;y0Y3hTP)9Z)nZ zoKdfPKxBZtOD`O!Ud7)^nCSVm48R~fHVz_gJJ3!JB$;A z73W%!0pdWH0?92?e|oM4;Hw|TH|@ zz8wshkB{~MB4`H0-uM*3M1j}m%A!300N{kCpu~9KJs1LQ1E{7`qHO>OJQ#XfRy9Bv z^==(ieYk597RD@{OEdS6GT+Lmuf_h$vek1^KVM4p7nbmHWt7bot=9>X{;(33tDmYc z&D9U$Wf)T#sV`+WTVz^Qo=ISYs`0?ozXTD=g%{*$&h`n6Q%*!K%L9vjA?<}S_3O~y z51_40w#ON-)XL64x@JligSXK^F9>U5TpZCDR;l1-dd45KJ?)^knt8<|^tT^?&`+$? zRq8>0Bcb3GkI=CJNF3=@I3K*Rlqo0JRixhcTL&d5MMji-{W*PXyu+hM-x=UTI}_BI zGx^;Gypw%}(Vkv=s~wl1InZ7QJjtlNRl_ihQog8p&yJp0VZ8tV002ovPDHLkV1iJ- Bw$=au literal 0 HcmV?d00001 diff --git a/tests/zemu/snapshots/nanos_eip191_opensea/00017.png b/tests/zemu/snapshots/nanos_eip191_opensea/00017.png new file mode 100644 index 0000000000000000000000000000000000000000..ce795f34e8569e986af689fded3b59c9a8af2961 GIT binary patch literal 349 zcmV-j0iyniP)O41}p;-~WL<=z+0=1Om1tEU@3H#qtw22}5*_5JCvCo4!52c$FXo$VhXU?0M$^Bekqgf%Ka;M*^X|4 zEs9YCQ(xfJKmNC#+8dY%2&wT+>D^<3C%}_*k1^mvtO~`RE00000NkvXXu0mjf-kqOA literal 0 HcmV?d00001 diff --git a/tests/zemu/snapshots/nanox_eip191_nonascii/00001.png b/tests/zemu/snapshots/nanox_eip191_nonascii/00001.png index 93eda35385a2312963bba2b12c1c5f518b17e39f..6a5f8e8c3e70ce591f4c708d49fc72fe283c097c 100644 GIT binary patch delta 792 zcmV+z1Lyqm2CfE>BYy(*NklZt z5VHsY!pQD%5JCtcgb?yLABkG$d0ro0ua{M_obx`;R72~+wr~EDLvsYU7+V6&yPHQ>K$%mjr+-9;>yp{F+F{7JA2y4i)=iB2ic z#gDPqZK&Us#qZXcSxA+?>eq!ldJ;~-I?7_MV{o0cnA3SrKwLg6+KWe}tSc9?`w9S$ zU*3c5_5hKN-a+bCcXu{fFTgtb|c$ zCESNs5^`@!(y?1To^-Qpa5e-))Dm3XdF7bgT+(r_dPD>dz_dtL*5AYtKMCWc<7oBr zd2XVW4_1B@$a+N75_N6)?N81HrDPe~cfm_PBg!|uVlHgU75{~`^l-Gb=D4Rijyyo5 zd-0qID1QO55if<^v!VMFobm&EfE8FHNylLIg>npeYE&6T5+^idr%klPm2rNf+GC}KzSsO z7B|D+7DyWe&vbr~{z0r9BF^gn-~FjEQ5{&;9)FbT%i04DZbj7X+Bw~Y;HzW9xghIY z=RfROBcWz1+d^kQZ+)e%HKsegEcyd5kqWK{DJ7FU(F$HAtq_= zn#k&JKO4G3zH@CWw~F8OJOHddt0!QOooMA~W;#f+)`Fv55MgS_LP7{3gb+g3@C`~I W^$~&X0eNo#00006Q%zf)wUGA>CWet#3eEQ-3g0X28AW^TRd-t}nxz zFxh5oQ33Yh3QOJqNb59NdSNcU(u7#u%nCFnl0N}`@_~tHTt%*MNx>vdw_EA^6s$*L|ODK&CV^JI028L zrju|BQOc0_f!X7%P@KyKZq3}32y-T zhQts?e?x&#mibsFjK1i3H8XpFQH;G}up+l)vCeZk_6;yySMr^gB~P6@^>~R@COnJT z_3R#CjI36!&R0O(AXoHn1BAMwe={`)Pf}UvNrE8P94uuF?~EGiDSz-r<`p|Dg?hrL zSC=jobe_ah3cA;C>}P8j&zYJ{c>d{}NhC)Vl(0g@YTIZX`sXoAN=qllnzIA!A_h5P=_Wxbq z2h53@DL~D~JTm(PUvMJtnt%sUR=r7XDJvsk0)Ld`J1U6N+1X1|qHM`?;MQfKi~C3V z_EQu^Q4~e-n^4uz2D!DulDe1*U6G2@&dul+H6aQuF^T}mEu!eieV%f~Rnp!fR#!fR zPa$jnMJZ8CP1j{_6FE4SZo*lYy``5%FPn)!xHFlA->!Kv$fXH@DV018{frs;icrCw zi&fr?TrqxtO~7K1WHByr2~WgJl#z+3c|R{zLzf0+g{V1=Gy$OinY9N%qwbvRvLQ;w m4;5BYtSE}2D2k#e-ok%AJ>d|Xk>3jd0000s2c`PD-h%-d%ndnu7`)&Ucicw;)^ds#rNA z%XJ-Hf0&;rL6Uoom|Dt0JutlFYFVwQtf@T$n@6#A2jm51T7Rk-tt@%{aVfjYI(`>& zInPkrG-E8;0VY{vXJ<(3_%33g3#Uo3tDGYtocIZl&c}2_dZkOl-HTV7vNjW@bwFbw z^AzarO;)*}rrnE2j{or~JXNQfMk`auy2Bv;8fxwU^W+>mg#ALZxz^BZUUP$Hzt6c? zpCP4G9I&82nSXaFAwn{r6$eBu+rZ@?>4G*>b3uduh#F=!T(QAi zQ2Ki*A*0{T7r{kuNapEM44MEWOgEd{_08sBrvnn?uzxqGG3oTjv!Rb#beYY&!Ff9b zf}R0Imbi<_=C}mk`rFj#qTB)C3Mx{bPMw+c=u0pa(1lCY0CkX$JWY<>VLyqgk!k&H z7^bH6H^VtN3BAxs8b;NCe=RQGn>S`bzrZbCU zIkkd3kUXxgtd1EQFUigp4pI9@y#(|l-w7ZRCWRDhvr81B8z{kK-^aP9m`_+P1)YGV zZP?OT;0Jefl|&T3^Rgc7U0)EG)Gs9kwpfhH&f*82-qz z)-h^E=0Tpa15CeMGi6{hRkoe~ij)vS2qA=!_uvT=me zwjbsv>P0nqkEo-p3+2T8CC8O&O=C%~%Go`NM^8Z6P^wbRY=7&L^Ti=_uiMxr>g_y3 z@6e2~yV`115|v&8af3gmB^)pmsj0Ba%D47A|jIDP?aZRCSzUdDbb= z-K(r}L6^EWRfhkuX*|`%X)$TnvsM>v>ztqer#)bFbA48EE^&f^c*a==}Cl?~K21`L+000000000000000 k0000002=@R0Dxuu0&U>+zsop!Qvd(}07*qoM6N<$f?#v_l>h($ diff --git a/tests/zemu/snapshots/nanox_eip191_opensea/00001.png b/tests/zemu/snapshots/nanox_eip191_opensea/00001.png index 802fad56d37a5496b01e613af00acd1b784e63aa..4f59a8d40d40f058565352fec5378b58657989fe 100644 GIT binary patch delta 834 zcmV-I1HJs!2H6IXB!3`DL_t(|ob8)ib^{>@hHX!GGW%cB?4=K$%&`JLctK6W_mmg~ z1a*`#DFs0g1VIo4!E(Olio5SSf4HtoD%s9`-=#6xLbl{F{;5#49p`(Zthb=_DgF9T zdilC88lGAFOq5lUM+$2zJFGfN66Xt08C!x2{a8H%p4rWMs(*4;S#rHd#7AWvtfE?N zs7A@=Y9XB%B(E93^4JZAp0qj}`;1i>o3jyh!X*IZ;=?XPbflM#%L9|TQgR249Q}GM zj!Tg0_v$CG{$Q$=s?khF+Mt9cmM%f*HQ2$R1|`x`P)TD|RN7fDOLL2syvy|Rr3wj% z5NI{1bexYn2Y;NlMom5mFGkvr20;)6{eaztx)(f$`!CbQHZ|!{Q|eO%tqFi#i)B;q zYJjm-|3M5S`lWLgo5ig17C?9|WD`V9`yVM+svZwjfvpX7E32_jrvmsuzp{1gqNIju z&2jDQdSJKKcLsQ{<%wcZT4lW1hE2xz2f+2zv*k!-SAWXBt)!wXkq}c6Sx1>=lyX>s z3h-M!1B_l~pPcMZpk{~g^!J4qs7BvIfak5Mw6!5!l%6?(oN(Y?-h;i}6t#bd_tODA zWenJE(@IY0?5D?IFR=>kL~(M&z?I4FrMX7+@a+-cZkc|gZN)fdQ?jb!?fKL-*!wbc zEd?J~)PK}wccznOAEhgcIAOpx1nQ`5v{PvrtTJPA6t@MRflO6T8Tr(rDr8e?$cSBF(z3+xr;D7CW5ClO`@dnR;j)N6=9Y1KvT!BZ> zlo#p~IAu%fw6ASAh_QPNnwYeFtxC!yC|fAyQ)yvG7c6$F0%zU|Rl%7~P)$uDvZ8P+ z%Xl{$pjJ~m2yBq(oB@7Kwg@+78lIX{ZiQyrazXYhk7a!)CJNtjD>M_Sh|RRk0PxO_ zraLfO|9Mf3Cbm#gE&U|vDhpk2g`UNBi6v+=5r7~Ff*{z$FPj~(j(Aef<^TWy M07*qoM6N<$f+_@z{{R30 delta 830 zcmV-E1Ht^+2Gs_TB!3)9L_t(|ob8)icElhEhSQ$zB>P`d_R+q+3)zy}_`5>Uwx92TvK~S1Q+j!m zd-*(18lF-743w3VdJ1bR+pQW(4$c>#GPVR4`Z0S1+@qWIRDa>DyyX0F5Fh1ru!>@~ zp&BKdi-~k#ki13!%WXI4deZD{d}ge|*qn{16D|SBCm(hqqCGu#T7~M-AQyPexjg20;)6?SR#Vx)$7r>o3E_RyAo+lj~Cj%?W^Ai)B&o zYJjm-`$h~T`lWpqo5d{h7C?9^WD`VH>mMmss%{Tefwc{FD~rBQhXVLPFWEYFQBp&- zX1{iJKCoNsI|4jd@JEi&G0!z$z31K_&rS+b?FD}QCbR#H)xNQkM3q$AHVN;#}R z1^BHT0Y)#gZ%+0WsM#R=`1`>NRHNS^!24EJTHBCLO81yRPS|iQ@4?!~6t%y^`^N@P z${4WRrkU*Uuy2pST4EMjiQ?plfh!~3OB0Ri&f6op%`*ME+Kf)j=3`aG%af^dSf7f> zw;NJkvwu0wNmGx~c}1KpU>gE;)HeE1$23@F#>^;g3w{Hcs`lFCD6r6;-?cFNVAha? z(#))scfX!}E{HuUS}Q>klHN?iV`D!g*+6>$n*G=x14)Rhr<`b%jyRdBKsR8#YatSH>d(%+2+ zsMXX51U5)CjsU+VON1Mf4R_5Ur$Q5Txgh(I$GpB11BEX+6`F`t#A5130Ql@jvzWF2 zyf-L%6I&>$mTpP9@ diff --git a/tests/zemu/snapshots/nanox_eip191_opensea/00002.png b/tests/zemu/snapshots/nanox_eip191_opensea/00002.png index a3ba73961da3eaad9983cf189d0191187ce489e8..c094bc635527457d7bebad0d5e3b82f5865e43c5 100644 GIT binary patch delta 806 zcmV+>1KIr42E7K5B!2`+L_t(|ob8%hax5VThC8RS6ZgNQ-phIDie*ur10U?o5 zfv;@ho@ST8K=Q3YZ*bE2552wpUDzO3^wS_hUC~db)?g=9g?2Ita;?EqjNx6qDx6Sp z2+G^$Y!9NMc6jtPcmyJ?6d@>)V+Zc^Z#cZ*bCaN7V&7y3l%sl2!47a^6rh}U63{gG zeJXHroqx^74f>@))D&7?eNE-gPW|6dGHb@^A}pVE@3XXemJ} zq)nww&x}~u(ag9S`$>3(vY4+{$}^6&eo@^|eF!^kVttVdA8sUtOfVyO2p8`-p`aTm kF&}O-wE#s?6h*O#{~0-$EI-`ki2wiq07*qoM6N<$f@xrhRR910 delta 829 zcmV-D1H$~h2GjlPPdVd0X(6OFE9)T_Gmy0+E z_R*(+A^&#SC|M`RwZ2<&_DN|6%=t)$)T#GrKdE7rL%8I z!}U1yKAq_&z&AD+Q%IVQFA0*H-)3!q+k=Vcn!Qtu^M4grlG26R)akZlb9@5QL+`CM zY2YiHw5NMXXdwI6U^h7E{6TMTpNr_^^8PXySC{t}Q+u$J%0fFCIJx#!0}4>VI|*zW z{XP^prGL(D;|~4OA!;fuuRf;nWH0@0C>u2}xZJl_js-|t;+Q=W;EOh3>fMFKCS3p> zwcx9`l%;CuVvX~_1yDjKfIe`fhY$M@R`QP|Ub3EX3Xx5o}$fi-M9K zsmPyF?WUNbBBgEzRfxmSd#R-&JG%*e-;@(zKfm@-5kXX10CWxfY5WL25tpLX0f~vl zVhTP~9QHpeD|W;bl=~e`i>b&&RJ5_ocmjh;I8i=auSDuI!d!36`!h&;2rF1jQSDH2 zA2w}dMM^ZI=P~#mUBo^AIEs8qLU&MN+-7P6ilQirViW%WIIFp~uAPzy00000NkvXX Hu0mjf5PgQO diff --git a/tests/zemu/snapshots/nanox_eip191_opensea/00003.png b/tests/zemu/snapshots/nanox_eip191_opensea/00003.png index 4601bcaf84ed4f20eac3dcb2f88c4844461362c6..9a3efb771058d85eefb392980a0c0fe891508995 100644 GIT binary patch delta 700 zcmV;t0z>`92Ga$QBYy&#Nkl3`I#-ZsPkN$#=pai+<2Vj2<#x{VjLszA0&_2B9mm1Tr0S#i479aAB%l$J zo^nY^(MUhP18pVZFcBRU$5cZ~(4%GyZKw0KReG2@1JcwMBY#DLm8Te^H7{c~k+Sj> zo+!Fa*3yBUbjb`5NlqIxgU|G;2ezBwB;(}8Aa?3SjPHPa@evmyKGO5R#lg!%sl`GZ z!t1>Ai(It?72{5_jP=KctW=e5$_D$5_?fo^h5x~B3~D1qTL*|Wu?f<;r(I&4q--?9 zu7Y%l(L+Y9{(pA+dDl5$!8K~+Nq92aeiQ%zz+0Fs-MoULiuWYu?SeFsvUo1ziA3tq zL^^Ssq&24r&d=FgabePvXjd0&wf!jid=XQnh!t=im?wA=c~l43ns&sm@deC)T6l2R zU%_by4FBkCL*A&l8-azds6=v8qE^bAGfa)85Z-;adVj=ou34`0XvC9Gp0WOfeE?*C z{5=OeAo`vUJL@0>e4R=9c+^m%4<=9uGWy_BRtayv+*T}HdzI)e-t|qGbNkErwv(`Z zAhJbDlBgZKjB{CDX8kSGc${*kmYDw3BvL!e-{=H3)`A+&F1N4voQ>ZB+70+(t)*6& zjXNN;_J6@rtoRZZHOr!q=~Oy*?=S!W0001R8`w&QFg*%e1iit@#=D{RWz9T`7bX^* zS3*g1njOuQ=)7UXc2cZ3TTd;@hYc4%jRI{~OAQ^g=uE8xnjM?*QiR_LaUgF;=Y^6> z#5j-QNd6<%)-|lU0T-_9}Iy>)rHdG-c#fn3`I#QH}UFRtt2QvRL$zN<6Mw}RZOx325Ld0O!(J_Bu?4+v-l zq_?{uCuzjbSD>v%9VVos1@2w1|hTGoVdvGJjGaSbd5xTKhb57424^ zf)h!%!CD&FNlRt`Npo758F;1-HCV0!(~N@$1KFvIi0^=Y@gWx?JktBX)xnEH$;E;k z!sk5mRaPxQYTUssVf~Q-E7hQzv_ZcSJNuTP@;lgtK`o?k>j1DuRsm|a)C-J*loy&| zs{mah^pH@>Uw^NkXYB(HT%#g)!kgjVN0TH;lHF{UP*kC5&ccK>XTyizg1Gt~`wVn8 zd~73DqmSkCdd-PtVRCS%2p|&$GCA_?ZfC$4R>kPflT4G<%(TvD}T#+qF*_ON(H*Kqyuo1j(tSW z^+6!811#RCilFf9>NQJ{M>b`tr9s+PD>ZuM8T(3j{nH9R$Al-_GXW9!>~9>qP`nf1 zz5GWF4UE3!fF&UUo{Pga*idI5Y(NQe_Q6u#B)o6Z3@0b(&!;ir`{n zn8nv~#$zzblY%xmbc;+Esv8>DU|E|}VeN#?fG9X+*fOkS@!4oL-zQQ`^{~hF*XFA&u`^!Vx$ykCI@$Gr->xRTiBSFUgd-StYy$ybPmfe$U}q t|0t9{kmdiBmk%g*e@T!eNs=Vz@C|9KXqmPZW0L>?002ovPDHLkV1hisgYEzT diff --git a/tests/zemu/snapshots/nanox_eip191_opensea/00004.png b/tests/zemu/snapshots/nanox_eip191_opensea/00004.png index eab9f1d489e914195b0f28fae10625d1802d26c1..657edb55590d85ffa7c604df86a3e203c8c84688 100644 GIT binary patch delta 827 zcmV-B1H}BU2GItPBYy)JNklAE=2vsQ9DDJ9XFtCO|Dd<(gbwlKph%Fw@{jApGQ zQ%3nb&+@I)s+aF5LnYT7F?(rFsDYBhih@(QxBmmJ#@M<7@_)KEBPD`WmYjbaDmrBy z--S*!crr;TiF6t@NK00LN$#<;GW0USA}=A($oCljW9eSO384|BfgLT88B^^sZbxEq_!dY9+- zZD!E~tbizLDk-k4HA`@PXZXo0bOj(!JaS=ev}>{= zV#g6UyIM7=eQ6_3ohVUfBZLq_2-$=$JnZkxq<=o>Sa`blx^4hKgNVE{>~V5vr~ag8 z>VNs#*FbX3>!Nmeq8pQ;z28*d7#sjHckDtIrnp`UV*k*jSxZzA%u{Bzz;R3ztP>uBy0cx002ovPDHLk FV1kdBmhJ!m delta 792 zcmV+z1LyqF2CfE>BYy(*NklWgU0~?00000z;eCRmLAla1>P;sa17A2t!yGre@&HF;}SN{(P3 zp`LktH6&e|t-_g=f=s`YpOpNgLo$_rgk@SIZC6HOT?#tx$*xRlr9?^s#2VWL>0R-! z=QW94a~}r@iGLCyrBz7RgM8LLAZpqMPXEZA@M5I*Q2+n{n~8c)=(Dp@%y|&C@G@>^ zcB?_N-Pz4zJRH_lGj?%b$Mf3Fr4rGLr>ZkHwr#rnBpYp3QZ=4VL} zexwt!pTTJ={vxg z%F6=a`o7F(!K|}}S3ZQ5LntDhK0!&<*|q|tC#v&6s(UGz>BX7S?8N;qsrQlx>sW@H8WG#%|DJjr zTNzMLbW#EU00000Ae;~1=AP#%4>@P8AQHPJm<_S)OWr3=h)U2v^p(_ z3T+EX1z#KNGC+}%|Jo#tyPuULU7Om_9+Z5l{vw}|ouy`Wi+`FT%4$pUe-hJCTgUFA zenmvGmEKkm1y~`}1y#9?nIZaO?UmUs2we-gtDCdM0Il;89T6Ytt>Vhy<*L-wA&%?! z#C)5LE@&{^)vpZyV?#XEq?kf$i!DqMy$UKr+ZfbFiRKDOYho9qcX2XlbBmYUGQIXf zOwx^|Q`I)T&VPws1s&&YKFWC~9E`Re1pokWp5VMnV%u82%Qaq!mp1*rRgjSZTnW+p zY_okMCT@ttV*~yy<}((TI)jN)-u0DRFwp}n77lhw8ZmacQxERkbRgq$5;B`r-OV)y za6AzlNiv7In#+Q)7GrsxHb3fOwoT9(5Fo1-QM<=d?SCsPat@l1NazxTJ7OPM2>&%y zB}4mR2&#tmgMkfB0xxuuj*?-6t-M#g#!aD3-E|vxKmL6+kp>va@Py^4<5Ce~8gfwY z+BKHJkKNr(Y^%m5cW=uhA zqiEo}2D=s@d#V3zu;T7DOK7Xv3hhbHm)c+C`{ZPy+TEs7LVv8<68{KFqq|i zsV{onz;xgWM^jMoyR$RQT-@riI)z}kLhf>Fwk$xMe9T0oBfSjYcFC+ zhR@QaW}CWePJf?*Zs%z^%K0XInAUj|005rIusY;E-EeT-#{H=CAWkm8Oj$y=St@2+ z$NwTWS++Edtqa=Z*WoFszJh)Jk;x3DE5_l)b?Crkyq`=#dv}2QP$F_y1G&`rbj?+d zd1jaFs)h!Sl`spOMHd&D`bqKt?^lY@uWIMD)3xr~k!m}@W#8!vfmxdFs~}z~)Wc3b zgw2H0aL1O8HH8(^GB}981dIez%ppWG}Sn z_MSKfRPf-?^!X({hN4a!YiBK=;P%e&&HJ}q>Yawq7T8Uh&s=*%!kJ^$@++~EdV^Dc zChTM@-kTM(J}mTj+{+_Vtrt9fx=Y6C1&ee2mTS{gZ|+dN_wr)1u(iX|c@a^+SL&$c ze{_lum@(BlsQ2&2GtcB2idL<4NfEqhJt;9t*!Gv|B4^DN->Pj@y?xmiFSwC%Ozy8= zwPeF&ebLfK?{2Kn(}-?wTI!J%di1xgo{>P!FYUX^8CH_-<(&&n@7ePh?hx8^VQK+i z{K-kxkL%;hO80AAt-6z}x>Ejj_pJG~oZbD$tnX;~_ar_(alQ0gjO!LX)2o{{ym`$N z-Tvs%-ABjP-p^dEnLVxb&a16@N6R+Hr%7u6j!eC=JIi27*3{lve^*BCxGry0z5n0# zC9|y9s>OfoWfHizWPbO@8T)EP9}B)regCm;Jp;$71Rw1+zx_{}vdx!0^eRv}?@#FC zT|s-b=jCmcxN=y4`%WE4xk>M_4KrWb7QPnwBCmiJ`X}^-%8rQkKg(POlJIo(b6Mw< G&;$UU6xr|q delta 437 zcmV;m0ZRVx1J47HB!8AkL_t(|obB3ClENSifZ^3t+nos;t9XI19+uesc)`R0L^|WWp5-;NmhW_43jkblCA(v zSA)FSmvjZt6l>B`XJ15qb_Z~VpM{cUU(($HO_%Px+0QNAl7Aln002`g?B41@dShn4 z8j^qcKMg+SRb@~2kiDXt9?G(zZ_&4ChfSe&Es>ja8l-41$VME{IyOzQ?Ue@1yRzZ^ zH{)W~!1tfC>juYNH#BJt?4%T&zcu@Ibg0WXI2uYRp~7D9ao)DXaZq`ME(AIgL*Tv`a@k(CjJkNV)t{!?N=7?&?^1IO1&u0YG z{5ZHrU(5t(mE%vLt--ZS%#Pj*_1O55!wLkbjC%sQx0^?Iz<*d%W~9V`?g}z=N`^n@ zsrogqI?eecY2|tYYJlZr((~t!B0P)lXG#Q+NO*^{Dct&J| z)r3@urO4qDRU8K~mlQ!}xuh9(5XE$`7g zJQ@8Qb3aL@Z(o9s^Zz8USy59roV~+?H(Yf!&%3AQdS;uZX_}^Kn&y4}0?9VUP8@Sw Qp#T5?07*qoM6N<$g4o)<6951J delta 474 zcmV<00VV#B2lE4vBYy$9NklgX9g;)ZTl>^=A zr_1} zoVqy>OF&`Hd2}a2001BYxoMobr`^z;v+rcCPXC)~QobV2oON1`f~=0X5~#Kab43$JB1d1+VT%Uu~5OiFH$ceH3lpT*j?`4Z@!}*8%_lfI;!Oe%R!4 z>97!6UmTf_J)7H~dsc1clC3_Q`=+Veb3ye}h32QtLBC05ZhY=JdFnP+li#N4v|Z#q z&Tk2vj8qeDua3(h0d;3G+I-zi&r3E+n_8Ve$pJoH&{Jj?v031SHM!thRyeePJtN-c zzkQWvG#at{UDB0Xe$A=eQ{t(Ksob3M0LiDL?Bnut{uYzc7i0cewtnTYgEZyk3{UhPUR5~g>O&dS6I znC?whrJ%0g#iJnq#E48aI839JX=L4IfIo(sE5O`2=QiQE&}^}UJ1leV#|`gD@L2i&0%#DX z1zk7EOsX-ppx~9fr#ds3C8N$Vuf*%vr-ovQojznr)PJur>rNdAcLNYl7BAbFPfeT2 zCc)Tr+tz+EY>T`PW^`lBRO?zxcAD9lx<5v3W{@l3GeVu)0Ost(vgl3cbleLR`G|+> zWO{!ahO6oQ%`gT}!YuS89VaseOVRG#`b8`$D|%w&F(PyR3;A=J%&n(;4?1!(XR_<~ z`UaFg1%C^*pm^p&?CU>%#eSUr&(FGvzc2t9nI$PbCS}fIeX)7@-G0*w5arsBft#jf z&e4JCY8xU44uF`>`ePyFt?o#qZ<9a40my&UMfI}6Q#-TP+7B{;R$S$Hy=XFrLKD3w zi$d``Gx9g@AA}G>2qA^XH?00000NkvXXu0mjf DNXtQm delta 438 zcmV;n0ZIO}1i<1< z)ust$A*~1i00000005j&Ypu2Jj^YWwy90QoT&ZuaQvl6=DP?aYPf1pQ*$k63`;x8z zO;>}w*_U($&=hOZQ)gd9es%|NhM$F!W?$0X0Zo_gyxGq!-G7oF0000}EbQLuL3(3m zzZ#N%`9BRl=2c}+_mI7!n;y!tp>NT*XopRqb}f;cbQ+{+FUUq5&^k6vvF()x%)7GT z{Ws%c*1-3lv+D-OT{kpo4eX>8oWC{uc66xAI5-+gDWSq%@NwR@#Boq}N6xYw`Ty;e zbt}}Q3)YlR#DA_N3t+nos;t9XI19+uesc)`R0L^|WWp5-;NmhW_43jkblCA(v zSA)FSmvjZt6l>B`XJ15qb_Z~VpM{cUU(($HO_%Px+0QNAl7Aln002`g?B41@dShn4 z8j^qcKMg+SRb@~2kiDXt9?G(zZ_&4ChfSe&Es>ja8l-41$VME{IyOzQ?Ue@1yRzZ^ zH{)W~!1tfC>juYNH#BJt?4%T&zcu@Ibg0WXI2uYRp~7D9ao)DXaZq8}fKv7h6C+vSo*-Jl=BFejIj2*b=t7QrS z431!&0{{R30000000000t2mD1&x+StxcuCugjtw2gZ3x=t=)mIIr82&3gasIFTM9k ztvJ}>Yq8eI6W5XNfa2$NVK)~Iw$m+~VCoJy*I=?9Z*2eG27f1*or0w2C%&Rd-3tH!000000001BFCQGdAO*0P-ogL?002ovPDHLkV1nyC Bt)c(` diff --git a/tests/zemu/snapshots/nanox_eip191_opensea/00010.png b/tests/zemu/snapshots/nanox_eip191_opensea/00010.png new file mode 100644 index 0000000000000000000000000000000000000000..121cfd59ed87f6935ffbcbe5fea8982825511b0a GIT binary patch literal 499 zcmVgX9g;)ZTl>^=Ari<1<)ust$A*~1i00000005j&Ypu2Jj^YWw zy90QoT&ZuaQvl6=DP?aYPf1pQ*$k63`;x8zO;>}w*_U($&=hOZQ)gd9es%|NhM$F! zW?$0X0Zo_gyxGq!-I5;w002`g?B41@dShn48j^qcKMg+SRb@~2kiDXt9?G(zZ_&4C zhfSe&Es>ja8l-41$VME{IyOzQ?Ue@1yRzZ^H{)W~!1tfC>juYNH#BJt?4%T&zcu@I zbg0WXI2uYRp~7D9ao)DXaZq_zsB{W|%4eW}Iz^4!e zUu_N6PY6z&;*%m4K>3kw6W0ds>@{hh*sAjk5Y(@*V#~rbuHu`7A_H&AxgwHf8y4cdKvg$JbB4n%ez%sZ31aBYd&Oo@(7)_WJ(Znl2o8^PD` zFE`_Y-IS+Kdq0Q2-7r_C=}F(5ev`U`H~)QH|9$1FHE$YjoVax+e0xei%S`SAGlOm! zp7{T3NA-mVOYb&rdU8MdyIHo@@7cE*uj@I+Zu{2i)KMSV-E~o Date: Thu, 15 Sep 2022 09:35:47 +0200 Subject: [PATCH 13/30] Code space optimization (192 bytes) --- src_common/network.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src_common/network.h b/src_common/network.h index 8a4513a..ade3152 100644 --- a/src_common/network.h +++ b/src_common/network.h @@ -8,8 +8,8 @@ #define MAX_NETWORK_TICKER_LEN 8 typedef struct network_info_s { - const char name[NETWORK_STRING_MAX_SIZE]; - const char ticker[MAX_NETWORK_TICKER_LEN]; + const char *name; + const char *ticker; uint64_t chain_id; } network_info_t; From ba34e37bce5b7c29bc11c9aa4fe994977fb21e91 Mon Sep 17 00:00:00 2001 From: Alexandre Paillier Date: Thu, 15 Sep 2022 16:32:26 +0200 Subject: [PATCH 14/30] Downgrade to make the app fit on LNS --- src_bagl/ui_flow_signMessage.c | 14 ++++++++++++++ src_features/signMessage/cmd_signMessage.c | 14 +++++++++++--- .../snapshots/nanos_eip191_opensea/00005.png | Bin 478 -> 457 bytes .../snapshots/nanos_eip191_opensea/00006.png | Bin 464 -> 407 bytes .../snapshots/nanos_eip191_opensea/00007.png | Bin 463 -> 449 bytes .../snapshots/nanos_eip191_opensea/00008.png | Bin 426 -> 407 bytes .../snapshots/nanos_eip191_opensea/00009.png | Bin 404 -> 349 bytes .../snapshots/nanos_eip191_opensea/00010.png | Bin 448 -> 0 bytes .../snapshots/nanos_eip191_opensea/00011.png | Bin 470 -> 0 bytes .../snapshots/nanos_eip191_opensea/00012.png | Bin 406 -> 0 bytes .../snapshots/nanos_eip191_opensea/00013.png | Bin 464 -> 0 bytes .../snapshots/nanos_eip191_opensea/00014.png | Bin 407 -> 0 bytes .../snapshots/nanos_eip191_opensea/00015.png | Bin 449 -> 0 bytes .../snapshots/nanos_eip191_opensea/00016.png | Bin 407 -> 0 bytes .../snapshots/nanos_eip191_opensea/00017.png | Bin 349 -> 0 bytes tests/zemu/src/eip191.test.js | 2 +- 16 files changed, 26 insertions(+), 4 deletions(-) delete mode 100644 tests/zemu/snapshots/nanos_eip191_opensea/00010.png delete mode 100644 tests/zemu/snapshots/nanos_eip191_opensea/00011.png delete mode 100644 tests/zemu/snapshots/nanos_eip191_opensea/00012.png delete mode 100644 tests/zemu/snapshots/nanos_eip191_opensea/00013.png delete mode 100644 tests/zemu/snapshots/nanos_eip191_opensea/00014.png delete mode 100644 tests/zemu/snapshots/nanos_eip191_opensea/00015.png delete mode 100644 tests/zemu/snapshots/nanos_eip191_opensea/00016.png delete mode 100644 tests/zemu/snapshots/nanos_eip191_opensea/00017.png diff --git a/src_bagl/ui_flow_signMessage.c b/src_bagl/ui_flow_signMessage.c index 97546a3..a6809e7 100644 --- a/src_bagl/ui_flow_signMessage.c +++ b/src_bagl/ui_flow_signMessage.c @@ -7,13 +7,18 @@ static uint8_t ui_pos; static void dummy_pre_cb(void) { if (ui_pos == UI_191_POS_REVIEW) { +#ifdef TARGET_NANOS + skip_rest_of_message(); +#else question_switcher(); +#endif } else { ux_flow_prev(); ui_pos = UI_191_POS_REVIEW; } } +#ifndef TARGET_NANOS static void dummy_post_cb(void) { if (ui_pos == UI_191_POS_QUESTION) { continue_displaying_message(); @@ -22,6 +27,7 @@ static void dummy_post_cb(void) { ui_191_switch_to_message_end(); } } +#endif // clang-format off UX_STEP_NOCB( @@ -46,6 +52,7 @@ UX_STEP_INIT( { dummy_pre_cb(); }); +#ifndef TARGET_NANOS UX_STEP_CB( ux_191_step_theres_more, bn, @@ -61,6 +68,7 @@ UX_STEP_INIT( { dummy_post_cb(); }); +#endif UX_STEP_CB( ux_191_step_sign, pbb, @@ -85,8 +93,10 @@ UX_FLOW(ux_191_flow, &ux_191_step_review, &ux_191_step_message, &ux_191_step_dummy_pre, +#ifndef TARGET_NANOS &ux_191_step_theres_more, &ux_191_step_dummy_post, +#endif &ux_191_step_sign, &ux_191_step_cancel); @@ -100,18 +110,22 @@ void ui_191_switch_to_message(void) { ui_pos = UI_191_POS_REVIEW; } +#ifndef TARGET_NANOS void ui_191_switch_to_message_end(void) { // Force it to a value that will make it automatically do a prev() ui_pos = UI_191_POS_QUESTION; ux_flow_init(0, ux_191_flow, &ux_191_step_dummy_pre); } +#endif void ui_191_switch_to_sign(void) { ux_flow_init(0, ux_191_flow, &ux_191_step_sign); ui_pos = UI_191_POS_END; } +#ifndef TARGET_NANOS void ui_191_switch_to_question(void) { ux_flow_init(0, ux_191_flow, &ux_191_step_theres_more); ui_pos = UI_191_POS_QUESTION; } +#endif diff --git a/src_features/signMessage/cmd_signMessage.c b/src_features/signMessage/cmd_signMessage.c index 77f5ac0..4c257b7 100644 --- a/src_features/signMessage/cmd_signMessage.c +++ b/src_features/signMessage/cmd_signMessage.c @@ -177,13 +177,17 @@ static void feed_display(void) { processed_size += 1; } else { // fill the rest of the UI buffer spaces, to consider the buffer full - while (remaining_ui_buffer_length()) { - sprintf(remaining_ui_buffer(), " "); - } + memset(remaining_ui_buffer(), ' ', remaining_ui_buffer_length()); } } } +#ifdef TARGET_NANOS + if ((remaining_ui_buffer_length() == 0) && (unprocessed_length > 0)) { + sprintf(remaining_ui_buffer() - 3, "..."); + } +#endif + if ((remaining_ui_buffer_length() == 0) || (tmpCtx.messageSigningContext.remainingLength == 0)) { if (!states.ui_started) { @@ -248,6 +252,7 @@ bool handleSignPersonalMessage(uint8_t p1, return true; } +#ifndef TARGET_NANOS /** * Decide whether to show the question to show more of the message or not */ @@ -260,6 +265,7 @@ void question_switcher(void) { ui_191_switch_to_sign(); } } +#endif /** * The user has decided to skip the rest of the message @@ -273,6 +279,7 @@ void skip_rest_of_message(void) { } } +#ifndef TARGET_NANOS /** * The user has decided to see the next chunk of the message */ @@ -282,3 +289,4 @@ void continue_displaying_message(void) { feed_display(); } } +#endif diff --git a/tests/zemu/snapshots/nanos_eip191_opensea/00005.png b/tests/zemu/snapshots/nanos_eip191_opensea/00005.png index b1bddfeb436638f9617d76879acea9e049076a23..1a86e377a60d743f4264c7a54fb603066da0906b 100644 GIT binary patch delta 431 zcmV;g0Z{(l1IYuBB!7@eL_t(|ob8#xa>O7AhRsg%{tui(_K=Qs;D@C~MK^rYLt+pq zA}X6w5ClQ+RJOkA&m*Ojwq0u(#(DgXd)aV7Y}2aPe2Yg z5}W!fY>|3Bn#&j2Bk&bIz*pX0r|LZZ{-93fYip)i0c8u%%YTxvQ73^bg!!kN(@Ta- zK;GGSP9QC0)8l&}&pcf7Qkm!FZ2*EFMU-IN_O(1ta7{s_XDyp>5>i$v!*!NpNu%(C zG8uH-91lr+Z7}ZGc7f&{4XR%B^UBM40km|wQ0!;mk#T;2wQKzYUqH-(CtsC?mg9qy zTirHqGNcSpkAMGx3My*lwaLBTlp7Z@cxi$~0$6|7Z$p+5$#BYL%3^@ASC(`>uS<1A zT|g49R<1YN`|5^ST554EMZh>B<#uzlol>b4%5=lK8md=1 zA7DW16;M{^`E&ZT2`l+WDs%EiNfMfxWneF!l%(C5KPXH@zYtshkm{X+9#2d_5Cp+< Zc>~+`M5mIN?+O3_002ovPDHLkV1hsT&lCUv delta 452 zcmV;#0XzQ51KtCWB!8tzL_t(|ob8#*c7!kphU1+2{txWJS=gp2{2G3^~XCAJ3s?781Z2*G5iYURjtaEvs&@}~>p0#YkNl00x4A)tXC5^&g zl*yp&=D11XtAlaJwhL76Xi)W{w`X3?6QHHjiDEwkUm3>-SUcAPd;l>AJ^83CG#w{S z)^B^yP?OXDeSa(_`8p8xujRGDy>CIPM9Ew~h{3ZGtPQ}jyM73=j7Wx4&QKNujJ>j? zqKBB_^5sJ+AL;^<@NMOKqrI*kV@Q?)jlPk`%3 zK8sGN!U|>l=~NBX3!G0d;D<^ppxkiy|8%wqEBQyNZawlwNfMfxWneF!l=ydx)3*ti uP52UiAvQ+vR$<5wGEX8VAP9osxx4{|Ra$+bZhj5`0000L_t(|ob8!G5`!QNMT1lCe_$7OK_`t6FajEcyp>f)>HkTP z0ALt~Va$rt9st0;{g2)H`{`D#;Y`N99SoR{kM;l}Xa>aI_!PlJf!F8CqCEfr;Dn~2 z#CYI67y@krsHRh*Z2$;77X{;(33tDmYc&D9U$Wf)T#sV`+WTVz^Qo=ISYs`0?ozXTD= zg%{*$&h`n6Q%*!K%L9vjA?<}S_3O~y51_40w#ON-)XL64x@JligSXK^F9>U5TpZCD zR;l1-dd45KJ$3D%x0-pyBlNc)fY48@)K%(1ej}ma6_3!d0Z1I_R5%~Jv6Lw%*j1$7 z_ge=gC`Cq;eEm6nY`nvxN8cIXLpu}HnKSv_1-z4eh0&f~d#fFnpgGW92RzBBy;Z|7 aj8eX+dC!iXSYf>Y0000JhIN_m|G-|j3o_R9L{}+d?3Y~_tUu67 z!ERZSBuSE|vIc4&`?r%#Y`F_%!xGV`6h!?_r(|hSFbbkYX6!L+w~s%DvMWG2n9>8E zz9k}spiMaJ7)rSLscv=}?oICxKy-3?e;ACb)BA(T7+gtap)2w4!{sbof4%xXDJ4A~ z@iMU=+b0$L4}UwfA_CwraC;#jsGUj?Qc;t=MwYrx^KMfdRfJH*P485?RW;#7CF*-k zS^>>sma$RKD$U+mgQk>pZPe7KW?-^EWcrp|*lMUlq`M|yvH+A~8B8f>;^8j7qVb^g z(sd`8EC2`?47b90e?`XN&rMkRLrU8H6a}_c?7nL;pfAHfFSvaZRy2*qNoTxkV(t|5 g05Skck|fXN11JYR+5rjyOD`O!Ud7)^nCSV zm48R~fHVz_gJJ3!JB$;A73W%!0pdWH0?92?e|oM4;Hw|TmLUMNuLZb};ok^+|xiwFd1}a)rFBE)`xpff&pC(>OcSi33 zPQ<&-toCh`ir8`YG?Q(ksdQ&h4}&!Q)A~Sx3z{1R{~!y>Kz^Aq48t%Q@d5O+z+!)U RBVhml002ovPDHLkV1lt6!6pCz delta 437 zcmV;m0ZRVC1J47HB!8AkL_t(|ob8#*5`!=ZMN_B!{||Oy7tUlT5JH|Lma|ecm=Ym) z8-n9Fj^hmBI>U8lEHft~Pa|6HtMGIf?{Tiz$9AR35U}QC$a1cv*Od56*zU}N%(fWh3 zYHD9()udOT+_CjHbRVd2b>Pc8r}G9#<#eNWKf<<*>%+`;uOILLd<`slR2ABeOpv>; z0W8z9zPRu5XMcqddgp9PTSi;j8&R_EfCcDz)uRKa=EK*_N!j#IoX?kcuBkGC9XG{A}#~M||W-VyMzeq}-El-qH z*okyfLuJ8o9iJ^vgtfk3-7m=iR%oo=gatG{>10yjqb|m*3L7o1j8(FDn+sU-51D_$ f7r=2G=YRPEfjU?+9`Ex500000NkvXXu0mjfuC>j3 diff --git a/tests/zemu/snapshots/nanos_eip191_opensea/00008.png b/tests/zemu/snapshots/nanos_eip191_opensea/00008.png index d5c4fde635b43d9bdf246bf35def68777080c917..f5c2d6774a86d59f5cad0974eb03748765433d08 100644 GIT binary patch delta 380 zcmV-?0fYXk1D6AkB!6B>L_t(|ob8!G5`!QNMT1lCe_$7OK_`t6FajEcyp>f)>HkTP z0ALt~Va$rt9st0;{g2)H`{`D#;Y`N99SoR{kM;l}Xa>aI_!PlJf!F8CqCEfr;Dn~2 z#CYI67y@krsHRh*Z2$;77X{;(33tDmYc&D9U$Wf)T#sV`+WTVz^Qo=ISYs`0?ozXTD= zg%{*$&h`n6Q%*!K%L9vjA?<}S_3O~y51_40w#ON-)XL64x@JligSXK^F9>U5TpZCD zR;l1-dd45KJ$3D%x0-pyBlNc)fY48@)K%(1ej}ma6_3!d0Z1I_R5%~Jv6Lw%*j1$7 z_ge=gC`Cq;eEm6nY`nvxN8cIXLpu}HnKSv_1-z4eh0&f~d#fFnpgGW92RzBBy;Z|7 aj8eX+dC!iXSYf>Y0000@j5qtw6W#j>_L0#)jJ0!Jzyd@JMzT~DnvRN-r;EW{ z2G3z_wQsW!n}6M@XfG4VrIsfZvaeCJGpgy8vTtpYsdFQ>9?Qb=baqzTM%Cs%jP8co zqw%R>xmzm$v@_b)D+R6|_F=66RNLMD7##qqdC7i1kUlD)0l=-^CfH^_}!yz*BZkv^2=?Hdxc{A*JQ7n8RtPp zK=N5{Easxhaf*%Yv5kPk2P1#Has1IRPeHBs$cs9T66OLVbARr_7zz;OoG=T?BQe() z5gxob-#-pvr56zPj+vZs*7zvc)y3?k1aOLJy=-1h0GG6GZi4}#20ekxLQ8>o4!52c z$FXo$VhXU?0M$^Bekqgf%Ka;M*^X|4Es9YCQ(xfJKmNC#+8dY%2&wT+>D^<3C%}l9*&i%XWSoJMrBXj>p;ob#c|nYktWRuGe4l zu?5)6cx!W;o!k2w39=|MHnvru!LTUgW(Tw-?aBpFqE99UM1LEgl-yopnBstCJ12u< z0w@9Iz}CU0!IDEop4EB)6xCtmFK!&l;sDbS)LK?^2p1+~wQaD>Ru`uQw=B$MX*gDw z^bV9Kw!Xpb9TlQhSRHvg2S5s^f!2P7yfXTS7;UTxJb?6pC69_i;kYpJ93PNczEXYH zooDizySN3FU~3FQOp})}aZ1i`_aG8u#A}8sDUY;UMWCxU9A9%v$Axvg8xiqKTOVFDnNs=T=H2tc({?|)zy?ZTN1^7lg`4sTUck`NG*;4~FQQ541f{MPBW8ZAAQ@iexUO;z|9 z!#8N$1hCehm)(zehB}~`pe@_;$hJtml&R-sSU7fKTONvH8q`vlOV;s>pbuq=wfqAG zV!ZW?2!Ji{&4rK7^`ABqnwkx=0OB3cBAw<0)PnLaO~=$IbYwGk(?IN%?pdC<32zRA zMptZf!gf-G4Pu-F;2!ANgeM_oK^ZzGoJ+Aa%|9r%`nf90!N9p=`vpR~%j10T-=jnF z zc>B4Yn(c!v$9@{~MHfa-KwezA^OjrIBE9u!eq(`RnTEC$>{9GoJSeW%6r?98w=6VG z1V9U1x$xFF3dLg7A*z%OFCV&0!1g&iLvsSMpe#(2G94P~d8y3v8r=YnJYnoDExgo- zBZj6RII@;aI0-2WmZ3gjT~aNyB&xLE9FO`)zkzYbwijsrqQTV*KVCVU7eGs=3$6W( zbf%pgrnPHz;17s77|CB{q2(wH@+x!Sl=rWGSylR971wTbQK2(;4`RA7$sTa%Ergza z6FD)#7wK6El`Nj=F2VYz*8_xDcD)p}$=i=u`wekaN0CB}{Wa4f0$RcPG@cEWS-k2h zmDH!ERA@oROG`7{xN;ZglI14xNO)b{^wMT!)KDk%W~003P$k8~avl1OKW8{9W>w5P-G zex~Q;JkqvTh2m&8MlV3#T>0ZIkD{dZ)}#5xg5)w!?OL+ea^GS>F_kL}5n4vQnI;2D zNx5^&M`IK$Y9v?4q+)vYA!Grz{r54vCJ+g!!n`Q+&~VF3Ri4*q2PE=>iH}@)sfZJX zmY_1SmY;B{l&n&R+briII^wa1=WFP>Xw)IS0plOruHgQn!PJWmubj>cpq0~w_I^e@ zGR}|S?OGpj1F!}oxm6Wfj*B4Awgz7QwApcw#%$r0@oK_M5_FX2x=>VTuw(DAD$0Juwjz37DF@qWCA=5p)#-Jt41vvO&XnEI zClQ_jN;{JaYumim^0e4dTCm310RR910KngT0Ju6Fb@P;L+yDRo07*qoM6N<$f~J(a A&;S4c diff --git a/tests/zemu/snapshots/nanos_eip191_opensea/00013.png b/tests/zemu/snapshots/nanos_eip191_opensea/00013.png deleted file mode 100644 index 6b52a0997659c7bd5e30e09a5d5917a51dd9668f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 464 zcmV;>0WbcEP)DUfW#j?F zesxzI%CY}~dQaXXIyv@b-FQ#2tE3v2M))9n2WvZPOy5>k$KDvjr7J-4GQD0mEg0x7 zwS-h-NnGhMfFUb@g-)!z`vo+4ix+f3WCm9x8~ah2Ej|Ens!}4di1ZyvGp(T>!xGV` z6h!?_r(|hSFbbkYX6!L+w~s%DvMWG2n9>8Ez9k}spiMaJ7)rSLscv=}?oICxKy-3? ze;ACb)BA(T7+gtap)2w4!{sbof4%xXDJ4A~@iMU=+b0$L4?DCX0^l%kdm$jGok|f> zQIow!mby;!Zc`jpgiysz?^L=~HQ_}i>U&LE0nK8Tu~E+|&E8pqrj>)YPYDV6s1C z`j%YSYN$h`yCz_=0F+`GOetsL;V!%eG^tRjmAl5ylZ0a6!ZWx07;T0&*cLs2R_;X3IXK+0000H|@ zz8wshkB{~MB4`H0-uM*3M1j}m%A!300N{kCpu~9KJs1LQ1E{7`qHO>OJQ#XfRy9Bv z^==(ieYk597RD@{OEdS6GT+Lmuf_h$vek1^KVM4p7nbmHWt7bot=9>X{;(33tDmYc z&D9U$Wf)T#sV`+WTVz^Qo=ISYs`0?ozXTD=g%{*$&h`n6Q%*!K%L9vjA?<}S_3O~y z51_40w#ON-)XL64x@JligSXK^F9>U5TpZCDR;l1-dd45KJ?)^knt8<|^tT^?&`+$? zRq8>0Bcb3GkI=CJNF3=@I3K*Rlqo0JRixhcTL&d5MMji-{W*PXyu+hM-x=UTI}_BI zGx^;Gypw%}(Vkv=s~wl1InZ7QJjtlNRl_ihQog8p&yJp0VZ8tV002ovPDHLkV1iJ- Bw$=au diff --git a/tests/zemu/snapshots/nanos_eip191_opensea/00015.png b/tests/zemu/snapshots/nanos_eip191_opensea/00015.png deleted file mode 100644 index d55782f429e629a5ae929916914befa14613edba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 449 zcmV;y0Y3hTP)9Z)nZ zoKdfPKxBZtOD`O!Ud7)^nCSVm48R~fHVz_gJJ3!JB$;A z73W%!0pdWH0?92?e|oM4;Hw|TH|@ zz8wshkB{~MB4`H0-uM*3M1j}m%A!300N{kCpu~9KJs1LQ1E{7`qHO>OJQ#XfRy9Bv z^==(ieYk597RD@{OEdS6GT+Lmuf_h$vek1^KVM4p7nbmHWt7bot=9>X{;(33tDmYc z&D9U$Wf)T#sV`+WTVz^Qo=ISYs`0?ozXTD=g%{*$&h`n6Q%*!K%L9vjA?<}S_3O~y z51_40w#ON-)XL64x@JligSXK^F9>U5TpZCDR;l1-dd45KJ?)^knt8<|^tT^?&`+$? zRq8>0Bcb3GkI=CJNF3=@I3K*Rlqo0JRixhcTL&d5MMji-{W*PXyu+hM-x=UTI}_BI zGx^;Gypw%}(Vkv=s~wl1InZ7QJjtlNRl_ihQog8p&yJp0VZ8tV002ovPDHLkV1iJ- Bw$=au diff --git a/tests/zemu/snapshots/nanos_eip191_opensea/00017.png b/tests/zemu/snapshots/nanos_eip191_opensea/00017.png deleted file mode 100644 index ce795f34e8569e986af689fded3b59c9a8af2961..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 349 zcmV-j0iyniP)O41}p;-~WL<=z+0=1Om1tEU@3H#qtw22}5*_5JCvCo4!52c$FXo$VhXU?0M$^Bekqgf%Ka;M*^X|4 zEs9YCQ(xfJKmNC#+8dY%2&wT+>D^<3C%}_*k1^mvtO~`RE00000NkvXXu0mjf-kqOA diff --git a/tests/zemu/src/eip191.test.js b/tests/zemu/src/eip191.test.js index c54b013..c7f25bd 100644 --- a/tests/zemu/src/eip191.test.js +++ b/tests/zemu/src/eip191.test.js @@ -56,7 +56,7 @@ nano_models.forEach(function(model) { if (model.letter == 'S') { - await sim.navigateAndCompareSnapshots('.', model.name + '_eip191_opensea', [1, 5, 1, 6, 0, 1, -1, 0]); + await sim.navigateAndCompareSnapshots('.', model.name + '_eip191_opensea', [1, 5, 1, -1, 0]); } else { From 29476ccf9979fef7a310acd47952b010b7a97444 Mon Sep 17 00:00:00 2001 From: Alexandre Paillier Date: Thu, 15 Sep 2022 16:23:25 +0200 Subject: [PATCH 15/30] Proper UI wording on EIP-191 continue/skip screen --- src_bagl/ui_flow_signMessage.c | 7 ++++--- .../snapshots/nanox_eip191_opensea/00006.png | Bin 496 -> 618 bytes 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src_bagl/ui_flow_signMessage.c b/src_bagl/ui_flow_signMessage.c index a6809e7..e4b38fd 100644 --- a/src_bagl/ui_flow_signMessage.c +++ b/src_bagl/ui_flow_signMessage.c @@ -55,11 +55,12 @@ UX_STEP_INIT( #ifndef TARGET_NANOS UX_STEP_CB( ux_191_step_theres_more, - bn, + nnn, skip_rest_of_message(), { - "More to see!", - "Double-click to skip" + "Press right to", + "continue message", + "Double-press to skip" }); UX_STEP_INIT( ux_191_step_dummy_post, diff --git a/tests/zemu/snapshots/nanox_eip191_opensea/00006.png b/tests/zemu/snapshots/nanox_eip191_opensea/00006.png index fd32ace0cce058c93cca2149edac94ffab1ebb13..952e5ca8af4667c1c76e1821974d598dfd420d23 100644 GIT binary patch delta 594 zcmV-Y03=t z;QT`lRmj{jKR=@#;5ldZ+M#^mLao0IS%h=)mUS({HH`V$fsztSuYitm^`4DMr=aKX z8tp(!$g(le6951J04&GN+vinw>#b1gdrxybt2YRLO=x>+fuOzZMwk3Z!_Fy-qlJdXBxV$sYPk0h@#U6~M z#QJV3jSX|VVOyT#^uZs6U?M^iZ>u0Fqp532lNK<27dqm0N`mHpTsN}6PG~N0lSxX zT{;chX-h*Y>QcMBxpY$+Y|_C8za5>Zy{H_!{NhIjHTxt~(BvM>G6D!qUh@xs zWN@3o%}YK4*tMmmhRaiV*|MstE}y;fkwF@2vJWoNKNhZ-m*Klr7hZ2Cor0bNZU6uP g000000Dx!l2O9^R2bvBuNB{r;07*qoM6N<$f`8H(4*&oF delta 471 zcmaFG@_~7Ray{dAPZ!6KiaBp*22NrT_;~eY#7==>b4zgOz0 z<$rXF51294I;i*W#xu|48j4n}bx9GtX+0@1O4#<7>LO>&72m3DRlR-L7caPxa!l^8 zU$tbzWPQ=nNAGT|(9?)+Z(8b+6?*iyt)7uU%`fe{${ALY@8z8fP4C(B814|-bYW@% zU;N2Q)%B0#%S!iaT&=p3th!SEcK59LwVd7k$E@#Y`S&C~K5@PDTa4=#J=3e3HoSSw z6W#vk(A`JJ*51!tt(iTo_0FrUdPmDP$EQhZ|Bg((u{+CPO4iigS$|hX?zk>*RK5S- z_9e5d*s8^U>}3+Tw`6|z#~J%-L>~*jOnv{cZao9XsRSSGH37d*o3hQ9J@hJ2Iqy&C z<6S{}wddt+mAGbP0 Hl+XkK)C<}T From 0769eaa651657d51c6346410eef57d88fffe2c3e Mon Sep 17 00:00:00 2001 From: Alexandre Paillier Date: Thu, 15 Sep 2022 13:22:39 +0200 Subject: [PATCH 16/30] Updated changelog --- CHANGELOG.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f7b3867..f1d6de3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](http://semver.org/). ## [1.9.20](https://github.com/ledgerhq/app-ethereum/compare/1.9.19...1.9.20) - 2022-XX-XX +### Changed + +- EIP-191 improvements, now lets the user see the entire message by chunks 255 characters (LNX & LNS+), LNS still limited to the first chunk of 99 characters + ## [1.9.19](https://github.com/ledgerhq/app-ethereum/compare/1.9.18...1.9.19) - 2022-06-15 ### Added @@ -18,7 +22,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/). ### Changed -- EIP-191 signatures now show (up to 99 characters on LNS and 255 on LNX & LNS) the actual data contained in the message (clear-signing) +- EIP-191 signatures now show (up to 99 characters on LNS and 255 on LNX & LNS+) the actual data contained in the message (clear-signing) ### Fixed From 3f294f958288e5f124c32a5563754d2892ce3117 Mon Sep 17 00:00:00 2001 From: Lucas PASCAL Date: Fri, 16 Sep 2022 14:43:51 +0200 Subject: [PATCH 17/30] Minor fixes after review --- src/apdu_constants.h | 3 +++ src/main.c | 6 ++++-- src_features/signMessage/cmd_signMessage.c | 10 ++++++---- 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/src/apdu_constants.h b/src/apdu_constants.h index ce1c96a..219b7d0 100644 --- a/src/apdu_constants.h +++ b/src/apdu_constants.h @@ -58,6 +58,9 @@ #define OFFSET_LC 4 #define OFFSET_CDATA 5 +#define ERR_APDU_EMPTY 0x6982 +#define ERR_APDU_SIZE_MISMATCH 0x6983 + void handleGetPublicKey(uint8_t p1, uint8_t p2, const uint8_t *dataBuffer, diff --git a/src/main.c b/src/main.c index fa3db8e..2a32e22 100644 --- a/src/main.c +++ b/src/main.c @@ -770,9 +770,11 @@ void app_main(void) { // no apdu received, well, reset the session, and reset the // bootloader configuration if (rx == 0) { - THROW(0x6982); + THROW(ERR_APDU_EMPTY); + } + if (rx > OFFSET_LC && rx != (G_io_apdu_buffer[OFFSET_LC] + 5)) { + THROW(ERR_APDU_SIZE_MISMATCH); } - PRINTF("New APDU received:\n%.*H\n", rx, G_io_apdu_buffer); handleApdu(&flags, &tx); } diff --git a/src_features/signMessage/cmd_signMessage.c b/src_features/signMessage/cmd_signMessage.c index 4c257b7..4b4008f 100644 --- a/src_features/signMessage/cmd_signMessage.c +++ b/src_features/signMessage/cmd_signMessage.c @@ -21,7 +21,8 @@ static const char SIGN_MAGIC[] = * @param[in] sw status word */ static void apdu_reply(uint16_t sw) { - *(uint16_t *) G_io_apdu_buffer = __builtin_bswap16(sw); + G_io_apdu_buffer[0] = (sw >> 8) & 0xff; + G_io_apdu_buffer[1] = sw & 0xff; io_exchange(CHANNEL_APDU | IO_RETURN_AFTER_TX, 2); } @@ -134,7 +135,7 @@ static const uint8_t *first_apdu_data(const uint8_t *data, uint16_t *length) { * @param[in] length the data length * @return whether it was successful or not */ -static bool feed_hash(const uint8_t *const data, uint8_t length) { +static bool feed_hash(const uint8_t *const data, const uint8_t length) { if (length > tmpCtx.messageSigningContext.remainingLength) { PRINTF("Error: Length mismatch ! (%u > %u)!\n", length, @@ -217,11 +218,12 @@ bool handleSignPersonalMessage(uint8_t p1, const uint8_t *const payload, uint8_t length) { const uint8_t *data = payload; + uint16_t u16_length = length; (void) p2; processed_size = 0; if (p1 == P1_FIRST) { - if ((data = first_apdu_data(data, (uint16_t *) &length)) == NULL) { + if ((data = first_apdu_data(data, &u16_length)) == NULL) { return false; } processed_size = data - payload; @@ -231,7 +233,7 @@ bool handleSignPersonalMessage(uint8_t p1, return false; } - if (!feed_hash(data, length)) { + if (!feed_hash(data, u16_length)) { return false; } From 1e3083a6f9023da3b9e63b7b33cb73b433d9ae91 Mon Sep 17 00:00:00 2001 From: Lucas PASCAL Date: Mon, 19 Sep 2022 17:05:35 +0200 Subject: [PATCH 18/30] Update changelog for 1.9.20 --- CHANGELOG.md | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f1d6de3..b89407a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,7 +5,15 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](http://keepachangelog.com/) and this project adheres to [Semantic Versioning](http://semver.org/). -## [1.9.20](https://github.com/ledgerhq/app-ethereum/compare/1.9.19...1.9.20) - 2022-XX-XX +## [1.9.20](https://github.com/ledgerhq/app-ethereum/compare/1.9.19...1.9.20) - 2022-09-19 + +### Added + +- (clone) XDCNetwork +- (clone) Meter +- (clone) Multivac +- (clone) Tecra +- (clone) ApothemNetwork ### Changed @@ -70,7 +78,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/). ### Fixed -- Fixed stark order signature on LNS +- Fixed stark order signature on LNS ## [1.9.13](https://github.com/ledgerhq/app-ethereum/compare/1.9.12...1.9.13) - 2021-11-17 @@ -82,7 +90,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/). ### Fixed -- Fixed stark order signature on LNX +- Fixed stark order signature on LNX ## [1.9.11](https://github.com/ledgerhq/app-ethereum/compare/1.9.10...1.9.11) - 2021-10-12 From 3ff15a16e358d21124d89d31204a4bddc615b1ad Mon Sep 17 00:00:00 2001 From: Lucas PASCAL Date: Tue, 21 Jun 2022 15:20:31 +0200 Subject: [PATCH 19/30] [clean] Removing compound-related plugin code --- src/eth_plugin_internal.c | 18 -- src/eth_plugin_internal.h | 3 - src_plugins/compound/compound_plugin.c | 243 ------------------------- 3 files changed, 264 deletions(-) delete mode 100644 src_plugins/compound/compound_plugin.c diff --git a/src/eth_plugin_internal.c b/src/eth_plugin_internal.c index 0e28ca6..b266969 100644 --- a/src/eth_plugin_internal.c +++ b/src/eth_plugin_internal.c @@ -4,7 +4,6 @@ bool erc20_plugin_available_check(void); void erc20_plugin_call(int message, void* parameters); -void compound_plugin_call(int message, void* parameters); void copy_address(uint8_t* dst, const uint8_t* parameter, uint8_t dst_size) { uint8_t copy_size = MIN(dst_size, ADDRESS_LENGTH); @@ -29,17 +28,6 @@ static const uint8_t ERC20_APPROVE_SELECTOR[SELECTOR_SIZE] = {0x09, 0x5e, 0xa7, const uint8_t* const ERC20_SELECTORS[NUM_ERC20_SELECTORS] = {ERC20_TRANSFER_SELECTOR, ERC20_APPROVE_SELECTOR}; -static const uint8_t COMPOUND_REDEEM_UNDERLYING_SELECTOR[SELECTOR_SIZE] = {0x85, 0x2a, 0x12, 0xe3}; -static const uint8_t COMPOUND_REDEEM_SELECTOR[SELECTOR_SIZE] = {0xdb, 0x00, 0x6a, 0x75}; -static const uint8_t COMPOUND_MINT_SELECTOR[SELECTOR_SIZE] = {0xa0, 0x71, 0x2d, 0x68}; -static const uint8_t CETH_MINT_SELECTOR[SELECTOR_SIZE] = {0x12, 0x49, 0xc5, 0x8b}; - -const uint8_t* const COMPOUND_SELECTORS[NUM_COMPOUND_SELECTORS] = { - COMPOUND_REDEEM_UNDERLYING_SELECTOR, - COMPOUND_REDEEM_SELECTOR, - COMPOUND_MINT_SELECTOR, - CETH_MINT_SELECTOR}; - #ifdef HAVE_ETH2 static const uint8_t ETH2_DEPOSIT_SELECTOR[SELECTOR_SIZE] = {0x22, 0x89, 0x51, 0x18}; @@ -111,12 +99,6 @@ const internalEthPlugin_t INTERNAL_ETH_PLUGINS[] = { "-erc20", erc20_plugin_call}, - {NULL, - (const uint8_t**) COMPOUND_SELECTORS, - NUM_COMPOUND_SELECTORS, - "-cmpd", - compound_plugin_call}, - #ifdef HAVE_ETH2 {NULL, (const uint8_t**) ETH2_SELECTORS, NUM_ETH2_SELECTORS, "-eth2", eth2_plugin_call}, diff --git a/src/eth_plugin_internal.h b/src/eth_plugin_internal.h index 4d26130..1ad8382 100644 --- a/src/eth_plugin_internal.h +++ b/src/eth_plugin_internal.h @@ -29,9 +29,6 @@ typedef struct internalEthPlugin_t { #define NUM_ERC20_SELECTORS 2 extern const uint8_t* const ERC20_SELECTORS[NUM_ERC20_SELECTORS]; -#define NUM_COMPOUND_SELECTORS 4 -extern const uint8_t* const COMPOUND_SELECTORS[NUM_COMPOUND_SELECTORS]; - #ifdef HAVE_ETH2 #define NUM_ETH2_SELECTORS 1 diff --git a/src_plugins/compound/compound_plugin.c b/src_plugins/compound/compound_plugin.c deleted file mode 100644 index cbb68dd..0000000 --- a/src_plugins/compound/compound_plugin.c +++ /dev/null @@ -1,243 +0,0 @@ -#include -#include "eth_plugin_interface.h" -#include "shared_context.h" // TODO : rewrite as independant code -#include "eth_plugin_internal.h" // TODO : rewrite as independant code -#include "utils.h" -#include "ethUtils.h" - -typedef enum { - COMPOUND_REDEEM_UNDERLYING = 0, - COMPOUND_REDEEM, - COMPOUND_MINT, - CETH_MINT -} compoundSelector_t; - -static const uint8_t COMPOUND_EXPECTED_DATA_SIZE[] = { - 4 + 32, - 4 + 32, - 4 + 32, - 4, -}; - -// redeemUnderlying : redeemAmount (32) -// redeem underlying token -// redeem : redeemTokens (32) -// redeem Ctoken -// mint : mintAmount (32) -// lend some token -// mint : -// lend some Ether - -typedef struct compound_parameters_t { - uint8_t selectorIndex; - uint8_t amount[32]; - char ticker_1[MAX_TICKER_LEN]; - uint8_t decimals; -} compound_parameters_t; - -typedef struct underlying_asset_decimals_t { - char c_ticker[MAX_TICKER_LEN]; - uint8_t decimals; -} underlying_asset_decimals_t; - -/* Sadly, we don't have the information about the underlying asset's decimals, which can differ from -the cToken decimals. Therefore, we hardcode a binding table. If Compound adds a lot of token in the -future, we will have to move to a CAL based architecture instead, as this one doesn't scale well.*/ -#define NUM_COMPOUND_BINDINGS 9 -const underlying_asset_decimals_t UNDERLYING_ASSET_DECIMALS[NUM_COMPOUND_BINDINGS] = { - {"cDAI", 18}, - {"CETH", 18}, - {"CUSDC", 6}, - {"CZRX", 18}, - {"CUSDT", 6}, - {"CBTC", 8}, - {"CBAT", 18}, - {"CREP", 18}, - {"cSAI", 18}, -}; - -bool get_underlying_asset_decimals(char *compound_ticker, uint8_t *out_decimals) { - for (size_t i = 0; i < NUM_COMPOUND_BINDINGS; i++) { - underlying_asset_decimals_t *binding = - (underlying_asset_decimals_t *) PIC(&UNDERLYING_ASSET_DECIMALS[i]); - if (strncmp(binding->c_ticker, - compound_ticker, - strnlen(binding->c_ticker, MAX_TICKER_LEN)) == 0) { - *out_decimals = binding->decimals; - return true; - } - } - return false; -} - -void compound_plugin_call(int message, void *parameters) { - switch (message) { - case ETH_PLUGIN_INIT_CONTRACT: { - ethPluginInitContract_t *msg = (ethPluginInitContract_t *) parameters; - compound_parameters_t *context = (compound_parameters_t *) msg->pluginContext; - size_t i; - for (i = 0; i < NUM_COMPOUND_SELECTORS; i++) { - if (memcmp((uint8_t *) PIC(COMPOUND_SELECTORS[i]), msg->selector, SELECTOR_SIZE) == - 0) { - context->selectorIndex = i; - break; - } - } - // enforce that ETH amount should be 0, except in ceth.mint case - if (!allzeroes(msg->pluginSharedRO->txContent->value.value, 32)) { - if (context->selectorIndex != CETH_MINT) { - PRINTF("Eth amount is not zero and token minted is not CETH!\n"); - msg->result = ETH_PLUGIN_RESULT_ERROR; - break; - } - } - if (i == NUM_COMPOUND_SELECTORS) { - PRINTF("Unknown selector %.*H\n", SELECTOR_SIZE, msg->selector); - msg->result = ETH_PLUGIN_RESULT_ERROR; - break; - } - if (msg->dataSize != COMPOUND_EXPECTED_DATA_SIZE[context->selectorIndex]) { - PRINTF("Unexpected data size for command %d expected %d got %d\n", - context->selectorIndex, - COMPOUND_EXPECTED_DATA_SIZE[context->selectorIndex], - msg->dataSize); - msg->result = ETH_PLUGIN_RESULT_ERROR; - break; - } - if (context->selectorIndex == CETH_MINT) { - // ETH amount 0x1234 is stored 0x12340000...000 instead of 0x00....001234, so we - // strip the following zeroes when copying - memset(context->amount, 0, sizeof(context->amount)); - memmove(context->amount + sizeof(context->amount) - - msg->pluginSharedRO->txContent->value.length, - msg->pluginSharedRO->txContent->value.value, - msg->pluginSharedRO->txContent->value.length); - } - PRINTF("compound plugin inititialized\n"); - msg->result = ETH_PLUGIN_RESULT_OK; - } break; - - case ETH_PLUGIN_PROVIDE_PARAMETER: { - ethPluginProvideParameter_t *msg = (ethPluginProvideParameter_t *) parameters; - compound_parameters_t *context = (compound_parameters_t *) msg->pluginContext; - PRINTF("compound plugin provide parameter %d %.*H\n", - msg->parameterOffset, - 32, - msg->parameter); - if (context->selectorIndex != CETH_MINT) { - switch (msg->parameterOffset) { - case 4: - memmove(context->amount, msg->parameter, 32); - msg->result = ETH_PLUGIN_RESULT_OK; - break; - default: - PRINTF("Unhandled parameter offset\n"); - msg->result = ETH_PLUGIN_RESULT_ERROR; - break; - } - } else { - PRINTF("CETH contract expects no parameters\n"); - msg->result = ETH_PLUGIN_RESULT_ERROR; - } - } break; - - case ETH_PLUGIN_FINALIZE: { - ethPluginFinalize_t *msg = (ethPluginFinalize_t *) parameters; - PRINTF("compound plugin finalize\n"); - msg->tokenLookup1 = msg->pluginSharedRO->txContent->destination; - msg->numScreens = 2; - msg->uiType = ETH_UI_TYPE_GENERIC; - msg->result = ETH_PLUGIN_RESULT_OK; - } break; - - case ETH_PLUGIN_PROVIDE_INFO: { - ethPluginProvideInfo_t *msg = (ethPluginProvideInfo_t *) parameters; - compound_parameters_t *context = (compound_parameters_t *) msg->pluginContext; - PRINTF("compound plugin provide token: %d\n", (msg->item1 != NULL)); - if (msg->item1 != NULL) { - strlcpy(context->ticker_1, msg->item1->token.ticker, MAX_TICKER_LEN); - switch (context->selectorIndex) { - case COMPOUND_REDEEM_UNDERLYING: - case COMPOUND_MINT: - case CETH_MINT: - msg->result = - get_underlying_asset_decimals(context->ticker_1, &context->decimals) - ? ETH_PLUGIN_RESULT_OK - : ETH_PLUGIN_RESULT_FALLBACK; - break; - - // Only case where we use the compound contract decimals - case COMPOUND_REDEEM: - context->decimals = msg->item1->token.decimals; - msg->result = ETH_PLUGIN_RESULT_OK; - break; - - default: - msg->result = ETH_PLUGIN_RESULT_FALLBACK; - break; - } - } else { - msg->result = ETH_PLUGIN_RESULT_FALLBACK; - } - } break; - - case ETH_PLUGIN_QUERY_CONTRACT_ID: { - ethQueryContractID_t *msg = (ethQueryContractID_t *) parameters; - compound_parameters_t *context = (compound_parameters_t *) msg->pluginContext; - strlcpy(msg->name, "Type", msg->nameLength); - switch (context->selectorIndex) { - case COMPOUND_REDEEM_UNDERLYING: - case COMPOUND_REDEEM: - strlcpy(msg->version, "Redeem", msg->versionLength); - break; - - case COMPOUND_MINT: - case CETH_MINT: - strlcpy(msg->version, "Lend", msg->versionLength); - break; - - default: - break; - } - strlcat(msg->version, " Assets", msg->versionLength); - msg->result = ETH_PLUGIN_RESULT_OK; - } break; - - case ETH_PLUGIN_QUERY_CONTRACT_UI: { - ethQueryContractUI_t *msg = (ethQueryContractUI_t *) parameters; - compound_parameters_t *context = (compound_parameters_t *) msg->pluginContext; - switch (msg->screenIndex) { - case 0: { - strlcpy(msg->title, "Amount", msg->titleLength); - char *ticker_ptr = context->ticker_1; - /* skip "c" in front of cToken unless we use "redeem", as - redeem is the only operation dealing with a cToken amount */ - if (context->selectorIndex != COMPOUND_REDEEM) { - ticker_ptr++; - } - amountToString(context->amount, - sizeof(context->amount), - context->decimals, - ticker_ptr, - msg->msg, - 100); - msg->result = ETH_PLUGIN_RESULT_OK; - } break; - - case 1: - strlcpy(msg->title, "Contract", msg->titleLength); - strlcpy(msg->msg, "Compound ", msg->msgLength); - strlcat(msg->msg, - context->ticker_1 + 1, - msg->msgLength); // remove the 'c' char at beginning of compound ticker - msg->result = ETH_PLUGIN_RESULT_OK; - break; - default: - break; - } - } break; - - default: - PRINTF("Unhandled message %d\n", message); - } -} From e9ecf2e109e72f2e4f98d57b5fdb04f5296a75aa Mon Sep 17 00:00:00 2001 From: Alexandre Paillier Date: Mon, 3 Oct 2022 16:57:02 +0200 Subject: [PATCH 20/30] Activate full EIP-191 implementation on LNS + with adequate wording --- src_bagl/ui_flow_signMessage.c | 22 ++++++++-------------- src_features/signMessage/cmd_signMessage.c | 10 ---------- 2 files changed, 8 insertions(+), 24 deletions(-) diff --git a/src_bagl/ui_flow_signMessage.c b/src_bagl/ui_flow_signMessage.c index e4b38fd..545c221 100644 --- a/src_bagl/ui_flow_signMessage.c +++ b/src_bagl/ui_flow_signMessage.c @@ -7,18 +7,13 @@ static uint8_t ui_pos; static void dummy_pre_cb(void) { if (ui_pos == UI_191_POS_REVIEW) { -#ifdef TARGET_NANOS - skip_rest_of_message(); -#else question_switcher(); -#endif } else { ux_flow_prev(); ui_pos = UI_191_POS_REVIEW; } } -#ifndef TARGET_NANOS static void dummy_post_cb(void) { if (ui_pos == UI_191_POS_QUESTION) { continue_displaying_message(); @@ -27,7 +22,6 @@ static void dummy_post_cb(void) { ui_191_switch_to_message_end(); } } -#endif // clang-format off UX_STEP_NOCB( @@ -52,14 +46,21 @@ UX_STEP_INIT( { dummy_pre_cb(); }); -#ifndef TARGET_NANOS UX_STEP_CB( ux_191_step_theres_more, +#ifdef TARGET_NANOS + nn, +#else nnn, +#endif skip_rest_of_message(), { +#ifndef TARGET_NANOS "Press right to", "continue message", +#else + "Press right to read", +#endif "Double-press to skip" }); UX_STEP_INIT( @@ -69,7 +70,6 @@ UX_STEP_INIT( { dummy_post_cb(); }); -#endif UX_STEP_CB( ux_191_step_sign, pbb, @@ -94,10 +94,8 @@ UX_FLOW(ux_191_flow, &ux_191_step_review, &ux_191_step_message, &ux_191_step_dummy_pre, -#ifndef TARGET_NANOS &ux_191_step_theres_more, &ux_191_step_dummy_post, -#endif &ux_191_step_sign, &ux_191_step_cancel); @@ -111,22 +109,18 @@ void ui_191_switch_to_message(void) { ui_pos = UI_191_POS_REVIEW; } -#ifndef TARGET_NANOS void ui_191_switch_to_message_end(void) { // Force it to a value that will make it automatically do a prev() ui_pos = UI_191_POS_QUESTION; ux_flow_init(0, ux_191_flow, &ux_191_step_dummy_pre); } -#endif void ui_191_switch_to_sign(void) { ux_flow_init(0, ux_191_flow, &ux_191_step_sign); ui_pos = UI_191_POS_END; } -#ifndef TARGET_NANOS void ui_191_switch_to_question(void) { ux_flow_init(0, ux_191_flow, &ux_191_step_theres_more); ui_pos = UI_191_POS_QUESTION; } -#endif diff --git a/src_features/signMessage/cmd_signMessage.c b/src_features/signMessage/cmd_signMessage.c index 4b4008f..1c764b1 100644 --- a/src_features/signMessage/cmd_signMessage.c +++ b/src_features/signMessage/cmd_signMessage.c @@ -183,12 +183,6 @@ static void feed_display(void) { } } -#ifdef TARGET_NANOS - if ((remaining_ui_buffer_length() == 0) && (unprocessed_length > 0)) { - sprintf(remaining_ui_buffer() - 3, "..."); - } -#endif - if ((remaining_ui_buffer_length() == 0) || (tmpCtx.messageSigningContext.remainingLength == 0)) { if (!states.ui_started) { @@ -254,7 +248,6 @@ bool handleSignPersonalMessage(uint8_t p1, return true; } -#ifndef TARGET_NANOS /** * Decide whether to show the question to show more of the message or not */ @@ -267,7 +260,6 @@ void question_switcher(void) { ui_191_switch_to_sign(); } } -#endif /** * The user has decided to skip the rest of the message @@ -281,7 +273,6 @@ void skip_rest_of_message(void) { } } -#ifndef TARGET_NANOS /** * The user has decided to see the next chunk of the message */ @@ -291,4 +282,3 @@ void continue_displaying_message(void) { feed_display(); } } -#endif From d78bece8d243b03f5653625f4aa0c4c47756ddc4 Mon Sep 17 00:00:00 2001 From: Alexandre Paillier Date: Tue, 4 Oct 2022 14:27:22 +0200 Subject: [PATCH 21/30] Fix Zemu tests --- .../snapshots/nanos_eip191_opensea/00005.png | Bin 457 -> 478 bytes .../snapshots/nanos_eip191_opensea/00006.png | Bin 407 -> 462 bytes .../snapshots/nanos_eip191_opensea/00007.png | Bin 449 -> 463 bytes .../snapshots/nanos_eip191_opensea/00008.png | Bin 407 -> 426 bytes .../snapshots/nanos_eip191_opensea/00009.png | Bin 349 -> 404 bytes .../snapshots/nanos_eip191_opensea/00010.png | Bin 0 -> 448 bytes .../snapshots/nanos_eip191_opensea/00011.png | Bin 0 -> 470 bytes .../snapshots/nanos_eip191_opensea/00012.png | Bin 0 -> 406 bytes .../snapshots/nanos_eip191_opensea/00013.png | Bin 0 -> 462 bytes .../snapshots/nanos_eip191_opensea/00014.png | Bin 0 -> 407 bytes .../snapshots/nanos_eip191_opensea/00015.png | Bin 0 -> 449 bytes .../snapshots/nanos_eip191_opensea/00016.png | Bin 0 -> 407 bytes .../snapshots/nanos_eip191_opensea/00017.png | Bin 0 -> 349 bytes tests/zemu/src/eip191.test.js | 2 +- 14 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 tests/zemu/snapshots/nanos_eip191_opensea/00010.png create mode 100644 tests/zemu/snapshots/nanos_eip191_opensea/00011.png create mode 100644 tests/zemu/snapshots/nanos_eip191_opensea/00012.png create mode 100644 tests/zemu/snapshots/nanos_eip191_opensea/00013.png create mode 100644 tests/zemu/snapshots/nanos_eip191_opensea/00014.png create mode 100644 tests/zemu/snapshots/nanos_eip191_opensea/00015.png create mode 100644 tests/zemu/snapshots/nanos_eip191_opensea/00016.png create mode 100644 tests/zemu/snapshots/nanos_eip191_opensea/00017.png diff --git a/tests/zemu/snapshots/nanos_eip191_opensea/00005.png b/tests/zemu/snapshots/nanos_eip191_opensea/00005.png index 1a86e377a60d743f4264c7a54fb603066da0906b..b1bddfeb436638f9617d76879acea9e049076a23 100644 GIT binary patch delta 452 zcmV;#0XzQ51KtCWB!8tzL_t(|ob8#*c7!kphU1+2{txWJS=gp2{2G3^~XCAJ3s?781Z2*G5iYURjtaEvs&@}~>p0#YkNl00x4A)tXC5^&g zl*yp&=D11XtAlaJwhL76Xi)W{w`X3?6QHHjiDEwkUm3>-SUcAPd;l>AJ^83CG#w{S z)^B^yP?OXDeSa(_`8p8xujRGDy>CIPM9Ew~h{3ZGtPQ}jyM73=j7Wx4&QKNujJ>j? zqKBB_^5sJ+AL;^<@NMOKqrI*kV@Q?)jlPk`%3 zK8sGN!U|>l=~NBX3!G0d;D<^ppxkiy|8%wqEBQyNZawlwNfMfxWneF!l=ydx)3*ti uP52UiAvQ+vR$<5wGEX8VAP9osxx4{|Ra$+bZhj5`0000O7AhRsg%{tui(_K=Qs;D@C~MK^rYLt+pq zA}X6w5ClQ+RJOkA&m*Ojwq0u(#(DgXd)aV7Y}2aPe2Yg z5}W!fY>|3Bn#&j2Bk&bIz*pX0r|LZZ{-93fYip)i0c8u%%YTxvQ73^bg!!kN(@Ta- zK;GGSP9QC0)8l&}&pcf7Qkm!FZ2*EFMU-IN_O(1ta7{s_XDyp>5>i$v!*!NpNu%(C zG8uH-91lr+Z7}ZGc7f&{4XR%B^UBM40km|wQ0!;mk#T;2wQKzYUqH-(CtsC?mg9qy zTirHqGNcSpkAMGx3My*lwaLBTlp7Z@cxi$~0$6|7Z$p+5$#BYL%3^@ASC(`>uS<1A zT|g49R<1YN`|5^ST554EMZh>B<#uzlol>b4%5=lK8md=1 zA7DW16;M{^`E&ZT2`l+WDs%EiNfMfxWneF!l%(C5KPXH@zYtshkm{X+9#2d_5Cp+< Zc>~+`M5mIN?+O3_002ovPDHLkV1hsT&lCUv diff --git a/tests/zemu/snapshots/nanos_eip191_opensea/00006.png b/tests/zemu/snapshots/nanos_eip191_opensea/00006.png index f5c2d6774a86d59f5cad0974eb03748765433d08..f872acc966fb2563e1c5de855b72147ebcc2c609 100644 GIT binary patch delta 436 zcmV;l0Zaau1I`1GB!87jL_t(|ob8$04#FS|hSBKzKd={iv1B%-Ej@5@_KPtCOX-vOC^h9z%k-J>ecSHHc#0U&P^VuPT zb0QxXsMrMMmI>5-k@+yjy`wJ`M`q`Wa>Jdci3*6K&~yExG1M`QfGHB(PVSI@~RX{O)c83Rp{NF<-1iA#%OmL_t(|ob8!G5`!QNMT1lCe_$7OK_`t6FajEcyp>f)>HkTP z0ALt~Va$rt9st0;{g2)H`{`D#;Y`N99SoR{kM;l}Xa>aI_!PlJf!F8CqCEfr;Dn~2 z#CYI67y@krsHRh*Z2$;77X{;(33tDmYc&D9U$Wf)T#sV`+WTVz^Qo=ISYs`0?ozXTD= zg%{*$&h`n6Q%*!K%L9vjA?<}S_3O~y51_40w#ON-)XL64x@JligSXK^F9>U5TpZCD zR;l1-dd45KJ$3D%x0-pyBlNc)fY48@)K%(1ej}ma6_3!d0Z1I_R5%~Jv6Lw%*j1$7 z_ge=gC`Cq;eEm6nY`nvxN8cIXLpu}HnKSv_1-z4eh0&f~d#fFnpgGW92RzBBy;Z|7 aj8eX+dC!iXSYf>Y0000U8lEHft~Pa|6HtMGIf?{Tiz$9AR35U}QC$a1cv*Od56*zU}N%(fWh3 zYHD9()udOT+_CjHbRVd2b>Pc8r}G9#<#eNWKf<<*>%+`;uOILLd<`slR2ABeOpv>; z0W8z9zPRu5XMcqddgp9PTSi;j8&R_EfCcDz)uRKa=EK*_N!j#IoX?kcuBkGC9XG{A}#~M||W-VyMzeq}-El-qH z*okyfLuJ8o9iJ^vgtfk3-7m=iR%oo=gatG{>10yjqb|m*3L7o1j8(FDn+sU-51D_$ f7r=2G=YRPEfjU?+9`Ex500000NkvXXu0mjfuC>j3 delta 423 zcmV;Y0a*Ue1Hl83B!7rWL_t(|ob8&+5`!QNMWIvw|ASrFg%x867y?3Ca;6JM5t$pw z%Q|NmhGEQ#AH4wQw)H&r%Y%=2X!1JVgP*Thnm&v+013G#w$=INyadmq!5y|#J6@v~ zK;f6~&t28rZ2$=y2#qIiSBd%^P&6!@QLlSIWPrTmu5|10c7L&s>OD`O!Ud7)^nCSV zm48R~fHVz_gJJ3!JB$;A73W%!0pdWH0?92?e|oM4;Hw|TmLUMNuLZb};ok^+|xiwFd1}a)rFBE)`xpff&pC(>OcSi33 zPQ<&-toCh`ir8`YG?Q(ksdQ&h4}&!Q)A~Sx3z{1R{~!y>Kz^Aq48t%Q@d5O+z+!)U RBVhml002ovPDHLkV1lt6!6pCz diff --git a/tests/zemu/snapshots/nanos_eip191_opensea/00008.png b/tests/zemu/snapshots/nanos_eip191_opensea/00008.png index f5c2d6774a86d59f5cad0974eb03748765433d08..d5c4fde635b43d9bdf246bf35def68777080c917 100644 GIT binary patch delta 400 zcmV;B0dM}71F8d%B!6*9L_t(|ob8&;5`-WKfN5uY{|D~S9=35Dew3U@j5qtw6W#j>_L0#)jJ0!Jzyd@JMzT~DnvRN-r;EW{ z2G3z_wQsW!n}6M@XfG4VrIsfZvaeCJGpgy8vTtpYsdFQ>9?Qb=baqzTM%Cs%jP8co zqw%R>xmzm$v@_b)D+R6|_F=66RNLMD7##qqdC7i1kUlD)0l=-^L_t(|ob8!G5`!QNMT1lCe_$7OK_`t6FajEcyp>f)>HkTP z0ALt~Va$rt9st0;{g2)H`{`D#;Y`N99SoR{kM;l}Xa>aI_!PlJf!F8CqCEfr;Dn~2 z#CYI67y@krsHRh*Z2$;77X{;(33tDmYc&D9U$Wf)T#sV`+WTVz^Qo=ISYs`0?ozXTD= zg%{*$&h`n6Q%*!K%L9vjA?<}S_3O~y51_40w#ON-)XL64x@JligSXK^F9>U5TpZCD zR;l1-dd45KJ$3D%x0-pyBlNc)fY48@)K%(1ej}ma6_3!d0Z1I_R5%~Jv6Lw%*j1$7 z_ge=gC`Cq;eEm6nY`nvxN8cIXLpu}HnKSv_1-z4eh0&f~d#fFnpgGW92RzBBy;Z|7 aj8eX+dC!iXSYf>Y0000%XWSoJMrBXj>p;ob#c|nYktWRuGe4l zu?5)6cx!W;o!k2w39=|MHnvru!LTUgW(Tw-?aBpFqE99UM1LEgl-yopnBstCJ12u< z0w@9Iz}CU0!IDEop4EB)6xCtmFK!&l;sDbS)LK?^2p1+~wQaD>Ru`uQw=B$MX*gDw z^bV9Kw!Xpb9TlQhSRHvg2S5s^f!2P7yfXTS7;UTxJb?6pC69_i;kYpJ93PNczEXYH zooDizySN3FU~3FQOp})}aZ1i`_aG8u#A}8sDUY;UMWCxU9A9%v$Axvg8xiqKTOVFDnNs=TCfH^_}!yz*BZkv^2=?Hdxc{A*JQ7n8RtPp zK=N5{Easxhaf*%Yv5kPk2P1#Has1IRPeHBs$cs9T66OLVbARr_7zz;OoG=T?BQe() z5gxob-#-pvr56zPj+vZs*7zvc)y3?k1aOLJy=-1h0GG6GZi4}#20ekxLQ8>o4!52c z$FXo$VhXU?0M$^Bekqgf%Ka;M*^X|4Es9YCQ(xfJKmNC#+8dY%2&wT+>D^<3C%}l9*&i=H2tc({?|)zy?ZTN1^7lg`4sTUck`NG*;4~FQQ541f{MPBW8ZAAQ@iexUO;z|9 z!#8N$1hCehm)(zehB}~`pe@_;$hJtml&R-sSU7fKTONvH8q`vlOV;s>pbuq=wfqAG zV!ZW?2!Ji{&4rK7^`ABqnwkx=0OB3cBAw<0)PnLaO~=$IbYwGk(?IN%?pdC<32zRA zMptZf!gf-G4Pu-F;2!ANgeM_oK^ZzGoJ+Aa%|9r%`nf90!N9p=`vpR~%j10T-=jnF z zc>B4Yn(c!v$9@{~MHfa-KwezA^OjrIBE9u!eq(`RnTEC$>{9GoJSeW%6r?98w=6VG z1V9U1x$xFF3dLg7A*z%OFCV&0!1g&iLvsSMpe#(2G94P~d8y3v8r=YnJYnoDExgo- zBZj6RII@;aI0-2WmZ3gjT~aNyB&xLE9FO`)zkzYbwijsrqQTV*KVCVU7eGs=3$6W( zbf%pgrnPHz;17s77|CB{q2(wH@+x!Sl=rWGSylR971wTbQK2(;4`RA7$sTa%Ergza z6FD)#7wK6El`Nj=F2VYz*8_xDcD)p}$=i=u`wekaN0CB}{Wa4f0$RcPG@cEWS-k2h zmDH!ERA@oROG`7{xN;ZglI14xNO)b{^wMT!)KDk%W~003P$k8~avl1OKW8{9W>w5P-G zex~Q;JkqvTh2m&8MlV3#T>0ZIkD{dZ)}#5xg5)w!?OL+ea^GS>F_kL}5n4vQnI;2D zNx5^&M`IK$Y9v?4q+)vYA!Grz{r54vCJ+g!!n`Q+&~VF3Ri4*q2PE=>iH}@)sfZJX zmY_1SmY;B{l&n&R+briII^wa1=WFP>Xw)IS0plOruHgQn!PJWmubj>cpq0~w_I^e@ zGR}|S?OGpj1F!}oxm6Wfj*B4Awgz7QwApcw#%$r0@oK_M5_FX2x=>VTuw(DAD$0Juwjz37DF@qWCA=5p)#-Jt41vvO&XnEI zClQ_jN;{JaYumim^0e4dTCm310RR910KngT0Ju6Fb@P;L+yDRo07*qoM6N<$f~J(a A&;S4c literal 0 HcmV?d00001 diff --git a/tests/zemu/snapshots/nanos_eip191_opensea/00013.png b/tests/zemu/snapshots/nanos_eip191_opensea/00013.png new file mode 100644 index 0000000000000000000000000000000000000000..f872acc966fb2563e1c5de855b72147ebcc2c609 GIT binary patch literal 462 zcmV;<0WtoGP)5-k@+yjy`wJ`M`q`W za>JdciaicN>)1L%yG&qX-_)T2gWm93*rdw@$2T@ zk8icZ9xwPXEyxO|-uRjal~>L`^Z@@a3b4%#Ky=YQ-OB4UhlUwIt}UFnD5r8#XLm2r zWOKdpsuW61+O1XS-JRvTRTIW&cTGWmLk>WaB+38s0k}YQ_Qk-wEC2ui07*qoM6N<$ Ef-xf10{{R3 literal 0 HcmV?d00001 diff --git a/tests/zemu/snapshots/nanos_eip191_opensea/00014.png b/tests/zemu/snapshots/nanos_eip191_opensea/00014.png new file mode 100644 index 0000000000000000000000000000000000000000..f5c2d6774a86d59f5cad0974eb03748765433d08 GIT binary patch literal 407 zcmV;I0cie-P)H|@ zz8wshkB{~MB4`H0-uM*3M1j}m%A!300N{kCpu~9KJs1LQ1E{7`qHO>OJQ#XfRy9Bv z^==(ieYk597RD@{OEdS6GT+Lmuf_h$vek1^KVM4p7nbmHWt7bot=9>X{;(33tDmYc z&D9U$Wf)T#sV`+WTVz^Qo=ISYs`0?ozXTD=g%{*$&h`n6Q%*!K%L9vjA?<}S_3O~y z51_40w#ON-)XL64x@JligSXK^F9>U5TpZCDR;l1-dd45KJ?)^knt8<|^tT^?&`+$? zRq8>0Bcb3GkI=CJNF3=@I3K*Rlqo0JRixhcTL&d5MMji-{W*PXyu+hM-x=UTI}_BI zGx^;Gypw%}(Vkv=s~wl1InZ7QJjtlNRl_ihQog8p&yJp0VZ8tV002ovPDHLkV1iJ- Bw$=au literal 0 HcmV?d00001 diff --git a/tests/zemu/snapshots/nanos_eip191_opensea/00015.png b/tests/zemu/snapshots/nanos_eip191_opensea/00015.png new file mode 100644 index 0000000000000000000000000000000000000000..d55782f429e629a5ae929916914befa14613edba GIT binary patch literal 449 zcmV;y0Y3hTP)9Z)nZ zoKdfPKxBZtOD`O!Ud7)^nCSVm48R~fHVz_gJJ3!JB$;A z73W%!0pdWH0?92?e|oM4;Hw|TH|@ zz8wshkB{~MB4`H0-uM*3M1j}m%A!300N{kCpu~9KJs1LQ1E{7`qHO>OJQ#XfRy9Bv z^==(ieYk597RD@{OEdS6GT+Lmuf_h$vek1^KVM4p7nbmHWt7bot=9>X{;(33tDmYc z&D9U$Wf)T#sV`+WTVz^Qo=ISYs`0?ozXTD=g%{*$&h`n6Q%*!K%L9vjA?<}S_3O~y z51_40w#ON-)XL64x@JligSXK^F9>U5TpZCDR;l1-dd45KJ?)^knt8<|^tT^?&`+$? zRq8>0Bcb3GkI=CJNF3=@I3K*Rlqo0JRixhcTL&d5MMji-{W*PXyu+hM-x=UTI}_BI zGx^;Gypw%}(Vkv=s~wl1InZ7QJjtlNRl_ihQog8p&yJp0VZ8tV002ovPDHLkV1iJ- Bw$=au literal 0 HcmV?d00001 diff --git a/tests/zemu/snapshots/nanos_eip191_opensea/00017.png b/tests/zemu/snapshots/nanos_eip191_opensea/00017.png new file mode 100644 index 0000000000000000000000000000000000000000..ce795f34e8569e986af689fded3b59c9a8af2961 GIT binary patch literal 349 zcmV-j0iyniP)O41}p;-~WL<=z+0=1Om1tEU@3H#qtw22}5*_5JCvCo4!52c$FXo$VhXU?0M$^Bekqgf%Ka;M*^X|4 zEs9YCQ(xfJKmNC#+8dY%2&wT+>D^<3C%}_*k1^mvtO~`RE00000NkvXXu0mjf-kqOA literal 0 HcmV?d00001 diff --git a/tests/zemu/src/eip191.test.js b/tests/zemu/src/eip191.test.js index c7f25bd..c54b013 100644 --- a/tests/zemu/src/eip191.test.js +++ b/tests/zemu/src/eip191.test.js @@ -56,7 +56,7 @@ nano_models.forEach(function(model) { if (model.letter == 'S') { - await sim.navigateAndCompareSnapshots('.', model.name + '_eip191_opensea', [1, 5, 1, -1, 0]); + await sim.navigateAndCompareSnapshots('.', model.name + '_eip191_opensea', [1, 5, 1, 6, 0, 1, -1, 0]); } else { From 82299217dee39037ff2624a1eef34f4af089a860 Mon Sep 17 00:00:00 2001 From: Alexandre Paillier Date: Thu, 6 Oct 2022 14:02:03 +0200 Subject: [PATCH 22/30] Fix EIP-191 changelog Wasn't in line with the latest modifications --- CHANGELOG.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b89407a..a0896f6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,7 +5,7 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](http://keepachangelog.com/) and this project adheres to [Semantic Versioning](http://semver.org/). -## [1.9.20](https://github.com/ledgerhq/app-ethereum/compare/1.9.19...1.9.20) - 2022-09-19 +## [1.9.20](https://github.com/ledgerhq/app-ethereum/compare/1.9.19...1.9.20) - 2022-XX-XX ### Added @@ -17,7 +17,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/). ### Changed -- EIP-191 improvements, now lets the user see the entire message by chunks 255 characters (LNX & LNS+), LNS still limited to the first chunk of 99 characters +- EIP-191 improvements, now lets the user see the entire message one chunk at a time (255 characters for LNX & LNS+, 99 for LNS) ## [1.9.19](https://github.com/ledgerhq/app-ethereum/compare/1.9.18...1.9.19) - 2022-06-15 From f43d9c4dc74dab4ea8ced7ab1c1d5b0e3a86330c Mon Sep 17 00:00:00 2001 From: Alexandre Paillier Date: Thu, 6 Oct 2022 14:55:13 +0200 Subject: [PATCH 23/30] Fix EIP-191 UI split --- src/common_ui.h | 9 ++++++++- src_bagl/ui_flow_signMessage.c | 4 +++- src_bagl/ui_flow_signMessage.h | 12 ------------ src_features/signMessage/cmd_signMessage.c | 2 +- 4 files changed, 12 insertions(+), 15 deletions(-) delete mode 100644 src_bagl/ui_flow_signMessage.h diff --git a/src/common_ui.h b/src/common_ui.h index 9b65600..3bca6b9 100644 --- a/src/common_ui.h +++ b/src/common_ui.h @@ -18,7 +18,14 @@ void ui_stark_limit_order(void); void ui_stark_unsafe_sign(void); void ui_stark_transfer(bool selfTransfer, bool conditional); +// EIP-191 +void ui_191_start(void); +void ui_191_switch_to_message(void); +void ui_191_switch_to_message_end(void); +void ui_191_switch_to_sign(void); +void ui_191_switch_to_question(void); + #include "ui_callbacks.h" #include -#endif // _COMMON_UI_H_ \ No newline at end of file +#endif // _COMMON_UI_H_ diff --git a/src_bagl/ui_flow_signMessage.c b/src_bagl/ui_flow_signMessage.c index 545c221..9b97d57 100644 --- a/src_bagl/ui_flow_signMessage.c +++ b/src_bagl/ui_flow_signMessage.c @@ -1,8 +1,10 @@ #include "shared_context.h" #include "ui_callbacks.h" -#include "ui_flow_signMessage.h" +#include "common_ui.h" #include "sign_message.h" +typedef enum { UI_191_POS_REVIEW, UI_191_POS_QUESTION, UI_191_POS_END } e_ui_191_position; + static uint8_t ui_pos; static void dummy_pre_cb(void) { diff --git a/src_bagl/ui_flow_signMessage.h b/src_bagl/ui_flow_signMessage.h deleted file mode 100644 index 69e047b..0000000 --- a/src_bagl/ui_flow_signMessage.h +++ /dev/null @@ -1,12 +0,0 @@ -#ifndef UI_FLOW_SIGNMESSAGE_H_ -#define UI_FLOW_SIGNMESSAGE_H_ - -typedef enum { UI_191_POS_REVIEW, UI_191_POS_QUESTION, UI_191_POS_END } e_ui_191_position; - -void ui_191_start(void); -void ui_191_switch_to_message(void); -void ui_191_switch_to_message_end(void); -void ui_191_switch_to_sign(void); -void ui_191_switch_to_question(void); - -#endif // UI_FLOW_SIGNMESSAGE_H_ diff --git a/src_features/signMessage/cmd_signMessage.c b/src_features/signMessage/cmd_signMessage.c index 1c764b1..9cfd4d6 100644 --- a/src_features/signMessage/cmd_signMessage.c +++ b/src_features/signMessage/cmd_signMessage.c @@ -3,7 +3,7 @@ #include #include "apdu_constants.h" #include "sign_message.h" -#include "ui_flow_signMessage.h" +#include "common_ui.h" static uint8_t processed_size; static struct { From 4c78d485a15c52c31f5f5f143d7bfa885cfa6350 Mon Sep 17 00:00:00 2001 From: Jorge Martins Date: Fri, 7 Oct 2022 16:40:27 +0200 Subject: [PATCH 24/30] Abort signing process ETH_PLUGIN_QUERY_* Before was not possible to abort the signing process even if the plugin return an error code. According to the docs any return code besides ETH_PLUGIN_RESULT_OK should abort the signing process. --- src/eth_plugin_handler.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/eth_plugin_handler.c b/src/eth_plugin_handler.c index e5187ca..22ffbe8 100644 --- a/src/eth_plugin_handler.c +++ b/src/eth_plugin_handler.c @@ -348,13 +348,13 @@ eth_plugin_result_t eth_plugin_call(int method, void *parameter) { } break; case ETH_PLUGIN_QUERY_CONTRACT_ID: - if (((ethQueryContractID_t *) parameter)->result <= ETH_PLUGIN_RESULT_UNSUCCESSFUL) { - return ETH_PLUGIN_RESULT_UNAVAILABLE; + if (((ethQueryContractID_t *) parameter)->result != ETH_PLUGIN_RESULT_OK) { + return ETH_PLUGIN_RESULT_ERROR; } break; case ETH_PLUGIN_QUERY_CONTRACT_UI: - if (((ethQueryContractUI_t *) parameter)->result <= ETH_PLUGIN_RESULT_UNSUCCESSFUL) { - return ETH_PLUGIN_RESULT_UNAVAILABLE; + if (((ethQueryContractUI_t *) parameter)->result != ETH_PLUGIN_RESULT_OK) { + return ETH_PLUGIN_RESULT_ERROR; } break; default: From c09e17a3e872989f309562007836a047ea20f26d Mon Sep 17 00:00:00 2001 From: Edouard Merle Date: Mon, 10 Oct 2022 14:43:40 +0200 Subject: [PATCH 25/30] fix: allow swap feature on all ETH variants --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index c680321..67b19d4 100644 --- a/Makefile +++ b/Makefile @@ -36,7 +36,7 @@ APPVERSION_M=1 APPVERSION_N=9 APPVERSION_P=20 APPVERSION=$(APPVERSION_M).$(APPVERSION_N).$(APPVERSION_P)-dev -APP_LOAD_FLAGS= --appFlags 0x240 --dep Ethereum:$(APPVERSION) +APP_LOAD_FLAGS= --appFlags 0xa40 --dep Ethereum:$(APPVERSION) ########################### # Set Chain environnement # From 3da1e2fd863402b8bae85deb7609ee89affd2e65 Mon Sep 17 00:00:00 2001 From: Alexandre Paillier Date: Mon, 10 Oct 2022 14:05:46 +0200 Subject: [PATCH 26/30] Updated changelog --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index a0896f6..8d690ae 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,6 +19,10 @@ and this project adheres to [Semantic Versioning](http://semver.org/). - EIP-191 improvements, now lets the user see the entire message one chunk at a time (255 characters for LNX & LNS+, 99 for LNS) +### Fixed + +- Allow swap with variants + ## [1.9.19](https://github.com/ledgerhq/app-ethereum/compare/1.9.18...1.9.19) - 2022-06-15 ### Added From e34a9f55e9d2c487f0200a3147ecbd21d9208952 Mon Sep 17 00:00:00 2001 From: Alexandre Paillier Date: Mon, 10 Oct 2022 15:18:37 +0200 Subject: [PATCH 27/30] Changelog update + removed -dev version suffix --- CHANGELOG.md | 6 +++++- Makefile | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8d690ae..79d9d0b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,7 +5,7 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](http://keepachangelog.com/) and this project adheres to [Semantic Versioning](http://semver.org/). -## [1.9.20](https://github.com/ledgerhq/app-ethereum/compare/1.9.19...1.9.20) - 2022-XX-XX +## [1.9.20](https://github.com/ledgerhq/app-ethereum/compare/1.9.19...1.9.20) - 2022-10-10 ### Added @@ -23,6 +23,10 @@ and this project adheres to [Semantic Versioning](http://semver.org/). - Allow swap with variants +### Removed + +- Compound support (will become its own plugin) + ## [1.9.19](https://github.com/ledgerhq/app-ethereum/compare/1.9.18...1.9.19) - 2022-06-15 ### Added diff --git a/Makefile b/Makefile index 67b19d4..eedf848 100644 --- a/Makefile +++ b/Makefile @@ -35,7 +35,7 @@ APP_LOAD_PARAMS += --path "1517992542'/1101353413'" APPVERSION_M=1 APPVERSION_N=9 APPVERSION_P=20 -APPVERSION=$(APPVERSION_M).$(APPVERSION_N).$(APPVERSION_P)-dev +APPVERSION=$(APPVERSION_M).$(APPVERSION_N).$(APPVERSION_P) APP_LOAD_FLAGS= --appFlags 0xa40 --dep Ethereum:$(APPVERSION) ########################### From 2dd757786d749cc2ca03125b85544bc1cb3e8d68 Mon Sep 17 00:00:00 2001 From: Clement Bouvet Date: Thu, 13 Oct 2022 12:59:57 +0200 Subject: [PATCH 28/30] commonise plugins --- src_bagl/ui_flow_signTx.c | 1 + src_bagl/ui_plugin.c | 29 +--------------------------- src_bagl/ui_plugin.h | 2 -- src_common/plugins.c | 40 +++++++++++++++++++++++++++++++++++++++ src_common/plugins.h | 11 +++++++++++ 5 files changed, 53 insertions(+), 30 deletions(-) create mode 100644 src_common/plugins.c create mode 100644 src_common/plugins.h diff --git a/src_bagl/ui_flow_signTx.c b/src_bagl/ui_flow_signTx.c index 6d05d6d..574dd9c 100644 --- a/src_bagl/ui_flow_signTx.c +++ b/src_bagl/ui_flow_signTx.c @@ -7,6 +7,7 @@ #include "eth_plugin_handler.h" #include "ui_plugin.h" #include "common_ui.h" +#include "plugins.h" // clang-format off UX_STEP_NOCB( diff --git a/src_bagl/ui_plugin.c b/src_bagl/ui_plugin.c index ed3f52f..c3743fa 100644 --- a/src_bagl/ui_plugin.c +++ b/src_bagl/ui_plugin.c @@ -3,38 +3,11 @@ #include "eth_plugin_handler.h" #include "ui_callbacks.h" #include "ui_plugin.h" +#include "plugins.h" // This function is not exported by the SDK void ux_layout_paging_redisplay_by_addr(unsigned int stack_slot); -void plugin_ui_get_id() { - ethQueryContractID_t pluginQueryContractID; - eth_plugin_prepare_query_contract_ID(&pluginQueryContractID, - strings.common.fullAddress, - sizeof(strings.common.fullAddress), - strings.common.fullAmount, - sizeof(strings.common.fullAmount)); - // Query the original contract for ID if it's not an internal alias - if (!eth_plugin_call(ETH_PLUGIN_QUERY_CONTRACT_ID, (void *) &pluginQueryContractID)) { - PRINTF("Plugin query contract ID call failed\n"); - io_seproxyhal_touch_tx_cancel(NULL); - } -} - -void plugin_ui_get_item() { - ethQueryContractUI_t pluginQueryContractUI; - eth_plugin_prepare_query_contract_UI(&pluginQueryContractUI, - dataContext.tokenContext.pluginUiCurrentItem, - strings.common.fullAddress, - sizeof(strings.common.fullAddress), - strings.common.fullAmount, - sizeof(strings.common.fullAmount)); - if (!eth_plugin_call(ETH_PLUGIN_QUERY_CONTRACT_UI, (void *) &pluginQueryContractUI)) { - PRINTF("Plugin query contract UI call failed\n"); - io_seproxyhal_touch_tx_cancel(NULL); - } -} - void display_next_plugin_item(bool entering) { if (entering) { if (dataContext.tokenContext.pluginUiState == PLUGIN_UI_OUTSIDE) { diff --git a/src_bagl/ui_plugin.h b/src_bagl/ui_plugin.h index ae86b6a..2f9fe60 100644 --- a/src_bagl/ui_plugin.h +++ b/src_bagl/ui_plugin.h @@ -1,8 +1,6 @@ #ifndef _UI_PLUGIN_H_ #define _UI_PLUGIN_H_ -void plugin_ui_get_id(); -void plugin_ui_get_item(); void display_next_plugin_item(bool entering); #endif // _UI_PLUGIN_H_ diff --git a/src_common/plugins.c b/src_common/plugins.c new file mode 100644 index 0000000..42c17a9 --- /dev/null +++ b/src_common/plugins.c @@ -0,0 +1,40 @@ +#include "eth_plugin_handler.h" +#include "ui_callbacks.h" + +void plugin_ui_get_id(void) { + ethQueryContractID_t pluginQueryContractID; + eth_plugin_prepare_query_contract_ID(&pluginQueryContractID, + strings.common.fullAddress, + sizeof(strings.common.fullAddress), + strings.common.fullAmount, + sizeof(strings.common.fullAmount)); + // Query the original contract for ID if it's not an internal alias + if (!eth_plugin_call(ETH_PLUGIN_QUERY_CONTRACT_ID, (void *) &pluginQueryContractID)) { + PRINTF("Plugin query contract ID call failed\n"); + io_seproxyhal_touch_tx_cancel(NULL); + } +} + +void plugin_ui_get_item_internal(char *title_buffer, + size_t title_buffer_size, + char *msg_buffer, + size_t msg_buffer_size) { + ethQueryContractUI_t pluginQueryContractUI; + eth_plugin_prepare_query_contract_UI(&pluginQueryContractUI, + dataContext.tokenContext.pluginUiCurrentItem, + title_buffer, + title_buffer_size, + msg_buffer, + msg_buffer_size); + if (!eth_plugin_call(ETH_PLUGIN_QUERY_CONTRACT_UI, (void *) &pluginQueryContractUI)) { + PRINTF("Plugin query contract UI call failed\n"); + io_seproxyhal_touch_tx_cancel(NULL); + } +} + +void plugin_ui_get_item(void) { + plugin_ui_get_item_internal(strings.common.fullAddress, + sizeof(strings.common.fullAddress), + strings.common.fullAmount, + sizeof(strings.common.fullAmount)); +} \ No newline at end of file diff --git a/src_common/plugins.h b/src_common/plugins.h new file mode 100644 index 0000000..1ccc123 --- /dev/null +++ b/src_common/plugins.h @@ -0,0 +1,11 @@ +#ifndef _PLUGIN_H_ +#define _PLUGIN_H_ + +void plugin_ui_get_id(); +void plugin_ui_get_item(); +void plugin_ui_get_item_internal(uint8_t *title_buffer, + size_t title_buffer_size, + uint8_t *msg_buffer, + size_t msg_buffer_size); + +#endif // _PLUGIN_H_ \ No newline at end of file From 51e4ab2a6f0f4669988de1f3fdbc114846668550 Mon Sep 17 00:00:00 2001 From: Clement Bouvet Date: Fri, 14 Oct 2022 10:35:06 +0200 Subject: [PATCH 29/30] move some stack utility functions to common --- src_bagl/ui_flow_stark_sign.c | 13 +------------ src_common/starkDisplayUtils.c | 17 +++++++++++++++++ src_common/starkDisplayUtils.h | 6 ++++++ 3 files changed, 24 insertions(+), 12 deletions(-) create mode 100644 src_common/starkDisplayUtils.c create mode 100644 src_common/starkDisplayUtils.h diff --git a/src_bagl/ui_flow_stark_sign.c b/src_bagl/ui_flow_stark_sign.c index df3c6a1..548e880 100644 --- a/src_bagl/ui_flow_stark_sign.c +++ b/src_bagl/ui_flow_stark_sign.c @@ -3,18 +3,7 @@ #include "shared_context.h" #include "ui_callbacks.h" #include "ethUtils.h" - -void stark_sign_display_master_account() { - snprintf(strings.tmp.tmp, - sizeof(strings.tmp.tmp), - "0x%.*H", - 32, - dataContext.starkContext.transferDestination); -} - -void stark_sign_display_condition_fact() { - snprintf(strings.tmp.tmp, sizeof(strings.tmp.tmp), "0x%.*H", 32, dataContext.starkContext.fact); -} +#include "starkDisplayUtils.h" // clang-format off UX_STEP_NOCB(ux_stark_limit_order_1_step, diff --git a/src_common/starkDisplayUtils.c b/src_common/starkDisplayUtils.c new file mode 100644 index 0000000..a59ae99 --- /dev/null +++ b/src_common/starkDisplayUtils.c @@ -0,0 +1,17 @@ +#ifdef HAVE_STARKWARE + +#include "shared_context.h" + +void stark_sign_display_master_account() { + snprintf(strings.tmp.tmp, + sizeof(strings.tmp.tmp), + "0x%.*H", + 32, + dataContext.starkContext.transferDestination); +} + +void stark_sign_display_condition_fact() { + snprintf(strings.tmp.tmp, sizeof(strings.tmp.tmp), "0x%.*H", 32, dataContext.starkContext.fact); +} + +#endif \ No newline at end of file diff --git a/src_common/starkDisplayUtils.h b/src_common/starkDisplayUtils.h new file mode 100644 index 0000000..48399b8 --- /dev/null +++ b/src_common/starkDisplayUtils.h @@ -0,0 +1,6 @@ +#ifdef HAVE_STARKWARE + +void stark_sign_display_master_account(); +void stark_sign_display_condition_fact(); + +#endif \ No newline at end of file From d2659ed33273ea2130e187611eb674ae25e3e641 Mon Sep 17 00:00:00 2001 From: Alexandre Paillier Date: Fri, 14 Oct 2022 17:40:14 +0200 Subject: [PATCH 30/30] Version bump to 1.10.0 --- CHANGELOG.md | 2 ++ Makefile | 6 +++--- tests/speculos/test_configuration_cmd.py | 8 ++++---- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 79d9d0b..c6ba0c9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,8 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](http://keepachangelog.com/) and this project adheres to [Semantic Versioning](http://semver.org/). +## [1.10.0](https://github.com/ledgerhq/app-ethereum/compare/1.9.20...1.10.0) - 2022-XX-XX + ## [1.9.20](https://github.com/ledgerhq/app-ethereum/compare/1.9.19...1.9.20) - 2022-10-10 ### Added diff --git a/Makefile b/Makefile index eedf848..b14e367 100644 --- a/Makefile +++ b/Makefile @@ -33,9 +33,9 @@ APP_LOAD_PARAMS += --path "1517992542'/1101353413'" ################## APPVERSION_M=1 -APPVERSION_N=9 -APPVERSION_P=20 -APPVERSION=$(APPVERSION_M).$(APPVERSION_N).$(APPVERSION_P) +APPVERSION_N=10 +APPVERSION_P=0 +APPVERSION=$(APPVERSION_M).$(APPVERSION_N).$(APPVERSION_P)-dev APP_LOAD_FLAGS= --appFlags 0xa40 --dep Ethereum:$(APPVERSION) ########################### diff --git a/tests/speculos/test_configuration_cmd.py b/tests/speculos/test_configuration_cmd.py index 6f9e5e0..de41bde 100644 --- a/tests/speculos/test_configuration_cmd.py +++ b/tests/speculos/test_configuration_cmd.py @@ -1,10 +1,10 @@ def test_configuration(cmd): if cmd.model == "nanos": - assert cmd.get_configuration() == (14, 1, 9, 20) - + assert cmd.get_configuration() == (14, 1, 10, 0) + if cmd.model == "nanox": - assert cmd.get_configuration() == (14, 1, 9, 20) + assert cmd.get_configuration() == (14, 1, 10, 0) if cmd.model == "nanosp": - assert cmd.get_configuration() == (14, 1, 9, 20) \ No newline at end of file + assert cmd.get_configuration() == (14, 1, 10, 0)