From d59029b2373c4daac81e640e3df300569d748003 Mon Sep 17 00:00:00 2001 From: ftheirs Date: Fri, 9 Jun 2023 17:25:10 -0300 Subject: [PATCH 1/3] add extra checks --- app/src/base32.c | 25 ++++++---------- app/src/common/actions.h | 2 +- app/src/common/tx.c | 4 +-- app/src/common/tx.h | 2 +- app/src/crypto.c | 2 +- app/src/crypto_helper.c | 10 +++---- app/src/eth_utils.c | 56 ++++++++++++++++-------------------- app/src/fil_utils.c | 41 ++++---------------------- app/src/fil_utils.h | 2 -- app/src/parser_client_deal.c | 2 +- app/src/parser_impl.c | 11 +++++-- app/src/parser_impl_eth.c | 14 +++++---- app/src/parser_raw_bytes.c | 2 +- deps/ledger-zxlib | 2 +- 14 files changed, 68 insertions(+), 107 deletions(-) diff --git a/app/src/base32.c b/app/src/base32.c index 8a21ba57..d9d6f4bb 100644 --- a/app/src/base32.c +++ b/app/src/base32.c @@ -26,28 +26,22 @@ uint32_t base32_encode(const uint8_t *data, char *result, uint32_t resultLen) { - if (length < 0 || length > (1 << 28)) - { - return -1; + if (data == NULL || result == NULL || + length > (1 << 28) || length == 0 || resultLen == 0) { + return 0; } uint32_t count = 0; - if (length > 0) - { + if (length > 0) { uint32_t buffer = data[0]; uint32_t next = 1; uint32_t bitsLeft = 8; - while (count < resultLen && (bitsLeft > 0 || next < length)) - { - if (bitsLeft < 5) - { - if (next < length) - { + while (count < resultLen && (bitsLeft > 0 || next < length)) { + if (bitsLeft < 5) { + if (next < length) { buffer <<= 8; buffer |= data[next++] & 0xFF; bitsLeft += 8; - } - else - { + } else { uint32_t pad = 5u - bitsLeft; buffer <<= pad; bitsLeft += pad; @@ -58,8 +52,7 @@ uint32_t base32_encode(const uint8_t *data, result[count++] = "abcdefghijklmnopqrstuvwxyz234567"[index]; } } - if (count < resultLen) - { + if (count < resultLen) { result[count] = '\000'; } return count; diff --git a/app/src/common/actions.h b/app/src/common/actions.h index 32c1cfc6..d041ff61 100644 --- a/app/src/common/actions.h +++ b/app/src/common/actions.h @@ -31,7 +31,7 @@ __Z_INLINE void app_sign() { uint16_t replyLen = 0; MEMZERO(G_io_apdu_buffer, IO_APDU_BUFFER_SIZE); - zxerr_t err = zxerr_ok; + zxerr_t err = zxerr_unknown; // data digest for raw_bytes is computed differently, so it // requires its own signing method diff --git a/app/src/common/tx.c b/app/src/common/tx.c index 4f20bff8..af32e9af 100644 --- a/app/src/common/tx.c +++ b/app/src/common/tx.c @@ -74,7 +74,7 @@ void tx_context_raw_bytes() { ctx_parsed_tx.tx_type = raw_bytes; } -uint8_t tx_is_rawbytes() { +bool tx_is_rawbytes() { return ctx_parsed_tx.tx_type == raw_bytes; } @@ -136,7 +136,7 @@ zxerr_t tx_getItem(int8_t displayIdx, CHECK_ZXERR(tx_getNumItems(&numItems)) - if (displayIdx < 0 || displayIdx > numItems) { + if (displayIdx < 0 || displayIdx >= numItems) { return zxerr_no_data; } diff --git a/app/src/common/tx.h b/app/src/common/tx.h index 22191bfb..803114e1 100644 --- a/app/src/common/tx.h +++ b/app/src/common/tx.h @@ -26,7 +26,7 @@ void tx_context_client_deal(); void tx_context_raw_bytes(); // Signing is differently depending tx is rawBytes type -uint8_t tx_is_rawbytes(); +bool tx_is_rawbytes(); zxerr_t tx_rawbytes_init_state(uint8_t *buf, size_t buf_len); zxerr_t tx_rawbytes_update(uint8_t *buf, size_t buf_len); diff --git a/app/src/crypto.c b/app/src/crypto.c index df2f4fe3..0434ce3d 100644 --- a/app/src/crypto.c +++ b/app/src/crypto.c @@ -329,7 +329,7 @@ zxerr_t crypto_fillAddress(uint8_t *buffer, uint16_t buffer_len, uint16_t *addrL } zxerr_t crypto_fillEthAddress(uint8_t *buffer, uint16_t buffer_len, uint16_t *addrLen) { - if (buffer == NULL || buffer_len < sizeof(answer_t) || addrLen == NULL) { + if (buffer == NULL || buffer_len < sizeof(answer_eth_t) || addrLen == NULL) { return zxerr_no_data; } MEMZERO(buffer, buffer_len); diff --git a/app/src/crypto_helper.c b/app/src/crypto_helper.c index 2d078e15..0a08147f 100644 --- a/app/src/crypto_helper.c +++ b/app/src/crypto_helper.c @@ -35,8 +35,8 @@ uint16_t decompressLEB128(const uint8_t *input, uint16_t inputSize, uint64_t *v) while (i < 10u && i < inputSize) { uint64_t b = input[i] & 0x7fu; - if (shift >= 63 && b > 1) { - // This will overflow uint64_t + if ((shift == 63 && b > 1) || (shift > 63 && b > 0)) { + // This will overflow uint64_t, break and return break; } @@ -79,10 +79,10 @@ uint16_t formatProtocol(const uint8_t *addressBytes, case ADDRESS_PROTOCOL_ID: { uint64_t val = 0; - if (!decompressLEB128(addressBytes + 1, addressSize - 1, &val)) { + if (!decompressLEB128(addressBytes + 1, addressSize - 1, &val) || + uint64_to_str((char *) formattedAddress + 2, formattedAddressSize - 2, val) != NULL) { return 0; } - uint64_to_str((char *) formattedAddress + 2, formattedAddressSize - 2, val); return strnlen((const char *) formattedAddress, formattedAddressSize); } case ADDRESS_PROTOCOL_SECP256K1: { // NOLINT(bugprone-branch-clone) @@ -140,7 +140,7 @@ uint16_t formatProtocol(const uint8_t *addressBytes, if (base32_encode(payload_crc, (uint32_t) (payloadSize + CHECKSUM_LENGTH), (char *)(formattedAddress + offset), - (uint32_t) (formattedAddressSize - offset)) < 0) { + (uint32_t) (formattedAddressSize - offset)) == 0) { return 0; } diff --git a/app/src/eth_utils.c b/app/src/eth_utils.c index 9d29c09c..4a6d17d8 100644 --- a/app/src/eth_utils.c +++ b/app/src/eth_utils.c @@ -64,9 +64,9 @@ be_bytes_to_u64(const uint8_t *bytes, uint8_t len, uint64_t *num) } uint8_t *num_ptr = (uint8_t *)num; - for (int i = len; i--;) { - *num_ptr = bytes[i]; - num_ptr += 1; + for (uint8_t i = 0; i < len; i++) { + *num_ptr = bytes[len - i - 1]; + num_ptr++; } return 0; @@ -146,30 +146,26 @@ parse_rlp_item(const uint8_t *data, uint8_t marker = data[0]; - - // first case item is just one byte - if ((marker - 0x00) * (marker - 0x7F) <= 0) { + if (marker <= 0x7F) { + // first case item is just one byte *read = 0; *item_len = 1; return rlp_ok; - } - // second case it is a sstring with a fixed length - if ((marker - 0x80) * (marker - 0xB7) <= 0) { + } else if (marker <= 0xB7) { + // second case it is a string with a fixed length uint8_t len = marker - 0x80; - *read = 1; CHECK_RLP_LEN(dataLen, len + 1) *item_len = len; return rlp_ok; - } - // For strings longer than 55 bytes the length is encoded - // differently. - // The number of bytes that compose the length is encoded - // in the marker - // And then the length is just the number BE encoded - if ((marker - 0xB8) * (marker - 0xBF) <= 0) { + } else if (marker <= 0xBF) { + // For strings longer than 55 bytes the length is encoded + // differently. + // The number of bytes that compose the length is encoded + // in the marker + // And then the length is just the number BE encoded uint8_t num_bytes = marker - 0xB7; uint64_t len = 0; if (be_bytes_to_u64(&data[1], num_bytes, &len) != 0) @@ -180,10 +176,9 @@ parse_rlp_item(const uint8_t *data, *item_len = len; return rlp_ok; - } - // simple list - if ((marker - 0xC0) * (marker - 0xF7) <= 0) { + } else if (marker <= 0xF7) { + // simple list uint8_t len = marker - 0xC0; *read = 1; @@ -192,24 +187,21 @@ parse_rlp_item(const uint8_t *data, return rlp_ok; } + // marker >= 0xF8 // For lists longer than 55 bytes the length is encoded // differently. // The number of bytes that compose the length is encoded // in the marker // And then the length is just the number BE encoded - if (marker >= 0xF8) { - uint8_t num_bytes = marker - 0xF7; - uint64_t len = 0; - if (be_bytes_to_u64(&data[1], num_bytes, &len) != 0) - return rlp_invalid_data; - - CHECK_RLP_LEN(dataLen, len + 1 + num_bytes) + uint8_t num_bytes = marker - 0xF7; + uint64_t len = 0; + if (be_bytes_to_u64(&data[1], num_bytes, &len) != 0) + return rlp_invalid_data; - *read = 1 + num_bytes; - *item_len = len; + CHECK_RLP_LEN(dataLen, len + 1 + num_bytes) - return rlp_ok; - } + *read = 1 + num_bytes; + *item_len = len; - return rlp_invalid_data; + return rlp_ok; } diff --git a/app/src/fil_utils.c b/app/src/fil_utils.c index 50fc2c98..25b425a6 100644 --- a/app/src/fil_utils.c +++ b/app/src/fil_utils.c @@ -204,11 +204,11 @@ parser_error_t parse_cid(cid_t *cid, CborValue *value) { uint64_t version; uint64_t codec; - uint8_t base_offset = parse_varint(tmp, cid_len, &base); + uint8_t base_offset = decompressLEB128(tmp, cid_len, &base); bytes_read += base_offset; - bytes_read += parse_varint(tmp + bytes_read, cid_len - bytes_read, &version); - parse_varint(tmp + bytes_read, cid_len - bytes_read, &codec); + bytes_read += decompressLEB128(tmp + bytes_read, cid_len - bytes_read, &version); + decompressLEB128(tmp + bytes_read, cid_len - bytes_read, &codec); if ((uint8_t)codec != CID_CODEC || (uint8_t)version != CID_VERSION || (uint8_t)base != CID_BASE) return parser_invalid_cid; @@ -236,41 +236,10 @@ parser_error_t printCid(cid_t *cid, char *outVal, uint16_t outValLen, // filecoin uses base32 which base prefix is b. *outBuffer = 'b'; - size_t encoded_len = base32_encode(cid->str, cid->len, outBuffer + 1, sizeof(outBuffer)- 1); - - if (encoded_len == 0) + if (base32_encode(cid->str, cid->len, outBuffer + 1, sizeof(outBuffer)- 1) == 0) { return parser_no_data; + } pageString(outVal, outValLen, outBuffer, pageIdx, pageCount); - return parser_ok; } - -/** -* reads a varint from buf. -* result is written into /value -* returns the amount of bytes read from buf -* */ -size_t parse_varint(uint8_t *buf, size_t buf_len, uint64_t *value) { - - uint8_t shift = 0; - uint8_t b; - size_t i; - - if (value == NULL) - return 0; - - *value = 0; - - for (i = 0; i < buf_len; i++) { - b = buf[i]; - *value |= (uint64_t)(b & 0x7F) << shift; - shift += 7; - if ((b & 0x80) == 0) { - break; - } - } - - return i + 1; -} - diff --git a/app/src/fil_utils.h b/app/src/fil_utils.h index ce6b4a90..78999592 100644 --- a/app/src/fil_utils.h +++ b/app/src/fil_utils.h @@ -81,8 +81,6 @@ parser_error_t renderByteString(uint8_t *in, uint16_t inLen, parser_error_t parse_cid(cid_t *cid, CborValue *value); -size_t parse_varint(uint8_t *buf, size_t buf_len, uint64_t *value); - #ifdef __cplusplus } #endif diff --git a/app/src/parser_client_deal.c b/app/src/parser_client_deal.c index c2d5dbd7..d9093b9d 100644 --- a/app/src/parser_client_deal.c +++ b/app/src/parser_client_deal.c @@ -206,7 +206,7 @@ parser_error_t _getItemClientDeal(__Z_UNUSED const parser_context_t *ctx, CHECK_APP_CANARY() - uint8_t expert_mode = app_mode_expert(); + bool expert_mode = app_mode_expert(); if (displayIdx == 0) { snprintf(outKey, outKeyLen, "PieceCID "); diff --git a/app/src/parser_impl.c b/app/src/parser_impl.c index d62cf02e..9c07e7ea 100644 --- a/app/src/parser_impl.c +++ b/app/src/parser_impl.c @@ -105,11 +105,9 @@ const char *parser_getErrorDescription(parser_error_t err) { parser_error_t printValue(const struct CborValue *value, char *outVal, uint16_t outValLen, uint8_t pageIdx, uint8_t *pageCount) { - uint8_t buff[STR_BUF_LEN]; + uint8_t buff[STR_BUF_LEN] = {0}; size_t buffLen = sizeof(buff); - MEMZERO(buff, sizeof(buff)); - snprintf(outVal, outValLen, "-- EMPTY --"); switch (value->type) { case CborByteStringType: { CHECK_CBOR_MAP_ERR(cbor_value_copy_byte_string(value, buff, &buffLen, NULL /* next */)) @@ -150,6 +148,13 @@ parser_error_t printValue(const struct CborValue *value, default: snprintf(outVal, outValLen, "Type: %d", value->type); } + + // Print EMPTY when buffLen is zero + if (buffLen == 0) { + snprintf(outVal, outValLen, "-- EMPTY --"); + *pageCount = 1; + } + return parser_ok; } diff --git a/app/src/parser_impl_eth.c b/app/src/parser_impl_eth.c index 16b26259..a094db0e 100644 --- a/app/src/parser_impl_eth.c +++ b/app/src/parser_impl_eth.c @@ -191,19 +191,22 @@ parser_error_t _readEth(parser_context_t *ctx, eth_tx_t *tx_obj) uint32_t len = 0; // read out transaction rlp header(which indicates tx data length) - if (parse_rlp_item(ctx->buffer + ctx->offset, ctx->bufferLen, &read, &len) != rlp_ok) + if (parse_rlp_item(ctx->buffer + ctx->offset, ctx->bufferLen, &read, &len) != rlp_ok) { // should not happen as this was check before + ctx->offset = start; return parser_unexepected_error; + } ctx->offset += read; - if (ctx->offset > ctx->bufferLen) + if (ctx->offset > ctx->bufferLen) { // should not happend though + ctx->offset = start; return parser_unexepected_error; + } // parser transaction parser_error_t err = parseEthTx(ctx, tx_obj); - ctx->offset = start; if (err != parser_ok) @@ -282,8 +285,9 @@ parser_error_t _computeV(parser_context_t *ctx, eth_tx_t *tx_obj, unsigned int i // this is not good but it relies on hw-eth-app lib from ledger // to recover the right chain_id from the V component being computed here, and // which is returned with the signature - if (id_len > UINT32_MAX) - id_len = UINT32_MAX; + if (id_len > UINT8_MAX) { + return parser_unexepected_error; + } const uint8_t *chain = ctx->buffer + tx_obj->chain_id.offset; diff --git a/app/src/parser_raw_bytes.c b/app/src/parser_raw_bytes.c index 07fbb01f..a553114c 100644 --- a/app/src/parser_raw_bytes.c +++ b/app/src/parser_raw_bytes.c @@ -49,7 +49,7 @@ parser_error_t raw_bytes_init(uint8_t *buf, size_t buf_len) { // get message len in bytes uint64_t total = 0; - size_t bytes_read = parse_varint(buf, buf_len, &total); + size_t bytes_read = decompressLEB128(buf, buf_len, &total); if (total == 0 || bytes_read == buf_len) return parser_unexpected_buffer_end; diff --git a/deps/ledger-zxlib b/deps/ledger-zxlib index 8c7bba89..cf1a6b80 160000 --- a/deps/ledger-zxlib +++ b/deps/ledger-zxlib @@ -1 +1 @@ -Subproject commit 8c7bba8964630697db406086ed51e361ecf4deb7 +Subproject commit cf1a6b80c483104144a20b0f76ef7b403edd8c07 From ccc2abd5a724045b3c4351f39648343d8de6bbf5 Mon Sep 17 00:00:00 2001 From: ftheirs Date: Fri, 9 Jun 2023 17:26:05 -0300 Subject: [PATCH 2/3] restructure displaying function --- app/src/parser.c | 127 +++++++++++++++++++---------------- app/src/parser_client_deal.c | 91 ++++++++++++------------- 2 files changed, 116 insertions(+), 102 deletions(-) diff --git a/app/src/parser.c b/app/src/parser.c index 5f062b8a..b3cbf8dd 100644 --- a/app/src/parser.c +++ b/app/src/parser.c @@ -183,6 +183,24 @@ parser_error_t parser_printParam(const fil_base_tx_t *tx, uint8_t paramIdx, } +static parser_error_t printMethod(char *outKey, uint16_t outKeyLen, + char *outVal, uint16_t outValLen, + uint8_t pageIdx, uint8_t *pageCount) { + snprintf(outKey, outKeyLen, "Method "); + *pageCount = 1; + + CHECK_PARSER_ERR(checkMethod(parser_tx_obj.base_tx.method)); + if (parser_tx_obj.base_tx.method == 0) { + snprintf(outVal, outValLen, "Transfer "); + } else { + char buffer[100]; + MEMZERO(buffer, sizeof(buffer)); + fpuint64_to_str(buffer, sizeof(buffer), parser_tx_obj.base_tx.method, 0); + pageString(outVal, outValLen, buffer, pageIdx, pageCount); + } + return parser_ok; +} + parser_error_t _getItemFil(const parser_context_t *ctx, uint8_t displayIdx, char *outKey, uint16_t outKeyLen, @@ -191,7 +209,7 @@ parser_error_t _getItemFil(const parser_context_t *ctx, char log_tmp[100]; snprintf(log_tmp, sizeof(log_tmp), "getItem %d\n", displayIdx); zemu_log(log_tmp); - uint8_t expert_mode = app_mode_expert(); + const bool expert_mode = app_mode_expert(); MEMZERO(outKey, outKeyLen); MEMZERO(outVal, outValLen); @@ -203,72 +221,67 @@ parser_error_t _getItemFil(const parser_context_t *ctx, CHECK_PARSER_ERR(parser_getNumItems(ctx, &numItems)) CHECK_APP_CANARY() - if (displayIdx < 0 || displayIdx >= numItems) { + if (displayIdx >= numItems) { return parser_no_data; } - if (displayIdx == 0) { - snprintf(outKey, outKeyLen, "To "); - return printAddress(&parser_tx_obj.base_tx.to, - outVal, outValLen, pageIdx, pageCount); - } - - if (displayIdx == 1) { - snprintf(outKey, outKeyLen, "From "); - return printAddress(&parser_tx_obj.base_tx.from, - outVal, outValLen, pageIdx, pageCount); - } - - if (displayIdx == 2) { - snprintf(outKey, outKeyLen, "Value "); - return parser_printBigIntFixedPoint(&parser_tx_obj.base_tx.value, outVal, outValLen, pageIdx, pageCount, COIN_AMOUNT_DECIMAL_PLACES); - } - - if (displayIdx == 3) { - snprintf(outKey, outKeyLen, "Gas Limit "); - if (int64_to_str(outVal, outValLen, parser_tx_obj.base_tx.gaslimit) != NULL) { - return parser_unexepected_error; - } - *pageCount = 1; - return parser_ok; - } + // Normal mode: 6 fields [To | From | Value | Gas Limit | Gas Fee Cap | Method] + Params (variable length) + // Expert mode: 8 fields [To | From | Value | Gas Limit | Gas Fee Cap | Gas Premium | Nonce | Method] + Params (variable length) + switch (displayIdx) { + case 0: + snprintf(outKey, outKeyLen, "To "); + return printAddress(&parser_tx_obj.base_tx.to, + outVal, outValLen, pageIdx, pageCount); + + case 1: + snprintf(outKey, outKeyLen, "From "); + return printAddress(&parser_tx_obj.base_tx.from, + outVal, outValLen, pageIdx, pageCount); + + case 2: + snprintf(outKey, outKeyLen, "Value "); + return parser_printBigIntFixedPoint(&parser_tx_obj.base_tx.value, outVal, outValLen, pageIdx, pageCount, COIN_AMOUNT_DECIMAL_PLACES); + + case 3: + snprintf(outKey, outKeyLen, "Gas Limit "); + if (int64_to_str(outVal, outValLen, parser_tx_obj.base_tx.gaslimit) != NULL) { + return parser_unexepected_error; + } + *pageCount = 1; + return parser_ok; - if (displayIdx == 4) { - snprintf(outKey, outKeyLen, "Gas Fee Cap "); - return parser_printBigIntFixedPoint(&parser_tx_obj.base_tx.gasfeecap, outVal, outValLen, pageIdx, pageCount, COIN_AMOUNT_DECIMAL_PLACES); - } + case 4: + snprintf(outKey, outKeyLen, "Gas Fee Cap "); + return parser_printBigIntFixedPoint(&parser_tx_obj.base_tx.gasfeecap, outVal, outValLen, pageIdx, pageCount, COIN_AMOUNT_DECIMAL_PLACES); - if (expert_mode){ - if (displayIdx == 5) { - snprintf(outKey, outKeyLen, "Gas Premium "); - return parser_printBigIntFixedPoint(&parser_tx_obj.base_tx.gaspremium, outVal, outValLen, pageIdx, pageCount, COIN_AMOUNT_DECIMAL_PLACES); - } + case 5: + if (expert_mode) { + snprintf(outKey, outKeyLen, "Gas Premium "); + return parser_printBigIntFixedPoint(&parser_tx_obj.base_tx.gaspremium, outVal, outValLen, pageIdx, pageCount, COIN_AMOUNT_DECIMAL_PLACES); + } + return printMethod(outKey, outKeyLen, outVal, outValLen, pageIdx, pageCount); - if (displayIdx == 6) { + case 6: + if(expert_mode) { snprintf(outKey, outKeyLen, "Nonce "); - if (uint64_to_str(outVal, outValLen, parser_tx_obj.base_tx.nonce) != NULL) { - return parser_unexepected_error; + if (uint64_to_str(outVal, outValLen, parser_tx_obj.base_tx.nonce) != NULL) { + return parser_unexepected_error; + } + *pageCount = 1; + return parser_ok; } - *pageCount = 1; - return parser_ok; - } - } + // For non expert mode this index represent params field. + break; - if ((displayIdx == 5 && !expert_mode) || (displayIdx == 7 && expert_mode)) { - snprintf(outKey, outKeyLen, "Method "); - *pageCount = 1; + case 7: + if (expert_mode) { + return printMethod(outKey, outKeyLen, outVal, outValLen, pageIdx, pageCount); + } + // For non expert mode this index represent params field. + break; - CHECK_PARSER_ERR(checkMethod(parser_tx_obj.base_tx.method)); - if (parser_tx_obj.base_tx.method == 0) { - snprintf(outVal, outValLen, "Transfer "); - return parser_ok; - } else { - char buffer[100]; - MEMZERO(buffer, sizeof(buffer)); - fpuint64_to_str(buffer, sizeof(buffer), parser_tx_obj.base_tx.method, 0); - pageString(outVal, outValLen, buffer, pageIdx, pageCount); - return parser_ok; - } + default: + break; } if (parser_tx_obj.base_tx.numparams == 0) { diff --git a/app/src/parser_client_deal.c b/app/src/parser_client_deal.c index d9093b9d..09708661 100644 --- a/app/src/parser_client_deal.c +++ b/app/src/parser_client_deal.c @@ -206,69 +206,70 @@ parser_error_t _getItemClientDeal(__Z_UNUSED const parser_context_t *ctx, CHECK_APP_CANARY() - bool expert_mode = app_mode_expert(); + const bool expert_mode = app_mode_expert(); - if (displayIdx == 0) { - snprintf(outKey, outKeyLen, "PieceCID "); - parser_error_t res = printCid(&( parser_tx_obj.client_deal_tx.cid ), outVal, outValLen, pageIdx, pageCount); - return res; - } - - if (displayIdx == 1) { - snprintf(outKey, outKeyLen, "Client "); - return printAddress(&parser_tx_obj.client_deal_tx.client, - outVal, outValLen, pageIdx, pageCount); - } - - if (displayIdx == 2) { - snprintf(outKey, outKeyLen, "Provider "); - return printAddress(&parser_tx_obj.client_deal_tx.provider, - outVal, outValLen, pageIdx, pageCount); - } - - if (( displayIdx == 3 && !expert_mode ) || ( displayIdx == 9 && expert_mode )) { - snprintf(outKey, outKeyLen, "VerifiedDeal "); - - if (parser_tx_obj.client_deal_tx.verified_deal > 0) { - snprintf(outVal, outValLen, "true"); - } else { - snprintf(outVal, outValLen, "false"); + // Remapping displayIdx to simplify switch-case logic + // VerifiedDeal should be placed at the 10th position for Expert mode + if (expert_mode) { + if (displayIdx == 3) { + displayIdx = 9; + } else if (displayIdx == 9) { + displayIdx = 3; } - - *pageCount = 1; - - return parser_ok; } - if (displayIdx == 3 && expert_mode) { - snprintf(outKey, outKeyLen, "PieceSize(B)"); - return render_integer(parser_tx_obj.client_deal_tx.piece_size, outVal, outValLen, pageCount); - } + // Normal mode: 4 fields [PieceCID | Client | Provider | VerifiedDeal] + // Expert mode: 10 fields [PieceCID | Client | Provider | PieceSize(B) | DealLabel | StartEpoch | EndEpoch | ProvCollateral | ClientCollateral | VerifiedDeal] + switch (displayIdx) { + case 0: + snprintf(outKey, outKeyLen, "PieceCID "); + return printCid(&( parser_tx_obj.client_deal_tx.cid ), outVal, outValLen, pageIdx, pageCount); + + case 1: + snprintf(outKey, outKeyLen, "Client "); + return printAddress(&parser_tx_obj.client_deal_tx.client, + outVal, outValLen, pageIdx, pageCount); + + case 2: + snprintf(outKey, outKeyLen, "Provider "); + return printAddress(&parser_tx_obj.client_deal_tx.provider, + outVal, outValLen, pageIdx, pageCount); + + case 3: + snprintf(outKey, outKeyLen, "VerifiedDeal "); + if (parser_tx_obj.client_deal_tx.verified_deal > 0) { + snprintf(outVal, outValLen, "true"); + } else { + snprintf(outVal, outValLen, "false"); + } + *pageCount = 1; + return parser_ok; - if (expert_mode) { - if (displayIdx == 4) { + case 4: return render_label(outKey, outKeyLen, outVal, outValLen, pageIdx, pageCount); - } - if (displayIdx == 5) { + case 5: snprintf(outKey, outKeyLen, "StartEpoch"); return render_integer(parser_tx_obj.client_deal_tx.start_epoch, outVal, outValLen, pageCount); - } - if (displayIdx == 6) { + case 6: snprintf(outKey, outKeyLen, "EndEpoch"); return render_integer(parser_tx_obj.client_deal_tx.end_epoch, outVal, outValLen, pageCount); - } - if (displayIdx == 7) { + case 7: snprintf(outKey, outKeyLen, "ProvCollateral"); return parser_printBigIntFixedPoint(&parser_tx_obj.client_deal_tx.provider_collateral, outVal, outValLen, pageIdx, pageCount, COIN_AMOUNT_DECIMAL_PLACES); - } - if (displayIdx == 8) { + case 8: snprintf(outKey, outKeyLen, "ClientCollateral"); return parser_printBigIntFixedPoint(&parser_tx_obj.client_deal_tx.client_collateral, outVal, outValLen, pageIdx, pageCount, COIN_AMOUNT_DECIMAL_PLACES); - } + + case 9: + snprintf(outKey, outKeyLen, "PieceSize(B)"); + return render_integer(parser_tx_obj.client_deal_tx.piece_size, outVal, outValLen, pageCount); + + default: + break; } return parser_no_data; From 678d41b8f2172f35221b300c1bbfdac7af92bbd2 Mon Sep 17 00:00:00 2001 From: ftheirs Date: Fri, 9 Jun 2023 21:01:49 -0300 Subject: [PATCH 3/3] bump version --- app/Makefile.version | 2 +- tests_zemu/package.json | 2 +- tests_zemu/snapshots/s-mainmenu/00004.png | Bin 426 -> 432 bytes tests_zemu/snapshots/s-mainmenu/00010.png | Bin 426 -> 432 bytes tests_zemu/snapshots/sp-mainmenu/00004.png | Bin 371 -> 387 bytes tests_zemu/snapshots/sp-mainmenu/00010.png | Bin 371 -> 387 bytes tests_zemu/snapshots/x-mainmenu/00004.png | Bin 371 -> 387 bytes tests_zemu/snapshots/x-mainmenu/00010.png | Bin 371 -> 387 bytes tests_zemu/yarn.lock | 8 ++++---- 9 files changed, 6 insertions(+), 6 deletions(-) diff --git a/app/Makefile.version b/app/Makefile.version index df42e014..efb44b8d 100644 --- a/app/Makefile.version +++ b/app/Makefile.version @@ -3,4 +3,4 @@ APPVERSION_M=0 # This is the minor version of this release APPVERSION_N=23 # This is the patch version of this release -APPVERSION_P=3 +APPVERSION_P=4 diff --git a/tests_zemu/package.json b/tests_zemu/package.json index 9777a518..b7050d87 100644 --- a/tests_zemu/package.json +++ b/tests_zemu/package.json @@ -18,7 +18,7 @@ }, "dependencies": { "@zondax/ledger-filecoin": "^0.13.0", - "@zondax/zemu": "^0.42.0" + "@zondax/zemu": "^0.42.1" }, "devDependencies": { "@types/jest": "^29.2.3", diff --git a/tests_zemu/snapshots/s-mainmenu/00004.png b/tests_zemu/snapshots/s-mainmenu/00004.png index 9d85d9187c1bc25f375328f469c9dc5b34118d9b..7a03a11aa88ebbba65aeae1b1ffdc545a3590065 100644 GIT binary patch delta 406 zcmV;H0crlK1F!>-B!72FL_t(|ob8#-5`!QNgkz_^{{wrl2iibpy$5>(|-HrU=A)1JEwV0F|*Dox%9ldYcOUh5!Cp(sxvwNR1wL5ve4AgK?n&yh2r zYRY}qzVs5Z3$`D|0JV|vNQsa1kD&D2mW{0e+_vjMYDM}7VLeUJ76z!cvIiIewK!Ae ziB(X+p|~;jw13A7u;)MJ2Mw}3ZFd$#{&A2Epsf>yF0$hY95SFbt<+X4ex~njgCE2p z1A;3hMrP|@Dnns=Oqq$UXO5PjJIA=ydbb3PL(@4RLaoGVecZi6_a4Rt>yMoz;$7qv z9qHJb*!O^o{)YWfqfm)#%TD+D0ssI20DvqX0DQs&5)U>&?f?J)07*qoM6N<$f?$Na AtN;K2 delta 400 zcmV;B0dM}W1F8d%B!6*9L_t(|ob8#-l7t`(gyYoC`#-P;_rOjnCIo|wAZ~vr3xYG% z9m0=90002Mg={NrYv#G}Rgd6j^dG2Xd5``FUuLKQGMAIG+e*v(ubm%M00|p7K(@$% zw>RuH?3YqFbQ2|KuSrOl?A!Uq^-(&Z-3xax-&5YYS+EE5amc^ z)r9&UGN=SqIg|~yjdR-5%K%nKJ*3j)%`n;PDem=7!V-$|1X3Fn*$!ef%z&gmv~DA3 zK-H4_taIrlWH)Rdi~;H(-B!72FL_t(|ob8#-5`!QNgkz_^{{wrl2iibpy$5>(|-HrU=A)1JEwV0F|*Dox%9ldYcOUh5!Cp(sxvwNR1wL5ve4AgK?n&yh2r zYRY}qzVs5Z3$`D|0JV|vNQsa1kD&D2mW{0e+_vjMYDM}7VLeUJ76z!cvIiIewK!Ae ziB(X+p|~;jw13A7u;)MJ2Mw}3ZFd$#{&A2Epsf>yF0$hY95SFbt<+X4ex~njgCE2p z1A;3hMrP|@Dnns=Oqq$UXO5PjJIA=ydbb3PL(@4RLaoGVecZi6_a4Rt>yMoz;$7qv z9qHJb*!O^o{)YWfqfm)#%TD+D0ssI20DvqX0DQs&5)U>&?f?J)07*qoM6N<$f?$Na AtN;K2 delta 400 zcmV;B0dM}W1F8d%B!6*9L_t(|ob8#-l7t`(gyYoC`#-P;_rOjnCIo|wAZ~vr3xYG% z9m0=90002Mg={NrYv#G}Rgd6j^dG2Xd5``FUuLKQGMAIG+e*v(ubm%M00|p7K(@$% zw>RuH?3YqFbQ2|KuSrOl?A!Uq^-(&Z-3xax-&5YYS+EE5amc^ z)r9&UGN=SqIg|~yjdR-5%K%nKJ*3j)%`n;PDem=7!V-$|1X3Fn*$!ef%z&gmv~DA3 zK-H4_taIrlWH)Rdi~;H(6-t)E(5HvNEyp%uguzHR3vB;@z=Ks_ZWu@lJ5!1TBxw~qly2L)-IK*mUw{*&+D<3z8wJr-P zK9O+G;%kImUCF)||CxX7@42??@-Ifq%?A-d!l2Nno+J1Fh0CM#T9BxxtDnm{r-UW| Dv9zc7 delta 344 zcmZo>{>(H%rQXWZ#WAE}&fA-@eTNlz+ya-)n!Dk@YNdXygX_A3OJ0^FsqcNRsT8pA ze9N=tA`A#n5U8Z2^!THE{VSci#p)kCw_bap`DWU7hAQ3dDXvSd-MaO=@nt}WWEK0} zMeJ!BH*~9*ifz5-=2Wipy8OFhe}daqsXyn}+!w5`XWgQ@GW@C1J0qRw&9C-0-Yk0m zhi8BNtH-LZuM6E<89O&wwMxkB zVv6@G?Vi`Q??nSQ{Cx6fW@p@0Y1SFrHnYk;*`x2cJ7)djuk7p3o)h=jpQ3#rL#OlH n-8(T=_Z5~eNBE!Nz}CBr@y|bfKXU8nQjoBxtDnm{r-UW|Zc(R3 diff --git a/tests_zemu/snapshots/sp-mainmenu/00010.png b/tests_zemu/snapshots/sp-mainmenu/00010.png index c077084f153128e5d9a9e702ffd4a190b6a0779a..c4bc44149ab51b21150624ee35336558970807d2 100644 GIT binary patch delta 360 zcmey&)XY3VrQXZa#WAE}&fA-je1{cyTmz#@)!)>6-t)E(5HvNEyp%uguzHR3vB;@z=Ks_ZWu@lJ5!1TBxw~qly2L)-IK*mUw{*&+D<3z8wJr-P zK9O+G;%kImUCF)||CxX7@42??@-Ifq%?A-d!l2Nno+J1Fh0CM#T9BxxtDnm{r-UW| Dv9zc7 delta 344 zcmZo>{>(H%rQXWZ#WAE}&fA-@eTNlz+ya-)n!Dk@YNdXygX_A3OJ0^FsqcNRsT8pA ze9N=tA`A#n5U8Z2^!THE{VSci#p)kCw_bap`DWU7hAQ3dDXvSd-MaO=@nt}WWEK0} zMeJ!BH*~9*ifz5-=2Wipy8OFhe}daqsXyn}+!w5`XWgQ@GW@C1J0qRw&9C-0-Yk0m zhi8BNtH-LZuM6E<89O&wwMxkB zVv6@G?Vi`Q??nSQ{Cx6fW@p@0Y1SFrHnYk;*`x2cJ7)djuk7p3o)h=jpQ3#rL#OlH n-8(T=_Z5~eNBE!Nz}CBr@y|bfKXU8nQjoBxtDnm{r-UW|Zc(R3 diff --git a/tests_zemu/snapshots/x-mainmenu/00004.png b/tests_zemu/snapshots/x-mainmenu/00004.png index c077084f153128e5d9a9e702ffd4a190b6a0779a..c4bc44149ab51b21150624ee35336558970807d2 100644 GIT binary patch delta 360 zcmey&)XY3VrQXZa#WAE}&fA-je1{cyTmz#@)!)>6-t)E(5HvNEyp%uguzHR3vB;@z=Ks_ZWu@lJ5!1TBxw~qly2L)-IK*mUw{*&+D<3z8wJr-P zK9O+G;%kImUCF)||CxX7@42??@-Ifq%?A-d!l2Nno+J1Fh0CM#T9BxxtDnm{r-UW| Dv9zc7 delta 344 zcmZo>{>(H%rQXWZ#WAE}&fA-@eTNlz+ya-)n!Dk@YNdXygX_A3OJ0^FsqcNRsT8pA ze9N=tA`A#n5U8Z2^!THE{VSci#p)kCw_bap`DWU7hAQ3dDXvSd-MaO=@nt}WWEK0} zMeJ!BH*~9*ifz5-=2Wipy8OFhe}daqsXyn}+!w5`XWgQ@GW@C1J0qRw&9C-0-Yk0m zhi8BNtH-LZuM6E<89O&wwMxkB zVv6@G?Vi`Q??nSQ{Cx6fW@p@0Y1SFrHnYk;*`x2cJ7)djuk7p3o)h=jpQ3#rL#OlH n-8(T=_Z5~eNBE!Nz}CBr@y|bfKXU8nQjoBxtDnm{r-UW|Zc(R3 diff --git a/tests_zemu/snapshots/x-mainmenu/00010.png b/tests_zemu/snapshots/x-mainmenu/00010.png index c077084f153128e5d9a9e702ffd4a190b6a0779a..c4bc44149ab51b21150624ee35336558970807d2 100644 GIT binary patch delta 360 zcmey&)XY3VrQXZa#WAE}&fA-je1{cyTmz#@)!)>6-t)E(5HvNEyp%uguzHR3vB;@z=Ks_ZWu@lJ5!1TBxw~qly2L)-IK*mUw{*&+D<3z8wJr-P zK9O+G;%kImUCF)||CxX7@42??@-Ifq%?A-d!l2Nno+J1Fh0CM#T9BxxtDnm{r-UW| Dv9zc7 delta 344 zcmZo>{>(H%rQXWZ#WAE}&fA-@eTNlz+ya-)n!Dk@YNdXygX_A3OJ0^FsqcNRsT8pA ze9N=tA`A#n5U8Z2^!THE{VSci#p)kCw_bap`DWU7hAQ3dDXvSd-MaO=@nt}WWEK0} zMeJ!BH*~9*ifz5-=2Wipy8OFhe}daqsXyn}+!w5`XWgQ@GW@C1J0qRw&9C-0-Yk0m zhi8BNtH-LZuM6E<89O&wwMxkB zVv6@G?Vi`Q??nSQ{Cx6fW@p@0Y1SFrHnYk;*`x2cJ7)djuk7p3o)h=jpQ3#rL#OlH n-8(T=_Z5~eNBE!Nz}CBr@y|bfKXU8nQjoBxtDnm{r-UW|Zc(R3 diff --git a/tests_zemu/yarn.lock b/tests_zemu/yarn.lock index 1c243128..8a687d22 100644 --- a/tests_zemu/yarn.lock +++ b/tests_zemu/yarn.lock @@ -1266,10 +1266,10 @@ "@ledgerhq/hw-transport" "^6.28.1" varint "^6.0.0" -"@zondax/zemu@^0.40.1": - version "0.40.1" - resolved "https://registry.yarnpkg.com/@zondax/zemu/-/zemu-0.40.1.tgz#a06885f2dead2c5ede7cbb69a02d7d992ae738d1" - integrity sha512-SO7i++bHGITw9zCz+6tnCe3gTP6SN947uSMzkR+D5rKLidbrzN2vmw1Hf5Ueze3rVbcHHnQDtWLAucXIyhfvhw== +"@zondax/zemu@^0.42.1": + version "0.42.1" + resolved "https://registry.yarnpkg.com/@zondax/zemu/-/zemu-0.42.1.tgz#b60ae867b6c5400d47c817097125e818ce11644f" + integrity sha512-qT4FgCeZuOL6MllGibNzaIeQy1S8OABFlBnyTNNRFOSf5BgeSAhYJsvQ15k1W/1uqC0PnhswgFcf/E7uk2IzkA== dependencies: "@grpc/grpc-js" "^1.8.12" "@grpc/proto-loader" "^0.7.5"