diff --git a/app/src/apdu_handler.c b/app/src/apdu_handler.c index d8ea8b66..e105c7c8 100644 --- a/app/src/apdu_handler.c +++ b/app/src/apdu_handler.c @@ -213,11 +213,6 @@ __Z_INLINE void handleSign(volatile uint32_t *flags, volatile uint32_t *tx, uint const int error_msg_length = strnlen(error_msg, sizeof(G_io_apdu_buffer)); MEMCPY(G_io_apdu_buffer, error_msg, error_msg_length); *tx += (error_msg_length); - -#ifdef HAVE_SWAP - // Finalize the transaction with failure status - finalize_exchange_sign_transaction(false); -#endif THROW(APDU_CODE_DATA_INVALID); } diff --git a/app/src/parser.c b/app/src/parser.c index f0192bf9..3ed16dd7 100644 --- a/app/src/parser.c +++ b/app/src/parser.c @@ -87,7 +87,10 @@ parser_error_t parser_getNumItems(const parser_context_t *ctx, uint8_t *num_item return parser_ok; } - return tx_display_numItems(num_items); + parser_error_t ret = tx_display_numItems(num_items); + ctx->tx_obj->tx_json.num_items = *num_items; + + return ret; } __Z_INLINE bool parser_areEqual(uint16_t tokenIdx, const char *expected) { diff --git a/app/src/parser_txdef.h b/app/src/parser_txdef.h index c3c75146..fc9787ad 100644 --- a/app/src/parser_txdef.h +++ b/app/src/parser_txdef.h @@ -95,6 +95,7 @@ typedef struct // current tx query tx_query_t query; + uint8_t num_items; }tx_json_t; diff --git a/app/src/swap/handle_sign_transaction.c b/app/src/swap/handle_sign_transaction.c index 45920a9c..f528ed5a 100644 --- a/app/src/swap/handle_sign_transaction.c +++ b/app/src/swap/handle_sign_transaction.c @@ -21,6 +21,7 @@ #include "swap.h" #include "swap_utils.h" #include "zxformat.h" +#include "app_mode.h" swap_globals_t G_swap_state; @@ -79,8 +80,43 @@ bool copy_transaction_parameters(create_transaction_parameters_t *sign_transacti return true; } -// Ensure the received transaction matches what was validated in the Exchange app UI -// at this point, transaction was parsed by the app, so we need to compare what we parsed with what is saved in the global state +/* + * This function verifies that a received transaction follows the expected format + * based on the current application mode (expert or normal). The verification + * process includes checking the number of items in the transaction and validating + * that the items at its respective display index matches the expected content. + * If any item does not meet the expected criteria, the function will return an error. + * + * Expected transaction format: + * + * Expert Mode: + * 0 | Chain ID : cosmoshub-4 + * 1 | Account : 0 + * 2 | Sequence : 1 + * 3 | Source Address : cosmosaccaddr1d9h8qat5e4ehc5 + * 4 | Source Coins : 10 atom + * 5 | Dest Address : cosmosaccaddr1da6hgur4wse3jx32 + * 6 | Dest Coins : 10 atom + * 7 | Memo : testmemo + * 8 | Fee : 5 photon + * 9 | Gas : 10000 + * + * Normal Mode: + * 0 | Source Address : cosmosaccaddr1d9h8qat5e4ehc5 + * 1 | Source Coins : 10 atom + * 2 | Dest Address : cosmosaccaddr1da6hgur4wse3jx32 + * 3 | Dest Coins : 10 atom + * 4 | Memo : testmemo + * 5 | Fee : 5 photon + * + * Verification Details: + * - The function will first confirm that the number of items in the transaction + * matches the expected count for the current mode. + * - Each item's content will be checked against the predefined values for the + * corresponding display index. + * - If any discrepancy is found (either in item count or content), the function + * will return an error. + */ parser_error_t check_swap_conditions(parser_context_t *ctx_parsed_tx) { parser_error_t err = parser_unexpected_error; if (ctx_parsed_tx == NULL) { @@ -93,6 +129,10 @@ parser_error_t check_swap_conditions(parser_context_t *ctx_parsed_tx) { char tmpKey[20] = {0}; char tmpValue[65] = {0}; + if ((app_mode_expert() && ctx_parsed_tx->tx_obj->tx_json.num_items != EXPERT_MODE_ITEMS) || (!app_mode_expert() && ctx_parsed_tx->tx_obj->tx_json.num_items != NORMAL_MODE_ITEMS)) { + return parser_unexpected_error; + } + // Cosmos App in normal mode requires that chain id is the default one. If not, it will print expert mode fields // this means if we reach this point and no chain_id is printed, chain_id must be the default one const char *default_chain_id = "cosmoshub-4"; diff --git a/app/src/swap/swap.h b/app/src/swap/swap.h index 23df1259..a66c5986 100644 --- a/app/src/swap/swap.h +++ b/app/src/swap/swap.h @@ -26,6 +26,8 @@ #define ADDRESS_MAXSIZE 50 #define MEMO_MAXSIZE 50 +#define EXPERT_MODE_ITEMS 10 +#define NORMAL_MODE_ITEMS 6 typedef struct { uint8_t amount[COIN_AMOUNT_MAXSIZE]; uint8_t amount_length;