mirror of
https://github.com/trezor/trezor-firmware.git
synced 2024-12-18 04:18:10 +00:00
feat(legacy): Implement pagination in SignMessage and VerifyMessage.
This commit is contained in:
parent
5e6e56ac4d
commit
c60305d8f0
1
legacy/firmware/.changelog.d/1586.added.2
Normal file
1
legacy/firmware/.changelog.d/1586.added.2
Normal file
@ -0,0 +1 @@
|
||||
Implement pagination in SignMessage and VerifyMessage.
|
@ -304,6 +304,49 @@ static bool fsm_layoutAddress(const char *address, const char *desc,
|
||||
}
|
||||
}
|
||||
|
||||
static bool fsm_layoutPaginated(const char *description, const uint8_t *msg,
|
||||
uint32_t len, bool is_ascii) {
|
||||
const char **str = NULL;
|
||||
const uint32_t row_len = is_ascii ? 13 : 8;
|
||||
do {
|
||||
const uint32_t show_len = MIN(len, row_len * 4);
|
||||
if (is_ascii) {
|
||||
str = split_message(msg, show_len, row_len);
|
||||
} else {
|
||||
str = split_message_hex(msg, show_len);
|
||||
}
|
||||
|
||||
msg += show_len;
|
||||
len -= show_len;
|
||||
|
||||
const char *label = len > 0 ? _("Next") : _("Confirm");
|
||||
layoutDialogSwipe(&bmp_icon_question, _("Cancel"), label, description,
|
||||
str[0], str[1], str[2], str[3], NULL, NULL);
|
||||
|
||||
if (!protectButton(ButtonRequestType_ButtonRequest_Other, false)) {
|
||||
return false;
|
||||
}
|
||||
} while (len > 0);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool fsm_layoutSignMessage(const uint8_t *msg, uint32_t len) {
|
||||
if (is_valid_ascii(msg, len)) {
|
||||
return fsm_layoutPaginated(_("Sign message?"), msg, len, true);
|
||||
} else {
|
||||
return fsm_layoutPaginated(_("Sign binary message?"), msg, len, false);
|
||||
}
|
||||
}
|
||||
|
||||
bool fsm_layoutVerifyMessage(const uint8_t *msg, uint32_t len) {
|
||||
if (is_valid_ascii(msg, len)) {
|
||||
return fsm_layoutPaginated(_("Verified message?"), msg, len, true);
|
||||
} else {
|
||||
return fsm_layoutPaginated(_("Verified binary message?"), msg, len, false);
|
||||
}
|
||||
}
|
||||
|
||||
void fsm_msgRebootToBootloader(void) {
|
||||
layoutDialogSwipe(&bmp_icon_question, _("Cancel"), _("Confirm"), NULL,
|
||||
_("Do you want to"), _("restart device in"),
|
||||
|
@ -135,4 +135,7 @@ void fsm_msgStellarBumpSequenceOp(const StellarBumpSequenceOp *msg);
|
||||
|
||||
void fsm_msgRebootToBootloader(void);
|
||||
|
||||
bool fsm_layoutSignMessage(const uint8_t *msg, uint32_t len);
|
||||
bool fsm_layoutVerifyMessage(const uint8_t *msg, uint32_t len);
|
||||
|
||||
#endif
|
||||
|
@ -286,8 +286,7 @@ void fsm_msgSignMessage(const SignMessage *msg) {
|
||||
return;
|
||||
}
|
||||
|
||||
layoutSignMessage(msg->message.bytes, msg->message.size);
|
||||
if (!protectButton(ButtonRequestType_ButtonRequest_ProtectCall, false)) {
|
||||
if (!fsm_layoutSignMessage(msg->message.bytes, msg->message.size)) {
|
||||
fsm_sendFailure(FailureType_Failure_ActionCancelled, NULL);
|
||||
layoutHome();
|
||||
return;
|
||||
@ -319,12 +318,13 @@ void fsm_msgVerifyMessage(const VerifyMessage *msg) {
|
||||
layoutHome();
|
||||
return;
|
||||
}
|
||||
layoutVerifyMessage(msg->message.bytes, msg->message.size);
|
||||
if (!protectButton(ButtonRequestType_ButtonRequest_Other, false)) {
|
||||
|
||||
if (!fsm_layoutVerifyMessage(msg->message.bytes, msg->message.size)) {
|
||||
fsm_sendFailure(FailureType_Failure_ActionCancelled, NULL);
|
||||
layoutHome();
|
||||
return;
|
||||
}
|
||||
|
||||
fsm_sendSuccess(_("Message verified"));
|
||||
} else {
|
||||
fsm_sendFailure(FailureType_Failure_DataError, _("Invalid signature"));
|
||||
|
@ -173,8 +173,7 @@ void fsm_msgEthereumSignMessage(const EthereumSignMessage *msg) {
|
||||
return;
|
||||
}
|
||||
|
||||
layoutSignMessage(msg->message.bytes, msg->message.size);
|
||||
if (!protectButton(ButtonRequestType_ButtonRequest_ProtectCall, false)) {
|
||||
if (!fsm_layoutSignMessage(msg->message.bytes, msg->message.size)) {
|
||||
fsm_sendFailure(FailureType_Failure_ActionCancelled, NULL);
|
||||
layoutHome();
|
||||
return;
|
||||
@ -202,12 +201,13 @@ void fsm_msgEthereumVerifyMessage(const EthereumVerifyMessage *msg) {
|
||||
layoutHome();
|
||||
return;
|
||||
}
|
||||
layoutVerifyMessage(msg->message.bytes, msg->message.size);
|
||||
if (!protectButton(ButtonRequestType_ButtonRequest_Other, false)) {
|
||||
|
||||
if (!fsm_layoutVerifyMessage(msg->message.bytes, msg->message.size)) {
|
||||
fsm_sendFailure(FailureType_Failure_ActionCancelled, NULL);
|
||||
layoutHome();
|
||||
return;
|
||||
}
|
||||
|
||||
fsm_sendSuccess(_("Message verified"));
|
||||
|
||||
layoutHome();
|
||||
|
@ -445,7 +445,7 @@ void layoutConfirmOmni(const uint8_t *data, uint32_t size) {
|
||||
NULL);
|
||||
}
|
||||
|
||||
static bool is_valid_ascii(const uint8_t *data, uint32_t size) {
|
||||
bool is_valid_ascii(const uint8_t *data, uint32_t size) {
|
||||
for (uint32_t i = 0; i < size; i++) {
|
||||
if (data[i] < ' ' || data[i] > '~') {
|
||||
return false;
|
||||
@ -603,36 +603,6 @@ void layoutConfirmNondefaultLockTime(uint32_t lock_time,
|
||||
}
|
||||
}
|
||||
|
||||
void layoutSignMessage(const uint8_t *msg, uint32_t len) {
|
||||
const char **str = NULL;
|
||||
if (!is_valid_ascii(msg, len)) {
|
||||
str = split_message_hex(msg, len);
|
||||
layoutDialogSwipe(&bmp_icon_question, _("Cancel"), _("Confirm"),
|
||||
_("Sign binary message?"), str[0], str[1], str[2], str[3],
|
||||
NULL, NULL);
|
||||
} else {
|
||||
str = split_message(msg, len, 20);
|
||||
layoutDialogSwipe(&bmp_icon_question, _("Cancel"), _("Confirm"),
|
||||
_("Sign message?"), str[0], str[1], str[2], str[3], NULL,
|
||||
NULL);
|
||||
}
|
||||
}
|
||||
|
||||
void layoutVerifyMessage(const uint8_t *msg, uint32_t len) {
|
||||
const char **str = NULL;
|
||||
if (!is_valid_ascii(msg, len)) {
|
||||
str = split_message_hex(msg, len);
|
||||
layoutDialogSwipe(&bmp_icon_info, _("Cancel"), _("Confirm"),
|
||||
_("Verified binary message"), str[0], str[1], str[2],
|
||||
str[3], NULL, NULL);
|
||||
} else {
|
||||
str = split_message(msg, len, 20);
|
||||
layoutDialogSwipe(&bmp_icon_info, _("Cancel"), _("Confirm"),
|
||||
_("Verified message"), str[0], str[1], str[2], str[3],
|
||||
NULL, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
void layoutVerifyAddress(const CoinInfo *coin, const char *address) {
|
||||
render_address_dialog(coin, address, _("Confirm address?"),
|
||||
_("Message signed by:"), 0);
|
||||
|
@ -65,9 +65,7 @@ void layoutFeeOverThreshold(const CoinInfo *coin, AmountUnit amount_unit,
|
||||
void layoutChangeCountOverThreshold(uint32_t change_count);
|
||||
void layoutConfirmNondefaultLockTime(uint32_t lock_time,
|
||||
bool lock_time_disabled);
|
||||
void layoutSignMessage(const uint8_t *msg, uint32_t len);
|
||||
void layoutVerifyAddress(const CoinInfo *coin, const char *address);
|
||||
void layoutVerifyMessage(const uint8_t *msg, uint32_t len);
|
||||
void layoutCipherKeyValue(bool encrypt, const char *key);
|
||||
void layoutEncryptMessage(const uint8_t *msg, uint32_t len, bool signing);
|
||||
void layoutDecryptMessage(const uint8_t *msg, uint32_t len,
|
||||
@ -110,4 +108,6 @@ void layoutConfirmSafetyChecks(SafetyCheckLevel safety_checks_level);
|
||||
const char **split_message(const uint8_t *msg, uint32_t len, uint32_t rowlen);
|
||||
const char **split_message_hex(const uint8_t *msg, uint32_t len);
|
||||
|
||||
bool is_valid_ascii(const uint8_t *data, uint32_t size);
|
||||
|
||||
#endif
|
||||
|
Loading…
Reference in New Issue
Block a user