Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Remove token management from main #579

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
Loading