diff --git a/src_nbgl/ui_sign_712_v0.c b/src_nbgl/ui_sign_712_v0.c index e0bc718..51e12ed 100644 --- a/src_nbgl/ui_sign_712_v0.c +++ b/src_nbgl/ui_sign_712_v0.c @@ -7,72 +7,64 @@ #include "uint_common.h" static nbgl_layoutTagValue_t pairs[2]; +static nbgl_layoutTagValueList_t pairsList; -static void start_review(void); // forward declaration +static void messageReviewChoice_cb(bool confirm) { + if (confirm) { + nbgl_useCaseStatus("MESSAGE\nSIGNED", true, ui_message_712_approved); + } else { + nbgl_useCaseStatus("Message signing\ncancelled", false, ui_message_712_rejected); + } +} static char *format_hash(const uint8_t *hash, char *buffer, size_t buffer_size, size_t offset) { bytes_to_string(buffer + offset, buffer_size - offset, hash, KECCAK256_HASH_BYTESIZE); return buffer + offset; } -static bool display_review_page(uint8_t page, nbgl_pageContent_t *content) { - if (page == 0) { - pairs[0].item = "Domain hash"; - pairs[0].value = format_hash(tmpCtx.messageSigningContext712.domainHash, - strings.tmp.tmp, - sizeof(strings.tmp.tmp), - 0); - pairs[1].item = "Message hash"; - pairs[1].value = format_hash(tmpCtx.messageSigningContext712.messageHash, - strings.tmp.tmp, - sizeof(strings.tmp.tmp), - 70); +static void setTagValuePairs(void) { + explicit_bzero(pairs, sizeof(pairs)); + explicit_bzero(&pairsList, sizeof(pairsList)); - content->type = TAG_VALUE_LIST; - content->tagValueList.nbPairs = 2; - content->tagValueList.pairs = (nbgl_layoutTagValue_t *) pairs; - } else if (page == 1) { - g_position = UI_SIGNING_POSITION_SIGN; - content->type = INFO_LONG_PRESS, content->infoLongPress.icon = get_app_icon(true); - content->infoLongPress.text = TEXT_SIGN_EIP712; - content->infoLongPress.longPressText = SIGN_BUTTON; + pairs[0].item = "Domain hash"; + pairs[0].value = format_hash(tmpCtx.messageSigningContext712.domainHash, + strings.tmp.tmp, + sizeof(strings.tmp.tmp), + 0); + pairs[1].item = "Message hash"; + pairs[1].value = format_hash(tmpCtx.messageSigningContext712.messageHash, + strings.tmp.tmp, + sizeof(strings.tmp.tmp), + 70); + + pairsList.nbPairs = 2; + pairsList.pairs = pairs; + pairsList.smallCaseForValue = false; + pairsList.nbMaxLinesForValue = NB_MAX_LINES_IN_REVIEW; + pairsList.wrapping = false; +} + +static void more_data_cb(bool confirm) { + if (confirm) { + if (g_position != UI_SIGNING_POSITION_SIGN) { + setTagValuePairs(); + nbgl_useCaseReviewStreamingContinue(&pairsList, more_data_cb); + // Switch to signature + g_position = UI_SIGNING_POSITION_SIGN; + } else { + // the last page must contain a long press button + nbgl_useCaseReviewStreamingFinish(TEXT_SIGN_EIP712, messageReviewChoice_cb); + } } else { - return false; + ui_message_712_rejected(); } - // valid page so return true - return true; -} - -static void display_review(void) { - uint8_t page; - - switch (g_position) { - case UI_SIGNING_POSITION_REVIEW: - page = 0; - break; - case UI_SIGNING_POSITION_SIGN: - page = 1; - break; - default: - return; // should not happen - } - nbgl_useCaseRegularReview(page, - 2, - REJECT_BUTTON, - NULL, - display_review_page, - ui_message_review_choice); -} - -static void start_review(void) { - g_position = UI_SIGNING_POSITION_REVIEW; - display_review(); } void ui_sign_712_v0(void) { g_position = UI_SIGNING_POSITION_START; - ui_message_start(TEXT_REVIEW_EIP712, - &start_review, - &ui_message_712_approved, - &ui_message_712_rejected); + nbgl_useCaseReviewStreamingStart(TYPE_MESSAGE, + &C_Review_64px, + TEXT_REVIEW_EIP712, + NULL, + more_data_cb); }