Merge pull request #132 from LedgerHQ/deversifi_proxy

Deversifi proxy
This commit is contained in:
Jean P
2021-04-16 10:24:02 +02:00
committed by GitHub
4 changed files with 208 additions and 28 deletions

View File

@@ -30,8 +30,8 @@ APP_LOAD_PARAMS += --path "45'"
APPVERSION_M=1
APPVERSION_N=6
APPVERSION_P=5
APPVERSION=$(APPVERSION_M).$(APPVERSION_N).$(APPVERSION_P)
APPVERSION_P=6
APPVERSION=$(APPVERSION_M).$(APPVERSION_N).$(APPVERSION_P)-dvf2
APP_LOAD_FLAGS= --appFlags 0x240 --dep Ethereum:$(APPVERSION)
ifeq ($(CHAIN),)

View File

@@ -67,6 +67,19 @@ static const uint8_t const STARKWARE_DEPOSIT_NFT_RECLAIM_ID[SELECTOR_SIZE] = {0x
static const uint8_t const STARKWARE_WITHDRAW_AND_MINT_ID[SELECTOR_SIZE] = {0xd9, 0x14, 0x43, 0xb7};
static const uint8_t const STARKWARE_WITHDRAW_NFT_ID[SELECTOR_SIZE] = {0x01, 0x9b, 0x41, 0x7a};
static const uint8_t const STARKWARE_WITHDRAW_NFT_TO_ID[SELECTOR_SIZE] = {0xeb, 0xef, 0x0f, 0xd0};
static const uint8_t const STARKWARE_REGISTER_AND_DEPOSIT_TOKEN_ID[SELECTOR_SIZE] = {0x10,
0x82,
0x08,
0xcf};
static const uint8_t const STARKWARE_REGISTER_AND_DEPOSIT_ETH_ID[SELECTOR_SIZE] = {0xa7,
0x78,
0xc0,
0xc3};
static const uint8_t const STARKWARE_PROXY_DEPOSIT_TOKEN_ID[SELECTOR_SIZE] = {0xdc,
0xca,
0xd5,
0x24};
static const uint8_t const STARKWARE_PROXY_DEPOSIT_ETH_ID[SELECTOR_SIZE] = {0x6c, 0xe5, 0xd9, 0x57};
const uint8_t* const STARKWARE_SELECTORS[NUM_STARKWARE_SELECTORS] = {
STARKWARE_REGISTER_ID,
@@ -84,7 +97,11 @@ const uint8_t* const STARKWARE_SELECTORS[NUM_STARKWARE_SELECTORS] = {
STARKWARE_DEPOSIT_NFT_RECLAIM_ID,
STARKWARE_WITHDRAW_AND_MINT_ID,
STARKWARE_WITHDRAW_NFT_ID,
STARKWARE_WITHDRAW_NFT_TO_ID};
STARKWARE_WITHDRAW_NFT_TO_ID,
STARKWARE_REGISTER_AND_DEPOSIT_TOKEN_ID,
STARKWARE_REGISTER_AND_DEPOSIT_ETH_ID,
STARKWARE_PROXY_DEPOSIT_TOKEN_ID,
STARKWARE_PROXY_DEPOSIT_ETH_ID};
#endif
@@ -117,7 +134,11 @@ const internalEthPlugin_t const INTERNAL_ETH_PLUGINS[] = {
#ifdef HAVE_STARKWARE
{NULL, (const uint8_t**) STARKWARE_SELECTORS, 10, "-strk", starkware_plugin_call},
{NULL,
(const uint8_t**) STARKWARE_SELECTORS,
NUM_STARKWARE_SELECTORS,
"-strk",
starkware_plugin_call},
#endif

View File

@@ -32,7 +32,7 @@ extern const uint8_t* const ETH2_SELECTORS[NUM_ETH2_SELECTORS];
#ifdef HAVE_STARKWARE
#define NUM_STARKWARE_SELECTORS 16
#define NUM_STARKWARE_SELECTORS 20
extern const uint8_t* const STARKWARE_SELECTORS[NUM_STARKWARE_SELECTORS];
#endif

View File

@@ -24,14 +24,23 @@ typedef enum {
STARKWARE_DEPOSIT_NFT_RECLAIM,
STARKWARE_WITHDRAW_AND_MINT,
STARKWARE_WITHDRAW_NFT,
STARKWARE_WITHDRAW_NFT_TO
STARKWARE_WITHDRAW_NFT_TO,
STARKWARE_REGISTER_AND_DEPOSIT_TOKEN,
STARKWARE_REGISTER_AND_DEPOSIT_ETH,
STARKWARE_PROXY_DEPOSIT_TOKEN,
STARKWARE_PROXY_DEPOSIT_ETH,
} starkwareSelector_t;
#ifndef HAVE_TOKENS_EXTRA_LIST
static const uint8_t DEVERSIFI_CONTRACT[] = {0x01, 0x5d, 0x22, 0x04, 0x5d, 0xac, 0xea,
0xb0, 0x3b, 0x15, 0x80, 0x31, 0xec, 0xb7,
0xd9, 0xd0, 0x6f, 0xad, 0x24, 0x60, 0x9b};
static const uint8_t DEVERSIFI_CONTRACT[] = {
0x02,
0x5d, 0x22, 0x04, 0x5d, 0xac, 0xea, 0xb0, 0x3b, 0x15, 0x80,
0x31, 0xec, 0xb7, 0xd9, 0xd0, 0x6f, 0xad, 0x24, 0x60, 0x9b,
0x7d, 0xe1, 0xf0, 0x42, 0x04, 0xef, 0x29, 0x22, 0x9d, 0x84,
0xe7, 0xc0, 0xc2, 0xd1, 0x21, 0x6c, 0x28, 0x64, 0x5a, 0x15};
#else
@@ -112,6 +121,17 @@ static const uint8_t DEVERSIFI_CONTRACT[] = {
// To Eth Address
// NFT Contract
// Token ID
// register and deposit token : stark key (32), variable signature, verify assetType (32), vault Id
// (4), quantized amount (32), token address (20), quantum (32) Register and deposit Contract Name
// From ETH address
// Master account
// Token Account
// Amount
// register and deposit : stark key (32), variable signature, verify assetType (32), vault Id (4)
// flow similar to register and deposit
// deposit token proxy : stark key (32), verify assetType (32), vault Id (4), quantized Amount (32),
// token address (20), quantum (32) flow similar to deposit deposit proxy : stark key (32), verify
// assetType (32), vault Id (4) flow similar to deposit
static const uint8_t STARKWARE_EXPECTED_DATA_SIZE[] = {0,
4 + 32 + 32 + 32 + 32,
@@ -128,24 +148,15 @@ static const uint8_t STARKWARE_EXPECTED_DATA_SIZE[] = {0,
4 + 32 + 32 + 32 + 32,
0,
4 + 32 + 32 + 32,
4 + 32 + 32 + 32 + 32};
4 + 32 + 32 + 32 + 32,
0,
0,
4 + 32 + 32 + 32 + 32 + 32 + 32,
4 + 32 + 32 + 32};
static const uint8_t STARKWARE_NUM_SCREENS[] = {4 - 1,
5 - 1,
5 - 1,
4 - 1,
4 - 1,
5 - 1,
4 - 1,
4 - 1,
5 - 1,
2 - 1,
5 - 1,
6 - 1,
6 - 1,
4 - 1,
6 - 1,
6 - 1};
static const uint8_t STARKWARE_NUM_SCREENS[] = {4 - 1, 5 - 1, 5 - 1, 4 - 1, 4 - 1, 5 - 1, 4 - 1,
4 - 1, 5 - 1, 2 - 1, 5 - 1, 6 - 1, 6 - 1, 4 - 1,
6 - 1, 6 - 1, 6 - 1, 6 - 1, 5 - 1, 5 - 1};
typedef struct starkware_parameters_t {
uint8_t vaultId[4];
@@ -198,6 +209,46 @@ bool starkware_verify_asset_id(uint8_t *tmp32, uint8_t *tokenId, bool assetTypeO
return true;
}
bool starkware_verify_token(uint8_t *token) {
if (quantumSet) {
if (dataContext.tokenContext.quantumIndex != MAX_TOKEN) {
tokenDefinition_t *currentToken =
&tmpCtx.transactionContext.tokens[dataContext.tokenContext.quantumIndex];
if (memcmp(token + 32 - 20, currentToken->address, 20) != 0) {
PRINTF("Token not matching got %.*H\n", 20, token + 32 - 20);
PRINTF("Current token %.*H\n", 20, currentToken->address);
return false;
}
} else {
PRINTF("Quantum not set\n");
return false;
}
} else {
PRINTF("Quantum not set\n");
return false;
}
return true;
}
bool starkware_verify_quantum(uint8_t *quantum) {
if (quantumSet) {
if (dataContext.tokenContext.quantumIndex != MAX_TOKEN) {
if (memcmp(quantum, dataContext.tokenContext.quantum, 32) != 0) {
PRINTF("Quantum not matching got %.*H\n", 32, quantum);
PRINTF("Current quantum %.*H\n", 32, dataContext.tokenContext.quantum);
return false;
}
} else {
PRINTF("Quantum not set\n");
return false;
}
} else {
PRINTF("Quantum not set\n");
return false;
}
return true;
}
bool starkware_verify_nft_token_id(uint8_t *tokenId) {
if (!quantumSet) {
PRINTF("Quantum not set\n");
@@ -389,6 +440,10 @@ void starkware_plugin_call(int message, void *parameters) {
case STARKWARE_WITHDRAW_AND_MINT:
case STARKWARE_WITHDRAW_NFT:
case STARKWARE_WITHDRAW_NFT_TO:
case STARKWARE_REGISTER_AND_DEPOSIT_TOKEN:
case STARKWARE_REGISTER_AND_DEPOSIT_ETH:
case STARKWARE_PROXY_DEPOSIT_TOKEN:
case STARKWARE_PROXY_DEPOSIT_ETH:
memmove(context->starkKey, msg->parameter, 32);
break;
@@ -426,10 +481,17 @@ void starkware_plugin_call(int message, void *parameters) {
case STARKWARE_WITHDRAW_AND_MINT:
case STARKWARE_WITHDRAW_NFT:
case STARKWARE_WITHDRAW_NFT_TO:
case STARKWARE_PROXY_DEPOSIT_TOKEN:
case STARKWARE_PROXY_DEPOSIT_ETH:
context->validToken =
starkware_verify_asset_id(context->amount, msg->parameter, true);
break;
case STARKWARE_REGISTER_AND_DEPOSIT_TOKEN:
case STARKWARE_REGISTER_AND_DEPOSIT_ETH:
// drop variable byte array signature offset
break;
default:
break;
}
@@ -439,6 +501,8 @@ void starkware_plugin_call(int message, void *parameters) {
case 4 + 32 + 32:
switch (context->selectorIndex) {
case STARKWARE_ESCAPE:
case STARKWARE_REGISTER_AND_DEPOSIT_TOKEN:
case STARKWARE_REGISTER_AND_DEPOSIT_ETH:
context->validToken =
starkware_verify_asset_id(context->amount, msg->parameter, true);
break;
@@ -449,6 +513,8 @@ void starkware_plugin_call(int message, void *parameters) {
case STARKWARE_DEPOSIT_TOKEN:
case STARKWARE_DEPOSIT_NFT:
case STARKWARE_DEPOSIT_NFT_RECLAIM:
case STARKWARE_PROXY_DEPOSIT_TOKEN:
case STARKWARE_PROXY_DEPOSIT_ETH:
memmove(context->vaultId, msg->parameter + 32 - 4, 4);
break;
@@ -471,6 +537,7 @@ void starkware_plugin_call(int message, void *parameters) {
switch (context->selectorIndex) {
case STARKWARE_ESCAPE:
case STARKWARE_DEPOSIT_TOKEN:
case STARKWARE_PROXY_DEPOSIT_TOKEN:
memmove(context->amount, msg->parameter, 32);
break;
@@ -483,16 +550,73 @@ void starkware_plugin_call(int message, void *parameters) {
context->validToken = starkware_verify_nft_token_id(msg->parameter);
break;
case STARKWARE_REGISTER_AND_DEPOSIT_TOKEN:
case STARKWARE_REGISTER_AND_DEPOSIT_ETH:
memmove(context->vaultId, msg->parameter + 32 - 4, 4);
break;
default:
break;
}
msg->result = ETH_PLUGIN_RESULT_OK;
break;
case 4 + 32 + 32 + 32 + 32:
switch (context->selectorIndex) {
switch (context->selectorIndex) {
case STARKWARE_REGISTER_AND_DEPOSIT_TOKEN:
memmove(context->amount, msg->parameter, 32);
break;
case STARKWARE_PROXY_DEPOSIT_TOKEN:
context->validToken = starkware_verify_token(msg->parameter);
break;
default:
break;
}
}
msg->result = ETH_PLUGIN_RESULT_OK;
break;
case 4 + 32 + 32 + 32 + 32 + 32:
switch (context->selectorIndex) {
switch (context->selectorIndex) {
case STARKWARE_REGISTER_AND_DEPOSIT_TOKEN:
context->validToken = starkware_verify_token(msg->parameter);
break;
case STARKWARE_PROXY_DEPOSIT_TOKEN:
context->validToken = starkware_verify_quantum(msg->parameter);
break;
default:
break;
}
}
msg->result = ETH_PLUGIN_RESULT_OK;
break;
case 4 + 32 + 32 + 32 + 32 + 32 + 32:
switch (context->selectorIndex) {
switch (context->selectorIndex) {
case STARKWARE_REGISTER_AND_DEPOSIT_TOKEN:
context->validToken = starkware_verify_quantum(msg->parameter);
break;
default:
break;
}
}
msg->result = ETH_PLUGIN_RESULT_OK;
break;
default:
switch (context->selectorIndex) {
case STARKWARE_REGISTER:
case STARKWARE_VERIFY_ESCAPE:
case STARKWARE_REGISTER_AND_DEPOSIT_TOKEN:
case STARKWARE_REGISTER_AND_DEPOSIT_ETH:
msg->result = ETH_PLUGIN_RESULT_OK;
break;
@@ -527,6 +651,8 @@ void starkware_plugin_call(int message, void *parameters) {
case STARKWARE_DEPOSIT_TOKEN:
case STARKWARE_DEPOSIT_ETH:
case STARKWARE_DEPOSIT_NFT:
case STARKWARE_PROXY_DEPOSIT_TOKEN:
case STARKWARE_PROXY_DEPOSIT_ETH:
strcpy(msg->name, "Deposit");
break;
case STARKWARE_DEPOSIT_CANCEL:
@@ -557,6 +683,10 @@ void starkware_plugin_call(int message, void *parameters) {
case STARKWARE_WITHDRAW_NFT_TO:
strcpy(msg->name, "Withdrawal To");
break;
case STARKWARE_REGISTER_AND_DEPOSIT_TOKEN:
case STARKWARE_REGISTER_AND_DEPOSIT_ETH:
strcpy(msg->name, "Register&Deposit");
break;
default:
break;
@@ -583,6 +713,8 @@ void starkware_plugin_call(int message, void *parameters) {
case 1:
switch (context->selectorIndex) {
case STARKWARE_REGISTER:
case STARKWARE_REGISTER_AND_DEPOSIT_TOKEN:
case STARKWARE_REGISTER_AND_DEPOSIT_ETH:
strcpy(msg->title, "From ETH Address");
starkware_print_eth_address(context->amount, msg->msg);
break;
@@ -592,6 +724,8 @@ void starkware_plugin_call(int message, void *parameters) {
break;
case STARKWARE_DEPOSIT_TOKEN:
case STARKWARE_DEPOSIT_ETH:
case STARKWARE_PROXY_DEPOSIT_TOKEN:
case STARKWARE_PROXY_DEPOSIT_ETH:
case STARKWARE_DEPOSIT_CANCEL:
case STARKWARE_DEPOSIT_RECLAIM:
case STARKWARE_WITHDRAW:
@@ -619,12 +753,16 @@ void starkware_plugin_call(int message, void *parameters) {
switch (context->selectorIndex) {
case STARKWARE_REGISTER:
case STARKWARE_ESCAPE:
case STARKWARE_REGISTER_AND_DEPOSIT_TOKEN:
case STARKWARE_REGISTER_AND_DEPOSIT_ETH:
strcpy(msg->title, "Master Account");
starkware_print_stark_key(context->starkKey, msg->msg);
break;
case STARKWARE_DEPOSIT_TOKEN:
case STARKWARE_DEPOSIT_ETH:
case STARKWARE_PROXY_DEPOSIT_TOKEN:
case STARKWARE_PROXY_DEPOSIT_ETH:
case STARKWARE_DEPOSIT_CANCEL:
case STARKWARE_DEPOSIT_RECLAIM:
case STARKWARE_FULL_WITHDRAW:
@@ -666,10 +804,14 @@ void starkware_plugin_call(int message, void *parameters) {
break;
case STARKWARE_DEPOSIT_TOKEN:
case STARKWARE_DEPOSIT_ETH:
case STARKWARE_PROXY_DEPOSIT_TOKEN:
case STARKWARE_PROXY_DEPOSIT_ETH:
strcpy(msg->title, "Amount");
starkware_print_amount(
(context->selectorIndex == STARKWARE_DEPOSIT_ETH ? NULL
: context->amount),
(((context->selectorIndex == STARKWARE_DEPOSIT_ETH) ||
(context->selectorIndex == STARKWARE_PROXY_DEPOSIT_ETH))
? NULL
: context->amount),
msg->msg,
false);
break;
@@ -687,6 +829,12 @@ void starkware_plugin_call(int message, void *parameters) {
starkware_print_asset_contract(msg->msg);
break;
case STARKWARE_REGISTER_AND_DEPOSIT_TOKEN:
case STARKWARE_REGISTER_AND_DEPOSIT_ETH:
strcpy(msg->title, "Token Account");
starkware_print_vault_id(U4BE(context->vaultId, 0), msg->msg);
break;
default:
PRINTF("Unexpected screen %d for %d\n",
msg->screenIndex,
@@ -706,6 +854,17 @@ void starkware_plugin_call(int message, void *parameters) {
starkware_print_stark_key(dataContext.tokenContext.quantum, msg->msg);
break;
case STARKWARE_REGISTER_AND_DEPOSIT_TOKEN:
case STARKWARE_REGISTER_AND_DEPOSIT_ETH:
strcpy(msg->title, "Amount");
starkware_print_amount(
((context->selectorIndex == STARKWARE_REGISTER_AND_DEPOSIT_ETH)
? NULL
: context->amount),
msg->msg,
false);
break;
default:
PRINTF("Unexpected screen %d for %d\n",
msg->screenIndex,