1616#pragma once
1717
1818#include <os_io_seproxyhal.h>
19+ #include <stdbool.h>
1920#include <stdint.h>
2021
2122#include "apdu_codes.h"
6768
6869extern uint8_t action_addr_len ;
6970
71+ extern bool review_pending ;
72+
73+ __Z_INLINE void set_review_pending (bool val ) {
74+ review_pending = val ;
75+ }
76+
77+ __Z_INLINE bool is_review_pending (void ) {
78+ return review_pending ;
79+ }
80+
7081// helper function to get the presig_hash of the transaction being signed
7182__Z_INLINE zxerr_t get_presig_hash (uint8_t * hash , uint16_t hashLen );
7283
@@ -128,6 +139,7 @@ __Z_INLINE void app_sign() {
128139 }
129140
130141 if (err != zxerr_ok ) {
142+ set_review_pending (false);
131143 set_code (G_io_apdu_buffer , 0 , APDU_CODE_SIGN_VERIFY_ERROR );
132144 io_exchange (CHANNEL_APDU | IO_RETURN_AFTER_TX , 2 );
133145 return ;
@@ -139,6 +151,7 @@ __Z_INLINE void app_sign() {
139151 uint16_t replyLen = 0 ;
140152 err = crypto_sign (G_io_apdu_buffer , IO_APDU_BUFFER_SIZE - 3 , presig_hash , CX_SHA256_SIZE , & replyLen );
141153 if (err != zxerr_ok ) {
154+ set_review_pending (false);
142155 set_code (G_io_apdu_buffer , 0 , APDU_CODE_SIGN_VERIFY_ERROR );
143156 io_exchange (CHANNEL_APDU | IO_RETURN_AFTER_TX , 2 );
144157 return ;
@@ -180,23 +193,27 @@ __Z_INLINE void app_sign() {
180193 break ;
181194 }
182195 default : {
196+ set_review_pending (false);
183197 set_code (G_io_apdu_buffer , 0 , APDU_CODE_SIGN_VERIFY_ERROR );
184198 io_exchange (CHANNEL_APDU | IO_RETURN_AFTER_TX , 2 );
185199 return ;
186200 }
187201 }
188202
189203 if (replyLen == 0 ) {
204+ set_review_pending (false);
190205 set_code (G_io_apdu_buffer , 0 , APDU_CODE_SIGN_VERIFY_ERROR );
191206 io_exchange (CHANNEL_APDU | IO_RETURN_AFTER_TX , 2 );
192207 return ;
193208 }
194209
210+ set_review_pending (false);
195211 set_code (G_io_apdu_buffer , replyLen , APDU_CODE_OK );
196212 io_exchange (CHANNEL_APDU | IO_RETURN_AFTER_TX , replyLen + 2 );
197213}
198214
199215__Z_INLINE void app_reject () {
216+ set_review_pending (false);
200217 tx_reset_state ();
201218
202219 set_code (G_io_apdu_buffer , 0 , APDU_CODE_COMMAND_NOT_ALLOWED );
@@ -236,11 +253,13 @@ __Z_INLINE uint8_t app_fill_auth_pubkey(address_kind_e kind) {
236253}
237254
238255__Z_INLINE void app_reply_address () {
256+ set_review_pending (false);
239257 set_code (G_io_apdu_buffer , action_addr_len , APDU_CODE_OK );
240258 io_exchange (CHANNEL_APDU | IO_RETURN_AFTER_TX , action_addr_len + 2 );
241259}
242260
243261__Z_INLINE void app_reply_error () {
262+ set_review_pending (false);
244263 set_code (G_io_apdu_buffer , 0 , APDU_CODE_DATA_INVALID );
245264 io_exchange (CHANNEL_APDU | IO_RETURN_AFTER_TX , 2 );
246265}
0 commit comments