From c2011f5d423edd32c3d245edf20eeb1492aec84f Mon Sep 17 00:00:00 2001 From: Alexandre Paillier Date: Tue, 7 May 2024 17:37:27 +0200 Subject: [PATCH] Renamed Item to Asset & changed the set marker type to boolean Also renamed the reset assets function --- src/main.c | 9 +++---- src/manage_asset_info.c | 24 ++++++++++--------- src/manage_asset_info.h | 2 +- src/shared_context.h | 8 ++++--- .../cmd_provideTokenInfo.c | 5 ++-- .../cmd_provideNFTInfo.c | 2 +- 6 files changed, 28 insertions(+), 22 deletions(-) diff --git a/src/main.c b/src/main.c index f76cae8..a1507b5 100644 --- a/src/main.c +++ b/src/main.c @@ -80,6 +80,7 @@ void reset_app_context() { eth2WithdrawalIndex = 0; #endif memset((uint8_t *) &tmpCtx, 0, sizeof(tmpCtx)); + forget_known_assets(); memset((uint8_t *) &txContext, 0, sizeof(txContext)); memset((uint8_t *) &tmpContent, 0, sizeof(tmpContent)); } @@ -156,7 +157,7 @@ void handleApdu(unsigned int *flags, unsigned int *tx) { switch (G_io_apdu_buffer[OFFSET_INS]) { case INS_GET_PUBLIC_KEY: - reset_known_tokens(); + forget_known_assets(); handleGetPublicKey(G_io_apdu_buffer[OFFSET_P1], G_io_apdu_buffer[OFFSET_P2], G_io_apdu_buffer + OFFSET_CDATA, @@ -231,7 +232,7 @@ void handleApdu(unsigned int *flags, unsigned int *tx) { break; case INS_SIGN_PERSONAL_MESSAGE: - reset_known_tokens(); + forget_known_assets(); *flags |= IO_ASYNCH_REPLY; if (!handleSignPersonalMessage(G_io_apdu_buffer[OFFSET_P1], G_io_apdu_buffer[OFFSET_P2], @@ -244,7 +245,7 @@ void handleApdu(unsigned int *flags, unsigned int *tx) { case INS_SIGN_EIP_712_MESSAGE: switch (G_io_apdu_buffer[OFFSET_P2]) { case P2_EIP712_LEGACY_IMPLEM: - reset_known_tokens(); + forget_known_assets(); handleSignEIP712Message_v0(G_io_apdu_buffer[OFFSET_P1], G_io_apdu_buffer[OFFSET_P2], G_io_apdu_buffer + OFFSET_CDATA, @@ -266,7 +267,7 @@ void handleApdu(unsigned int *flags, unsigned int *tx) { #ifdef HAVE_ETH2 case INS_GET_ETH2_PUBLIC_KEY: - reset_known_tokens(); + forget_known_assets(); handleGetEth2PublicKey(G_io_apdu_buffer[OFFSET_P1], G_io_apdu_buffer[OFFSET_P2], G_io_apdu_buffer + OFFSET_CDATA, diff --git a/src/manage_asset_info.c b/src/manage_asset_info.c index 6c915e2..d24b2a4 100644 --- a/src/manage_asset_info.c +++ b/src/manage_asset_info.c @@ -1,29 +1,30 @@ #include "manage_asset_info.h" +#include "shared_context.h" -void reset_known_tokens(void) { - memset(tmpCtx.transactionContext.tokenSet, 0, MAX_ITEMS); - tmpCtx.transactionContext.currentItemIndex = 0; +void forget_known_assets(void) { + memset(tmpCtx.transactionContext.assetSet, false, MAX_ASSETS); + tmpCtx.transactionContext.currentAssetIndex = 0; } static extraInfo_t *get_asset_info(uint8_t index) { - if (index >= MAX_ITEMS) { + if (index >= MAX_ASSETS) { return NULL; } return &tmpCtx.transactionContext.extraInfo[index]; } static bool asset_info_is_set(uint8_t index) { - if (index >= MAX_ITEMS) { + if (index >= MAX_ASSETS) { return false; } - return tmpCtx.transactionContext.tokenSet[index] != 0; + return tmpCtx.transactionContext.assetSet[index]; } extraInfo_t *get_asset_info_by_addr(const uint8_t *contractAddress) { // Works for ERC-20 & NFT tokens since both structs in the union have the // contract address aligned - for (uint8_t i = 0; i < MAX_ITEMS; i++) { - extraInfo_t *currentItem = &tmpCtx.transactionContext.extraInfo[i]; + for (uint8_t i = 0; i < MAX_ASSETS; i++) { + extraInfo_t *currentItem = get_asset_info(i); if (asset_info_is_set(i) && (memcmp(currentItem->token.address, contractAddress, ADDRESS_LENGTH) == 0)) { PRINTF("Token found at index %d\n", i); @@ -35,12 +36,13 @@ extraInfo_t *get_asset_info_by_addr(const uint8_t *contractAddress) { } extraInfo_t *get_current_asset_info(void) { - return get_asset_info(tmpCtx.transactionContext.currentItemIndex); + return get_asset_info(tmpCtx.transactionContext.currentAssetIndex); } void validate_current_asset_info(void) { // mark it as set - tmpCtx.transactionContext.tokenSet[tmpCtx.transactionContext.currentItemIndex] = 1; + tmpCtx.transactionContext.assetSet[tmpCtx.transactionContext.currentAssetIndex] = true; // increment index - tmpCtx.transactionContext.currentItemIndex = (tmpCtx.transactionContext.currentItemIndex + 1) % MAX_ITEMS; + tmpCtx.transactionContext.currentAssetIndex = + (tmpCtx.transactionContext.currentAssetIndex + 1) % MAX_ASSETS; } diff --git a/src/manage_asset_info.h b/src/manage_asset_info.h index fa478b4..9c9da5c 100644 --- a/src/manage_asset_info.h +++ b/src/manage_asset_info.h @@ -2,7 +2,7 @@ #include "common_utils.h" #include "asset_info.h" -void reset_known_tokens(void); +void forget_known_assets(void); extraInfo_t *get_asset_info_by_addr(const uint8_t *contractAddress); extraInfo_t *get_current_asset_info(void); void validate_current_asset_info(void); diff --git a/src/shared_context.h b/src/shared_context.h index 5109708..08dc70c 100644 --- a/src/shared_context.h +++ b/src/shared_context.h @@ -22,6 +22,8 @@ #define N_storage (*(volatile internalStorage_t *) PIC(&N_storage_real)) +#define MAX_ASSETS MAX_ITEMS // TODO: Temporary, remove once plugin SDK is updated + typedef struct bip32_path_t { uint8_t length; uint32_t path[MAX_BIP32_PATH]; @@ -77,9 +79,9 @@ typedef struct publicKeyContext_t { typedef struct transactionContext_t { bip32_path_t bip32; uint8_t hash[INT256_LENGTH]; - union extraInfo_t extraInfo[MAX_ITEMS]; - uint8_t tokenSet[MAX_ITEMS]; - uint8_t currentItemIndex; + union extraInfo_t extraInfo[MAX_ASSETS]; + bool assetSet[MAX_ASSETS]; + uint8_t currentAssetIndex; } transactionContext_t; typedef struct messageSigningContext_t { diff --git a/src_features/provideErc20TokenInformation/cmd_provideTokenInfo.c b/src_features/provideErc20TokenInformation/cmd_provideTokenInfo.c index f9b3bf5..06e2660 100644 --- a/src_features/provideErc20TokenInformation/cmd_provideTokenInfo.c +++ b/src_features/provideErc20TokenInformation/cmd_provideTokenInfo.c @@ -117,7 +117,7 @@ void handleProvideErc20TokenInformation(uint8_t p1, tokenDefinition_t *token = &get_current_asset_info()->token; - PRINTF("Provisioning currentItemIndex %d\n", tmpCtx.transactionContext.currentItemIndex); + PRINTF("Provisioning currentAssetIndex %d\n", tmpCtx.transactionContext.currentAssetIndex); if (dataLength < 1) { THROW(0x6A80); @@ -138,10 +138,11 @@ void handleProvideErc20TokenInformation(uint8_t p1, memmove(token->address, workBuffer + offset, 20); offset += 20; dataLength -= 20; - // TODO: Handle 64-bit long chain IDs + // TODO: 4 bytes for this is overkill token->decimals = U4BE(workBuffer, offset); offset += 4; dataLength -= 4; + // TODO: Handle 64-bit long chain IDs chain_id = U4BE(workBuffer, offset); if (!app_compatible_with_chain_id(&chain_id)) { UNSUPPORTED_CHAIN_ID_MSG(chain_id); diff --git a/src_features/provideNFTInformation/cmd_provideNFTInfo.c b/src_features/provideNFTInformation/cmd_provideNFTInfo.c index 147887c..106ce77 100644 --- a/src_features/provideNFTInformation/cmd_provideNFTInfo.c +++ b/src_features/provideNFTInformation/cmd_provideNFTInfo.c @@ -59,7 +59,7 @@ void handleProvideNFTInformation(uint8_t p1, } nftInfo_t *nft = &get_current_asset_info()->nft; - PRINTF("Provisioning currentItemIndex %d\n", tmpCtx.transactionContext.currentItemIndex); + PRINTF("Provisioning currentAssetIndex %d\n", tmpCtx.transactionContext.currentAssetIndex); size_t offset = 0;