@@ -38,6 +38,8 @@ static bool tx_initialized = false;
3838uint16_t blobLen = 0 ;
3939scheme_type_e scheme = ed25519 ;
4040
41+ bool review_pending = false;
42+
4143static void extractHDPath (uint32_t rx , uint32_t offset ) {
4244 tx_initialized = false;
4345
@@ -75,11 +77,11 @@ __Z_INLINE bool process_chunk(__Z_UNUSED volatile uint32_t *tx, uint32_t rx) {
7577 extractHDPath (rx , OFFSET_DATA );
7678
7779 // check if we have blobLen available
78- if ((rx - OFFSET_DATA ) < sizeof (uint32_t ) * HDPATH_LEN_DEFAULT + sizeof (uint16_t )) {
80+ if ((rx - OFFSET_DATA ) < ( sizeof (uint32_t ) * HDPATH_LEN_DEFAULT ) + sizeof (uint16_t )) {
7981 THROW (APDU_CODE_WRONG_LENGTH );
8082 }
8183 // read blobLen, right after hdPath
82- memcpy (& blobLen , G_io_apdu_buffer + OFFSET_DATA + sizeof (uint32_t ) * HDPATH_LEN_DEFAULT , sizeof (uint16_t ));
84+ memcpy (& blobLen , G_io_apdu_buffer + OFFSET_DATA + ( sizeof (uint32_t ) * HDPATH_LEN_DEFAULT ) , sizeof (uint16_t ));
8385 tx_initialized = true;
8486 return false;
8587 case P1_ADD :
@@ -143,15 +145,18 @@ __Z_INLINE void handleGetAddr(volatile uint32_t *flags, volatile uint32_t *tx, u
143145
144146 // Get address type from P2
145147 scheme = G_io_apdu_buffer [OFFSET_P2 ];
148+ if (scheme != ed25519 && scheme != secp256k1 ) {
149+ THROW (APDU_CODE_INVALIDP1P2 );
150+ }
146151
147152 if (scheme == ed25519 ) {
148153 // check if we have ss58prefix available
149- if ((rx - OFFSET_DATA ) < sizeof (uint32_t ) * HDPATH_LEN_DEFAULT + sizeof (uint16_t )) {
154+ if ((rx - OFFSET_DATA ) < ( sizeof (uint32_t ) * HDPATH_LEN_DEFAULT ) + sizeof (uint16_t )) {
150155 THROW (APDU_CODE_WRONG_LENGTH );
151156 }
152157
153158 // read ss58prefix, right after hdPath
154- memcpy (& ss58prefix , G_io_apdu_buffer + OFFSET_DATA + sizeof (uint32_t ) * HDPATH_LEN_DEFAULT , sizeof (uint16_t ));
159+ memcpy (& ss58prefix , G_io_apdu_buffer + OFFSET_DATA + ( sizeof (uint32_t ) * HDPATH_LEN_DEFAULT ) , sizeof (uint16_t ));
155160 } else {
156161 if ((rx - OFFSET_DATA ) < sizeof (uint32_t ) * HDPATH_LEN_DEFAULT ) {
157162 THROW (APDU_CODE_WRONG_LENGTH );
@@ -169,6 +174,7 @@ __Z_INLINE void handleGetAddr(volatile uint32_t *flags, volatile uint32_t *tx, u
169174 }
170175 if (requireConfirmation ) {
171176 view_review_init (addr_getItem , addr_getNumItems , app_reply_address );
177+ set_review_pending (true);
172178 view_review_show (REVIEW_ADDRESS );
173179 * flags |= IO_ASYNCH_REPLY ;
174180 return ;
@@ -212,6 +218,7 @@ __Z_INLINE void handleSign(volatile uint32_t *flags, volatile uint32_t *tx, uint
212218 } else {
213219 view_review_init (tx_getItem , tx_getNumItems , app_sign_secp256k1 );
214220 }
221+ set_review_pending (true);
215222 view_review_show (REVIEW_TXN );
216223 * flags |= IO_ASYNCH_REPLY ;
217224}
@@ -240,6 +247,7 @@ __Z_INLINE void handleSignRaw(volatile uint32_t *flags, volatile uint32_t *tx, u
240247 } else {
241248 view_review_init (tx_raw_getItem , tx_raw_getNumItems , app_sign_secp256k1 );
242249 }
250+ set_review_pending (true);
243251 view_review_show (REVIEW_MSG );
244252 * flags |= IO_ASYNCH_REPLY ;
245253}
@@ -257,6 +265,10 @@ void handleApdu(volatile uint32_t *flags, volatile uint32_t *tx, uint32_t rx) {
257265 THROW (APDU_CODE_WRONG_LENGTH );
258266 }
259267
268+ if (is_review_pending ()) {
269+ THROW (APDU_CODE_COMMAND_NOT_ALLOWED );
270+ }
271+
260272 switch (G_io_apdu_buffer [OFFSET_INS ]) {
261273 case INS_GET_VERSION : {
262274 handle_getversion (flags , tx );
@@ -285,6 +297,7 @@ void handleApdu(volatile uint32_t *flags, volatile uint32_t *tx, uint32_t rx) {
285297 }
286298 }
287299 CATCH (EXCEPTION_IO_RESET ) {
300+ set_review_pending (false);
288301 THROW (EXCEPTION_IO_RESET );
289302 }
290303 // NOLINTNEXTLINE(readability-identifier-length): `e` is descriptive
0 commit comments