From d70ac623a46e0177d8f2ce7e124c4b4d12e01e58 Mon Sep 17 00:00:00 2001 From: Jochen Hoenicke Date: Sat, 8 Apr 2017 22:36:32 +0200 Subject: [PATCH] Small bugfixes in signing Segwit progress bar fixed. Call `signing_abort` instead of `layoutHome` on all errors The second `compile_output` does not work for user button and cannot return -1. --- firmware/signing.c | 27 ++++++++++++--------------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/firmware/signing.c b/firmware/signing.c index 91c4bfd548..d4921e03e3 100644 --- a/firmware/signing.c +++ b/firmware/signing.c @@ -47,6 +47,7 @@ enum { STAGE_REQUEST_SEGWIT_WITNESS } signing_stage; static uint32_t idx1, idx2; +static uint32_t signatures; static TxRequest resp; static TxInputType input; static TxOutputBinType bin_output; @@ -389,6 +390,7 @@ void signing_init(uint32_t _inputs_count, uint32_t _outputs_count, const CoinTyp version = _version; lock_time = _lock_time; + signatures = 0; idx1 = 0; to_spend = 0; spending = 0; @@ -512,7 +514,7 @@ static bool signing_check_output(TxOutputType *txoutput) { if (spending + txoutput->amount < spending) { fsm_sendFailure(FailureType_Failure_Other, "Value overflow"); signing_abort(); - return false; + return false; } spending += txoutput->amount; int co = compile_output(coin, root, txoutput, &bin_output, !is_change); @@ -537,7 +539,7 @@ static bool signing_check_fee(void) { // check fees if (spending > to_spend) { fsm_sendFailure(FailureType_Failure_NotEnoughFunds, "Not enough funds"); - layoutHome(); + signing_abort(); return false; } uint64_t fee = to_spend - spending; @@ -546,7 +548,7 @@ static bool signing_check_fee(void) { layoutFeeOverThreshold(coin, fee, tx_est_size); if (!protectButton(ButtonRequestType_ButtonRequest_FeeOverThreshold, false)) { fsm_sendFailure(FailureType_Failure_ActionCancelled, "Fee over threshold. Signing cancelled."); - layoutHome(); + signing_abort(); return false; } layoutProgress("Signing transaction", progress); @@ -738,7 +740,6 @@ void signing_txack(TransactionType *tx) update_ctr = 0; } - int co; memset(&resp, 0, sizeof(TxRequest)); switch (signing_stage) { @@ -846,7 +847,7 @@ void signing_txack(TransactionType *tx) phase1_request_next_output(); return; case STAGE_REQUEST_4_INPUT: - progress = 500 + ((idx1 * progress_step + idx2 * progress_meta_step) >> PROGRESS_PRECISION); + progress = 500 + ((signatures * progress_step + idx2 * progress_meta_step) >> PROGRESS_PRECISION); if (idx2 == 0) { tx_init(&ti, inputs_count, outputs_count, version, lock_time, 0, true); sha256_Init(&hashers[0]); @@ -893,13 +894,8 @@ void signing_txack(TransactionType *tx) } return; case STAGE_REQUEST_4_OUTPUT: - progress = 500 + ((idx1 * progress_step + (inputs_count + idx2) * progress_meta_step) >> PROGRESS_PRECISION); - co = compile_output(coin, root, tx->outputs, &bin_output, false); - if (co < 0) { - fsm_sendFailure(FailureType_Failure_Other, "Signing cancelled by user"); - signing_abort(); - return; - } else if (co == 0) { + progress = 500 + ((signatures * progress_step + (inputs_count + idx2) * progress_meta_step) >> PROGRESS_PRECISION); + if (compile_output(coin, root, tx->outputs, &bin_output, false) <= 0) { fsm_sendFailure(FailureType_Failure_Other, "Failed to compile output"); signing_abort(); return; @@ -919,6 +915,8 @@ void signing_txack(TransactionType *tx) return; } // since this took a longer time, update progress + signatures++; + progress = 500 + ((signatures * progress_step) >> PROGRESS_PRECISION); layoutProgress("Signing transaction", progress); update_ctr = 0; if (idx1 < inputs_count - 1) { @@ -932,8 +930,6 @@ void signing_txack(TransactionType *tx) return; case STAGE_REQUEST_SEGWIT_INPUT: - progress = 500 + ((idx1 * progress_step) >> PROGRESS_PRECISION); - resp.has_serialized = true; resp.serialized.has_signature_index = false; resp.serialized.has_signature = false; @@ -1004,7 +1000,8 @@ void signing_txack(TransactionType *tx) if (!signing_sign_segwit_input(&tx->inputs[0])) { return; } - progress = 500 + ((idx1 * progress_step) >> PROGRESS_PRECISION); + signatures++; + progress = 500 + ((signatures * progress_step) >> PROGRESS_PRECISION); layoutProgress("Signing transaction", progress); update_ctr = 0; if (idx1 < inputs_count - 1) {