Merge pull request #579 from LedgerHQ/fbe/remove_token_management_from_main_rebased

Remove token management from main
This commit is contained in:
apaillier-ledger
2024-05-07 18:20:33 +02:00
committed by GitHub
11 changed files with 92 additions and 64 deletions

View File

@@ -52,17 +52,17 @@ void eth_plugin_prepare_query_contract_UI(ethQueryContractUI_t *queryContractUI,
memset((uint8_t *) queryContractUI, 0, sizeof(ethQueryContractUI_t)); memset((uint8_t *) queryContractUI, 0, sizeof(ethQueryContractUI_t));
// If no extra information was found, set the pointer to NULL // If no extra information was found, set the pointer to NULL
if (NO_EXTRA_INFO(tmpCtx, 1)) { if (NO_EXTRA_INFO(tmpCtx, 0)) {
queryContractUI->item1 = NULL; queryContractUI->item1 = NULL;
} else { } else {
queryContractUI->item1 = &tmpCtx.transactionContext.extraInfo[1]; queryContractUI->item1 = &tmpCtx.transactionContext.extraInfo[0];
} }
// If no extra information was found, set the pointer to NULL // If no extra information was found, set the pointer to NULL
if (NO_EXTRA_INFO(tmpCtx, 0)) { if (NO_EXTRA_INFO(tmpCtx, 1)) {
queryContractUI->item2 = NULL; queryContractUI->item2 = NULL;
} else { } else {
queryContractUI->item2 = &tmpCtx.transactionContext.extraInfo[0]; queryContractUI->item2 = &tmpCtx.transactionContext.extraInfo[1];
} }
queryContractUI->screenIndex = screenIndex; queryContractUI->screenIndex = screenIndex;

View File

@@ -6,7 +6,7 @@
#define NO_EXTRA_INFO(ctx, idx) \ #define NO_EXTRA_INFO(ctx, idx) \
(allzeroes(&(ctx.transactionContext.extraInfo[idx]), sizeof(extraInfo_t))) (allzeroes(&(ctx.transactionContext.extraInfo[idx]), sizeof(extraInfo_t)))
#define NO_NFT_METADATA (NO_EXTRA_INFO(tmpCtx, 1)) #define NO_NFT_METADATA (NO_EXTRA_INFO(tmpCtx, 0))
void eth_plugin_prepare_init(ethPluginInitContract_t *init, void eth_plugin_prepare_init(ethPluginInitContract_t *init,
const uint8_t *selector, const uint8_t *selector,

View File

@@ -32,6 +32,7 @@
#include "challenge.h" #include "challenge.h"
#include "domain_name.h" #include "domain_name.h"
#include "crypto_helpers.h" #include "crypto_helpers.h"
#include "manage_asset_info.h"
unsigned char G_io_seproxyhal_spi_buffer[IO_SEPROXYHAL_BUFFER_SIZE_B]; unsigned char G_io_seproxyhal_spi_buffer[IO_SEPROXYHAL_BUFFER_SIZE_B];
@@ -79,6 +80,7 @@ void reset_app_context() {
eth2WithdrawalIndex = 0; eth2WithdrawalIndex = 0;
#endif #endif
memset((uint8_t *) &tmpCtx, 0, sizeof(tmpCtx)); memset((uint8_t *) &tmpCtx, 0, sizeof(tmpCtx));
forget_known_assets();
memset((uint8_t *) &txContext, 0, sizeof(txContext)); memset((uint8_t *) &txContext, 0, sizeof(txContext));
memset((uint8_t *) &tmpContent, 0, sizeof(tmpContent)); memset((uint8_t *) &tmpContent, 0, sizeof(tmpContent));
} }
@@ -114,22 +116,6 @@ unsigned short io_exchange_al(unsigned char channel, unsigned short tx_len) {
return 0; return 0;
} }
extraInfo_t *getKnownToken(const uint8_t *contractAddress) {
union extraInfo_t *currentItem = NULL;
// 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++) {
currentItem = (union extraInfo_t *) &tmpCtx.transactionContext.extraInfo[i].token;
if (tmpCtx.transactionContext.tokenSet[i] &&
(memcmp(currentItem->token.address, contractAddress, ADDRESS_LENGTH) == 0)) {
PRINTF("Token found at index %d\n", i);
return currentItem;
}
}
return NULL;
}
const uint8_t *parseBip32(const uint8_t *dataBuffer, uint8_t *dataLength, bip32_path_t *bip32) { const uint8_t *parseBip32(const uint8_t *dataBuffer, uint8_t *dataLength, bip32_path_t *bip32) {
if (*dataLength < 1) { if (*dataLength < 1) {
PRINTF("Invalid data\n"); PRINTF("Invalid data\n");
@@ -171,7 +157,7 @@ void handleApdu(unsigned int *flags, unsigned int *tx) {
switch (G_io_apdu_buffer[OFFSET_INS]) { switch (G_io_apdu_buffer[OFFSET_INS]) {
case INS_GET_PUBLIC_KEY: case INS_GET_PUBLIC_KEY:
memset(tmpCtx.transactionContext.tokenSet, 0, MAX_ITEMS); forget_known_assets();
handleGetPublicKey(G_io_apdu_buffer[OFFSET_P1], handleGetPublicKey(G_io_apdu_buffer[OFFSET_P1],
G_io_apdu_buffer[OFFSET_P2], G_io_apdu_buffer[OFFSET_P2],
G_io_apdu_buffer + OFFSET_CDATA, G_io_apdu_buffer + OFFSET_CDATA,
@@ -246,7 +232,7 @@ void handleApdu(unsigned int *flags, unsigned int *tx) {
break; break;
case INS_SIGN_PERSONAL_MESSAGE: case INS_SIGN_PERSONAL_MESSAGE:
memset(tmpCtx.transactionContext.tokenSet, 0, MAX_ITEMS); forget_known_assets();
*flags |= IO_ASYNCH_REPLY; *flags |= IO_ASYNCH_REPLY;
if (!handleSignPersonalMessage(G_io_apdu_buffer[OFFSET_P1], if (!handleSignPersonalMessage(G_io_apdu_buffer[OFFSET_P1],
G_io_apdu_buffer[OFFSET_P2], G_io_apdu_buffer[OFFSET_P2],
@@ -259,7 +245,7 @@ void handleApdu(unsigned int *flags, unsigned int *tx) {
case INS_SIGN_EIP_712_MESSAGE: case INS_SIGN_EIP_712_MESSAGE:
switch (G_io_apdu_buffer[OFFSET_P2]) { switch (G_io_apdu_buffer[OFFSET_P2]) {
case P2_EIP712_LEGACY_IMPLEM: case P2_EIP712_LEGACY_IMPLEM:
memset(tmpCtx.transactionContext.tokenSet, 0, MAX_ITEMS); forget_known_assets();
handleSignEIP712Message_v0(G_io_apdu_buffer[OFFSET_P1], handleSignEIP712Message_v0(G_io_apdu_buffer[OFFSET_P1],
G_io_apdu_buffer[OFFSET_P2], G_io_apdu_buffer[OFFSET_P2],
G_io_apdu_buffer + OFFSET_CDATA, G_io_apdu_buffer + OFFSET_CDATA,
@@ -281,7 +267,7 @@ void handleApdu(unsigned int *flags, unsigned int *tx) {
#ifdef HAVE_ETH2 #ifdef HAVE_ETH2
case INS_GET_ETH2_PUBLIC_KEY: case INS_GET_ETH2_PUBLIC_KEY:
memset(tmpCtx.transactionContext.tokenSet, 0, MAX_ITEMS); forget_known_assets();
handleGetEth2PublicKey(G_io_apdu_buffer[OFFSET_P1], handleGetEth2PublicKey(G_io_apdu_buffer[OFFSET_P1],
G_io_apdu_buffer[OFFSET_P2], G_io_apdu_buffer[OFFSET_P2],
G_io_apdu_buffer + OFFSET_CDATA, G_io_apdu_buffer + OFFSET_CDATA,
@@ -548,7 +534,6 @@ __attribute__((noreturn)) void coin_main(libargs_t *args) {
} }
reset_app_context(); reset_app_context();
tmpCtx.transactionContext.currentItemIndex = 0;
for (;;) { for (;;) {
UX_INIT(); UX_INIT();

48
src/manage_asset_info.c Normal file
View File

@@ -0,0 +1,48 @@
#include "manage_asset_info.h"
#include "shared_context.h"
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_ASSETS) {
return NULL;
}
return &tmpCtx.transactionContext.extraInfo[index];
}
static bool asset_info_is_set(uint8_t index) {
if (index >= MAX_ASSETS) {
return false;
}
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_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);
return currentItem;
}
}
return NULL;
}
extraInfo_t *get_current_asset_info(void) {
return get_asset_info(tmpCtx.transactionContext.currentAssetIndex);
}
void validate_current_asset_info(void) {
// mark it as set
tmpCtx.transactionContext.assetSet[tmpCtx.transactionContext.currentAssetIndex] = true;
// increment index
tmpCtx.transactionContext.currentAssetIndex =
(tmpCtx.transactionContext.currentAssetIndex + 1) % MAX_ASSETS;
}

8
src/manage_asset_info.h Normal file
View File

@@ -0,0 +1,8 @@
#include "shared_context.h"
#include "common_utils.h"
#include "asset_info.h"
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);

View File

@@ -22,6 +22,8 @@
#define N_storage (*(volatile internalStorage_t *) PIC(&N_storage_real)) #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 { typedef struct bip32_path_t {
uint8_t length; uint8_t length;
uint32_t path[MAX_BIP32_PATH]; uint32_t path[MAX_BIP32_PATH];
@@ -77,9 +79,9 @@ typedef struct publicKeyContext_t {
typedef struct transactionContext_t { typedef struct transactionContext_t {
bip32_path_t bip32; bip32_path_t bip32;
uint8_t hash[INT256_LENGTH]; uint8_t hash[INT256_LENGTH];
union extraInfo_t extraInfo[MAX_ITEMS]; union extraInfo_t extraInfo[MAX_ASSETS];
uint8_t tokenSet[MAX_ITEMS]; bool assetSet[MAX_ASSETS];
uint8_t currentItemIndex; uint8_t currentAssetIndex;
} transactionContext_t; } transactionContext_t;
typedef struct messageSigningContext_t { typedef struct messageSigningContext_t {

View File

@@ -1,5 +1,4 @@
#ifndef _UI_CALLBACKS_H_ #pragma once
#define _UI_CALLBACKS_H_
#include "shared_context.h" #include "shared_context.h"
#include "ux.h" #include "ux.h"
@@ -26,6 +25,3 @@ void ui_warning_contract_data(void);
void io_seproxyhal_send_status(uint32_t sw); void io_seproxyhal_send_status(uint32_t sw);
void finalizeParsing(bool direct); void finalizeParsing(bool direct);
extraInfo_t *getKnownToken(const uint8_t *contractAddress);
#endif // _UI_CALLBACKS_H_

View File

@@ -5,6 +5,7 @@
#include "os_io_seproxyhal.h" #include "os_io_seproxyhal.h"
#include "extra_tokens.h" #include "extra_tokens.h"
#include "network.h" #include "network.h"
#include "manage_asset_info.h"
#ifdef HAVE_CONTRACT_NAME_IN_DESCRIPTOR #ifdef HAVE_CONTRACT_NAME_IN_DESCRIPTOR
@@ -26,10 +27,7 @@ void handleProvideErc20TokenInformation(uint8_t p1,
cx_sha256_init(&sha256); cx_sha256_init(&sha256);
tmpCtx.transactionContext.currentItemIndex = tokenDefinition_t *token = &get_current_asset_info()->token;
(tmpCtx.transactionContext.currentItemIndex + 1) % MAX_ITEMS;
tokenDefinition_t *token =
&tmpCtx.transactionContext.tokens[tmpCtx.transactionContext.currentItemIndex];
if (dataLength < 1) { if (dataLength < 1) {
THROW(0x6A80); THROW(0x6A80);
@@ -95,7 +93,7 @@ void handleProvideErc20TokenInformation(uint8_t p1,
THROW(0x6A80); THROW(0x6A80);
#endif #endif
} }
tmpCtx.transactionContext.tokenSet[tmpCtx.transactionContext.currentItemIndex] = 1; validate_current_asset_info();
THROW(0x9000); THROW(0x9000);
} }
@@ -117,12 +115,9 @@ void handleProvideErc20TokenInformation(uint8_t p1,
uint8_t hash[INT256_LENGTH]; uint8_t hash[INT256_LENGTH];
cx_ecfp_public_key_t tokenKey; cx_ecfp_public_key_t tokenKey;
tmpCtx.transactionContext.currentItemIndex = tokenDefinition_t *token = &get_current_asset_info()->token;
(tmpCtx.transactionContext.currentItemIndex + 1) % MAX_ITEMS;
tokenDefinition_t *token =
&tmpCtx.transactionContext.extraInfo[tmpCtx.transactionContext.currentItemIndex].token;
PRINTF("Provisioning currentItemIndex %d\n", tmpCtx.transactionContext.currentItemIndex); PRINTF("Provisioning currentAssetIndex %d\n", tmpCtx.transactionContext.currentAssetIndex);
if (dataLength < 1) { if (dataLength < 1) {
THROW(0x6A80); THROW(0x6A80);
@@ -143,10 +138,11 @@ void handleProvideErc20TokenInformation(uint8_t p1,
memmove(token->address, workBuffer + offset, 20); memmove(token->address, workBuffer + offset, 20);
offset += 20; offset += 20;
dataLength -= 20; dataLength -= 20;
// TODO: Handle 64-bit long chain IDs // TODO: 4 bytes for this is overkill
token->decimals = U4BE(workBuffer, offset); token->decimals = U4BE(workBuffer, offset);
offset += 4; offset += 4;
dataLength -= 4; dataLength -= 4;
// TODO: Handle 64-bit long chain IDs
chain_id = U4BE(workBuffer, offset); chain_id = U4BE(workBuffer, offset);
if (!app_compatible_with_chain_id(&chain_id)) { if (!app_compatible_with_chain_id(&chain_id)) {
UNSUPPORTED_CHAIN_ID_MSG(chain_id); UNSUPPORTED_CHAIN_ID_MSG(chain_id);
@@ -183,7 +179,7 @@ void handleProvideErc20TokenInformation(uint8_t p1,
} }
} }
tmpCtx.transactionContext.tokenSet[tmpCtx.transactionContext.currentItemIndex] = 1; validate_current_asset_info();
THROW(0x9000); THROW(0x9000);
} }

View File

@@ -8,6 +8,7 @@
#include "os_io_seproxyhal.h" #include "os_io_seproxyhal.h"
#include "network.h" #include "network.h"
#include "public_keys.h" #include "public_keys.h"
#include "manage_asset_info.h"
#define TYPE_SIZE 1 #define TYPE_SIZE 1
#define VERSION_SIZE 1 #define VERSION_SIZE 1
@@ -56,12 +57,9 @@ void handleProvideNFTInformation(uint8_t p1,
PRINTF("NFT metadata provided without proper plugin loaded!\n"); PRINTF("NFT metadata provided without proper plugin loaded!\n");
THROW(0x6985); THROW(0x6985);
} }
tmpCtx.transactionContext.currentItemIndex = nftInfo_t *nft = &get_current_asset_info()->nft;
(tmpCtx.transactionContext.currentItemIndex + 1) % MAX_ITEMS;
nftInfo_t *nft =
&tmpCtx.transactionContext.extraInfo[tmpCtx.transactionContext.currentItemIndex].nft;
PRINTF("Provisioning currentItemIndex %d\n", tmpCtx.transactionContext.currentItemIndex); PRINTF("Provisioning currentAssetIndex %d\n", tmpCtx.transactionContext.currentAssetIndex);
size_t offset = 0; size_t offset = 0;
@@ -201,7 +199,7 @@ void handleProvideNFTInformation(uint8_t p1,
#endif #endif
} }
tmpCtx.transactionContext.tokenSet[tmpCtx.transactionContext.currentItemIndex] = 1; validate_current_asset_info();
THROW(0x9000); THROW(0x9000);
} }

View File

@@ -15,6 +15,7 @@
#include "apdu_constants.h" // APDU response codes #include "apdu_constants.h" // APDU response codes
#include "typed_data.h" #include "typed_data.h"
#include "commands_712.h" #include "commands_712.h"
#include "manage_asset_info.h"
#include "common_ui.h" #include "common_ui.h"
#include "domain_name.h" #include "domain_name.h"
#include "uint_common.h" #include "uint_common.h"
@@ -192,16 +193,9 @@ static void ui_712_format_str(const uint8_t *const data, uint8_t length) {
* @return the ticker name if found, \ref NULL otherwise * @return the ticker name if found, \ref NULL otherwise
*/ */
static const char *get_address_token_ticker(const uint8_t *addr) { static const char *get_address_token_ticker(const uint8_t *addr) {
tokenDefinition_t *token; extraInfo_t *extra_info = get_asset_info_by_addr(addr);
if (extra_info != NULL) {
// Loop over the received token information return extra_info->token.ticker;
for (uint8_t token_idx = 0; token_idx < MAX_ITEMS; ++token_idx) {
if (tmpCtx.transactionContext.tokenSet[token_idx] == 1) {
token = &tmpCtx.transactionContext.extraInfo[token_idx].token;
if (memcmp(token->address, addr, ADDRESS_LENGTH) == 0) {
return token->ticker;
}
}
} }
return NULL; return NULL;
} }

View File

@@ -10,6 +10,7 @@
#include "apdu_constants.h" #include "apdu_constants.h"
#include "crypto_helpers.h" #include "crypto_helpers.h"
#include "format.h" #include "format.h"
#include "manage_asset_info.h"
#define ERR_SILENT_MODE_CHECK_FAILED 0x6001 #define ERR_SILENT_MODE_CHECK_FAILED 0x6001
@@ -366,14 +367,14 @@ __attribute__((noinline)) static bool finalize_parsing_helper(bool direct, bool
if ((pluginFinalize.tokenLookup1 != NULL) || (pluginFinalize.tokenLookup2 != NULL)) { if ((pluginFinalize.tokenLookup1 != NULL) || (pluginFinalize.tokenLookup2 != NULL)) {
if (pluginFinalize.tokenLookup1 != NULL) { if (pluginFinalize.tokenLookup1 != NULL) {
PRINTF("Lookup1: %.*H\n", ADDRESS_LENGTH, pluginFinalize.tokenLookup1); PRINTF("Lookup1: %.*H\n", ADDRESS_LENGTH, pluginFinalize.tokenLookup1);
pluginProvideInfo.item1 = getKnownToken(pluginFinalize.tokenLookup1); pluginProvideInfo.item1 = get_asset_info_by_addr(pluginFinalize.tokenLookup1);
if (pluginProvideInfo.item1 != NULL) { if (pluginProvideInfo.item1 != NULL) {
PRINTF("Token1 ticker: %s\n", pluginProvideInfo.item1->token.ticker); PRINTF("Token1 ticker: %s\n", pluginProvideInfo.item1->token.ticker);
} }
} }
if (pluginFinalize.tokenLookup2 != NULL) { if (pluginFinalize.tokenLookup2 != NULL) {
PRINTF("Lookup2: %.*H\n", ADDRESS_LENGTH, pluginFinalize.tokenLookup2); PRINTF("Lookup2: %.*H\n", ADDRESS_LENGTH, pluginFinalize.tokenLookup2);
pluginProvideInfo.item2 = getKnownToken(pluginFinalize.tokenLookup2); pluginProvideInfo.item2 = get_asset_info_by_addr(pluginFinalize.tokenLookup2);
if (pluginProvideInfo.item2 != NULL) { if (pluginProvideInfo.item2 != NULL) {
PRINTF("Token2 ticker: %s\n", pluginProvideInfo.item2->token.ticker); PRINTF("Token2 ticker: %s\n", pluginProvideInfo.item2->token.ticker);
} }