Return to Exchange when failing to sign in swap mode

This commit is contained in:
Francois Beutin
2023-12-01 19:50:07 +01:00
parent 93712e2928
commit 60d1d97667
4 changed files with 28 additions and 0 deletions

View File

@@ -80,6 +80,7 @@ void handle_swap_sign_transaction(chain_config_t* config) {
chainConfig = config;
reset_app_context();
G_called_from_swap = true;
G_swap_response_ready = false;
io_seproxyhal_init();
if (N_storage.initialized != 0x01) {

View File

@@ -53,6 +53,7 @@ cx_sha3_t global_sha3;
uint8_t appState;
uint16_t apdu_response_code;
bool G_called_from_swap;
bool G_swap_response_ready;
pluginType_t pluginType;
#ifdef HAVE_STARKWARE
bool quantumSet;
@@ -78,6 +79,7 @@ void reset_app_context() {
// PRINTF("!!RESET_APP_CONTEXT\n");
appState = APP_STATE_IDLE;
G_called_from_swap = false;
G_swap_response_ready = false;
pluginType = OLD_INTERNAL;
#ifdef HAVE_STARKWARE
quantumSet = false;
@@ -456,6 +458,7 @@ void handleApdu(unsigned int *flags, unsigned int *tx) {
THROW(EXCEPTION_IO_RESET);
}
CATCH_OTHER(e) {
bool quit_now = G_called_from_swap && G_swap_response_ready;
switch (e & 0xF000) {
case 0x6000:
// Wipe the transaction context and report the exception
@@ -476,6 +479,18 @@ void handleApdu(unsigned int *flags, unsigned int *tx) {
G_io_apdu_buffer[*tx] = sw >> 8;
G_io_apdu_buffer[*tx + 1] = sw;
*tx += 2;
// If we are in swap mode and have validated a TX, we send it and immediately quit
if (quit_now) {
if (io_exchange(CHANNEL_APDU | IO_RETURN_AFTER_TX, *tx) == 0) {
// In case of success, the apdu is sent immediatly and eth exits
// Reaching this code means we encountered an error
finalize_exchange_sign_transaction(false);
} else {
PRINTF("Unrecoverable\n");
os_sched_exit(-1);
}
}
}
FINALLY {
}

View File

@@ -215,6 +215,7 @@ extern cx_sha3_t global_sha3;
extern const internalStorage_t N_storage_real;
extern bool G_called_from_swap;
extern bool G_swap_response_ready;
typedef enum {
EXTERNAL, // External plugin, set by setExternalPlugin.