Merge pull request #378 from LedgerHQ/apr/bugfix/eip712_struct_review_glitch
EIP-712 verbose mode fix
This commit is contained in:
@@ -955,6 +955,9 @@ void coin_main(chain_config_t *coin_config) {
|
||||
#endif
|
||||
storage.contractDetails = 0x00;
|
||||
storage.displayNonce = 0x00;
|
||||
#ifdef HAVE_EIP712_FULL_SUPPORT
|
||||
storage.verbose_eip712 = 0x00;
|
||||
#endif
|
||||
storage.initialized = 0x01;
|
||||
nvm_write((void *) &N_storage, (void *) &storage, sizeof(internalStorage_t));
|
||||
}
|
||||
|
||||
@@ -7,19 +7,25 @@ enum { UI_712_POS_REVIEW, UI_712_POS_END };
|
||||
static uint8_t ui_pos;
|
||||
|
||||
static void dummy_cb(void) {
|
||||
if (!ui_712_next_field()) {
|
||||
if (ui_pos == UI_712_POS_REVIEW) {
|
||||
ux_flow_next();
|
||||
ui_pos = UI_712_POS_END;
|
||||
} else // UI_712_POS_END
|
||||
{
|
||||
ux_flow_prev();
|
||||
ui_pos = UI_712_POS_REVIEW;
|
||||
}
|
||||
} else {
|
||||
// temporarily disable button clicks, they will be re-enabled as soon as new data
|
||||
// is received and the page is redrawn with ux_flow_init()
|
||||
G_ux.stack[0].button_push_callback = NULL;
|
||||
switch (ui_712_next_field()) {
|
||||
case EIP712_NO_MORE_FIELD:
|
||||
if (ui_pos == UI_712_POS_REVIEW) {
|
||||
ux_flow_next();
|
||||
ui_pos = UI_712_POS_END;
|
||||
} else // UI_712_POS_END
|
||||
{
|
||||
ux_flow_prev();
|
||||
ui_pos = UI_712_POS_REVIEW;
|
||||
}
|
||||
break;
|
||||
case EIP712_FIELD_INCOMING:
|
||||
// temporarily disable button clicks, they will be re-enabled as soon as new data
|
||||
// is received and the page is redrawn with ux_flow_init()
|
||||
G_ux.stack[0].button_push_callback = NULL;
|
||||
break;
|
||||
case EIP712_FIELD_LATER:
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -115,10 +115,12 @@ void ui_712_redraw_generic_step(void) {
|
||||
/**
|
||||
* Called to fetch the next field if they have not all been processed yet
|
||||
*
|
||||
* @return whether there will be a next field
|
||||
* Also handles the special "Review struct" screen of the verbose mode
|
||||
*
|
||||
* @return the next field state
|
||||
*/
|
||||
bool ui_712_next_field(void) {
|
||||
bool next = false;
|
||||
e_eip712_nfs ui_712_next_field(void) {
|
||||
e_eip712_nfs state = EIP712_NO_MORE_FIELD;
|
||||
|
||||
if (ui_ctx == NULL) {
|
||||
apdu_response_code = APDU_RESPONSE_CONDITION_NOT_SATISFIED;
|
||||
@@ -126,13 +128,13 @@ bool ui_712_next_field(void) {
|
||||
if (ui_ctx->structs_to_review > 0) {
|
||||
ui_712_review_struct(path_get_nth_field_to_last(ui_ctx->structs_to_review));
|
||||
ui_ctx->structs_to_review -= 1;
|
||||
}
|
||||
if (!ui_ctx->end_reached) {
|
||||
state = EIP712_FIELD_LATER;
|
||||
} else if (!ui_ctx->end_reached) {
|
||||
handle_eip712_return_code(true);
|
||||
next = true;
|
||||
state = EIP712_FIELD_INCOMING;
|
||||
}
|
||||
}
|
||||
return next;
|
||||
return state;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -10,6 +10,11 @@
|
||||
#define UI_712_FIELD_NAME_PROVIDED (1 << 1)
|
||||
|
||||
typedef enum { EIP712_FILTERING_BASIC, EIP712_FILTERING_FULL } e_eip712_filtering_mode;
|
||||
typedef enum {
|
||||
EIP712_FIELD_LATER,
|
||||
EIP712_FIELD_INCOMING,
|
||||
EIP712_NO_MORE_FIELD
|
||||
} e_eip712_nfs; // next field state
|
||||
|
||||
typedef struct {
|
||||
bool shown;
|
||||
@@ -22,7 +27,7 @@ typedef struct {
|
||||
|
||||
bool ui_712_init(void);
|
||||
void ui_712_deinit(void);
|
||||
bool ui_712_next_field(void);
|
||||
e_eip712_nfs ui_712_next_field(void);
|
||||
void ui_712_review_struct(const void *const struct_ptr);
|
||||
bool ui_712_new_field(const void *const field_ptr, const uint8_t *const data, uint8_t length);
|
||||
void ui_712_end_sign(void);
|
||||
|
||||
@@ -21,7 +21,7 @@ sig_ctx = {}
|
||||
# Output = ('uint8', [2, None, 4]) | ('bool', [])
|
||||
def get_array_levels(typename):
|
||||
array_lvls = list()
|
||||
regex = re.compile("(.*)\[([0-9]*)\]$")
|
||||
regex = re.compile(r"(.*)\[([0-9]*)\]$")
|
||||
|
||||
while True:
|
||||
result = regex.search(typename)
|
||||
@@ -42,7 +42,7 @@ def get_array_levels(typename):
|
||||
# Input = "uint64" | "string"
|
||||
# Output = ('uint', 64) | ('string', None)
|
||||
def get_typesize(typename):
|
||||
regex = re.compile("^(\w+?)(\d*)$")
|
||||
regex = re.compile(r"^(\w+?)(\d*)$")
|
||||
result = regex.search(typename)
|
||||
typename = result.group(1)
|
||||
typesize = result.group(2)
|
||||
|
||||
Reference in New Issue
Block a user