Skip to content

Commit

Permalink
Merge pull request #579 from LedgerHQ/fbe/remove_token_management_fro…
Browse files Browse the repository at this point in the history
…m_main_rebased

Remove token management from main
  • Loading branch information
apaillier-ledger authored May 7, 2024
2 parents 5e661fd + c2011f5 commit 5b2f73b
Show file tree
Hide file tree
Showing 11 changed files with 92 additions and 64 deletions.
8 changes: 4 additions & 4 deletions src/eth_plugin_handler.c
Original file line number Diff line number Diff line change
Expand Up @@ -52,17 +52,17 @@ void eth_plugin_prepare_query_contract_UI(ethQueryContractUI_t *queryContractUI,
memset((uint8_t *) queryContractUI, 0, sizeof(ethQueryContractUI_t));

// 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;
} 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_INFO(tmpCtx, 0)) {
if (NO_EXTRA_INFO(tmpCtx, 1)) {
queryContractUI->item2 = NULL;
} else {
queryContractUI->item2 = &tmpCtx.transactionContext.extraInfo[0];
queryContractUI->item2 = &tmpCtx.transactionContext.extraInfo[1];
}

queryContractUI->screenIndex = screenIndex;
Expand Down
2 changes: 1 addition & 1 deletion src/eth_plugin_handler.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
#define NO_EXTRA_INFO(ctx, idx) \
(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,
const uint8_t *selector,
Expand Down
27 changes: 6 additions & 21 deletions src/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
#include "challenge.h"
#include "domain_name.h"
#include "crypto_helpers.h"
#include "manage_asset_info.h"

unsigned char G_io_seproxyhal_spi_buffer[IO_SEPROXYHAL_BUFFER_SIZE_B];

Expand Down Expand Up @@ -79,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));
}
Expand Down Expand Up @@ -114,22 +116,6 @@ unsigned short io_exchange_al(unsigned char channel, unsigned short tx_len) {
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) {
if (*dataLength < 1) {
PRINTF("Invalid data\n");
Expand Down Expand Up @@ -171,7 +157,7 @@ void handleApdu(unsigned int *flags, unsigned int *tx) {

switch (G_io_apdu_buffer[OFFSET_INS]) {
case INS_GET_PUBLIC_KEY:
memset(tmpCtx.transactionContext.tokenSet, 0, MAX_ITEMS);
forget_known_assets();
handleGetPublicKey(G_io_apdu_buffer[OFFSET_P1],
G_io_apdu_buffer[OFFSET_P2],
G_io_apdu_buffer + OFFSET_CDATA,
Expand Down Expand Up @@ -246,7 +232,7 @@ void handleApdu(unsigned int *flags, unsigned int *tx) {
break;

case INS_SIGN_PERSONAL_MESSAGE:
memset(tmpCtx.transactionContext.tokenSet, 0, MAX_ITEMS);
forget_known_assets();
*flags |= IO_ASYNCH_REPLY;
if (!handleSignPersonalMessage(G_io_apdu_buffer[OFFSET_P1],
G_io_apdu_buffer[OFFSET_P2],
Expand All @@ -259,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:
memset(tmpCtx.transactionContext.tokenSet, 0, MAX_ITEMS);
forget_known_assets();
handleSignEIP712Message_v0(G_io_apdu_buffer[OFFSET_P1],
G_io_apdu_buffer[OFFSET_P2],
G_io_apdu_buffer + OFFSET_CDATA,
Expand All @@ -281,7 +267,7 @@ void handleApdu(unsigned int *flags, unsigned int *tx) {
#ifdef HAVE_ETH2

case INS_GET_ETH2_PUBLIC_KEY:
memset(tmpCtx.transactionContext.tokenSet, 0, MAX_ITEMS);
forget_known_assets();
handleGetEth2PublicKey(G_io_apdu_buffer[OFFSET_P1],
G_io_apdu_buffer[OFFSET_P2],
G_io_apdu_buffer + OFFSET_CDATA,
Expand Down Expand Up @@ -548,7 +534,6 @@ __attribute__((noreturn)) void coin_main(libargs_t *args) {
}

reset_app_context();
tmpCtx.transactionContext.currentItemIndex = 0;

for (;;) {
UX_INIT();
Expand Down
48 changes: 48 additions & 0 deletions src/manage_asset_info.c
Original file line number Diff line number Diff line change
@@ -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 changes: 8 additions & 0 deletions src/manage_asset_info.h
Original file line number Diff line number Diff line change
@@ -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);
8 changes: 5 additions & 3 deletions src/shared_context.h
Original file line number Diff line number Diff line change
Expand Up @@ -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];
Expand Down Expand Up @@ -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 {
Expand Down
6 changes: 1 addition & 5 deletions src/ui_callbacks.h
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
#ifndef _UI_CALLBACKS_H_
#define _UI_CALLBACKS_H_
#pragma once

#include "shared_context.h"
#include "ux.h"
Expand All @@ -26,6 +25,3 @@ void ui_warning_contract_data(void);

void io_seproxyhal_send_status(uint32_t sw);
void finalizeParsing(bool direct);
extraInfo_t *getKnownToken(const uint8_t *contractAddress);

#endif // _UI_CALLBACKS_H_
20 changes: 8 additions & 12 deletions src_features/provideErc20TokenInformation/cmd_provideTokenInfo.c
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
#include "os_io_seproxyhal.h"
#include "extra_tokens.h"
#include "network.h"
#include "manage_asset_info.h"

#ifdef HAVE_CONTRACT_NAME_IN_DESCRIPTOR

Expand All @@ -26,10 +27,7 @@ void handleProvideErc20TokenInformation(uint8_t p1,

cx_sha256_init(&sha256);

tmpCtx.transactionContext.currentItemIndex =
(tmpCtx.transactionContext.currentItemIndex + 1) % MAX_ITEMS;
tokenDefinition_t *token =
&tmpCtx.transactionContext.tokens[tmpCtx.transactionContext.currentItemIndex];
tokenDefinition_t *token = &get_current_asset_info()->token;

if (dataLength < 1) {
THROW(0x6A80);
Expand Down Expand Up @@ -95,7 +93,7 @@ void handleProvideErc20TokenInformation(uint8_t p1,
THROW(0x6A80);
#endif
}
tmpCtx.transactionContext.tokenSet[tmpCtx.transactionContext.currentItemIndex] = 1;
validate_current_asset_info();
THROW(0x9000);
}

Expand All @@ -117,12 +115,9 @@ void handleProvideErc20TokenInformation(uint8_t p1,
uint8_t hash[INT256_LENGTH];
cx_ecfp_public_key_t tokenKey;

tmpCtx.transactionContext.currentItemIndex =
(tmpCtx.transactionContext.currentItemIndex + 1) % MAX_ITEMS;
tokenDefinition_t *token =
&tmpCtx.transactionContext.extraInfo[tmpCtx.transactionContext.currentItemIndex].token;
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);
Expand All @@ -143,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);
Expand Down Expand Up @@ -183,7 +179,7 @@ void handleProvideErc20TokenInformation(uint8_t p1,
}
}

tmpCtx.transactionContext.tokenSet[tmpCtx.transactionContext.currentItemIndex] = 1;
validate_current_asset_info();
THROW(0x9000);
}

Expand Down
10 changes: 4 additions & 6 deletions src_features/provideNFTInformation/cmd_provideNFTInfo.c
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
#include "os_io_seproxyhal.h"
#include "network.h"
#include "public_keys.h"
#include "manage_asset_info.h"

#define TYPE_SIZE 1
#define VERSION_SIZE 1
Expand Down Expand Up @@ -56,12 +57,9 @@ void handleProvideNFTInformation(uint8_t p1,
PRINTF("NFT metadata provided without proper plugin loaded!\n");
THROW(0x6985);
}
tmpCtx.transactionContext.currentItemIndex =
(tmpCtx.transactionContext.currentItemIndex + 1) % MAX_ITEMS;
nftInfo_t *nft =
&tmpCtx.transactionContext.extraInfo[tmpCtx.transactionContext.currentItemIndex].nft;
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;

Expand Down Expand Up @@ -201,7 +199,7 @@ void handleProvideNFTInformation(uint8_t p1,
#endif
}

tmpCtx.transactionContext.tokenSet[tmpCtx.transactionContext.currentItemIndex] = 1;
validate_current_asset_info();
THROW(0x9000);
}

Expand Down
14 changes: 4 additions & 10 deletions src_features/signMessageEIP712/ui_logic.c
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
#include "apdu_constants.h" // APDU response codes
#include "typed_data.h"
#include "commands_712.h"
#include "manage_asset_info.h"
#include "common_ui.h"
#include "domain_name.h"
#include "uint_common.h"
Expand Down Expand Up @@ -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
*/
static const char *get_address_token_ticker(const uint8_t *addr) {
tokenDefinition_t *token;

// Loop over the received token information
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;
}
}
extraInfo_t *extra_info = get_asset_info_by_addr(addr);
if (extra_info != NULL) {
return extra_info->token.ticker;
}
return NULL;
}
Expand Down
5 changes: 3 additions & 2 deletions src_features/signTx/logic_signTx.c
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
#include "apdu_constants.h"
#include "crypto_helpers.h"
#include "format.h"
#include "manage_asset_info.h"

#define ERR_SILENT_MODE_CHECK_FAILED 0x6001

Expand Down Expand Up @@ -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) {
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) {
PRINTF("Token1 ticker: %s\n", pluginProvideInfo.item1->token.ticker);
}
}
if (pluginFinalize.tokenLookup2 != NULL) {
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) {
PRINTF("Token2 ticker: %s\n", pluginProvideInfo.item2->token.ticker);
}
Expand Down

0 comments on commit 5b2f73b

Please sign in to comment.