Skip to content

Commit

Permalink
Merge pull request #206 from Zondax/dev
Browse files Browse the repository at this point in the history
Dev
  • Loading branch information
chcmedeiros committed Sep 5, 2023
2 parents f40ae70 + 41f7f55 commit 813aedc
Show file tree
Hide file tree
Showing 96 changed files with 471 additions and 76 deletions.
2 changes: 1 addition & 1 deletion app/Makefile.version
@@ -1,3 +1,3 @@
APPVERSION_M=2
APPVERSION_N=5
APPVERSION_P=3
APPVERSION_P=4
2 changes: 2 additions & 0 deletions app/src/apdu_handler.c
Expand Up @@ -364,6 +364,7 @@ __Z_INLINE void handleSignSecp256k1(volatile uint32_t *flags, volatile uint32_t
#if defined(APP_CONSUMER)
CHECK_APP_CANARY()
view_review_init(tx_getItem, tx_getNumItems, app_sign_secp256k1);
view_inspect_init(tx_getInnerItem, tx_getNumInnerItems, tx_canInspectItem);
view_review_show(REVIEW_TXN);
*flags |= IO_ASYNCH_REPLY;
#endif
Expand Down Expand Up @@ -478,6 +479,7 @@ __Z_INLINE void handleSignSr25519(volatile uint32_t *flags, volatile uint32_t *t
#if defined(APP_CONSUMER)
CHECK_APP_CANARY()
view_review_init(tx_getItem, tx_getNumItems, app_return_sr25519);
view_inspect_init(tx_getInnerItem, tx_getNumInnerItems, tx_canInspectItem);
view_review_show(REVIEW_TXN);
*flags |= IO_ASYNCH_REPLY;
#endif
Expand Down
3 changes: 2 additions & 1 deletion app/src/consumer/coin_consumer.h
Expand Up @@ -82,7 +82,8 @@ extern "C" {
#define COIN_TESTNET_DENOM "TEST"
#define COIN_DENOM ""
#define COIN_ADDRESS_VERSION 0
#define COIN_ADDRESS_CONTEXT "oasis-core/address: staking"
#define COIN_ADDRESS_ED25519_CONTEXT "oasis-core/address: staking"
#define COIN_ADDRESS_SR25519_CONTEXT "oasis-runtime-sdk/address: sr25519"

#define DATA_CONTINUE "..."
#define DATA_SAMPLE_SIZE 10
Expand Down
28 changes: 21 additions & 7 deletions app/src/consumer/parser_consumer.c
Expand Up @@ -61,7 +61,8 @@ static const char * methodsMap[] = {
"Reclaim escrow", "Amend commission schedule", "Deregister Entity",
"Unfreeze Node", "Register Entity", "Submit proposal", "Cast vote",
" Transfer (ParaTime)", " Deposit (ParaTime)",
" Withdraw (ParaTime)"," Instantiate (ParaTime)",
" Withdraw (ParaTime)", " Delegate (ParaTime)",
" Undelegate (ParaTime)"," Instantiate (ParaTime)",
" Call (ParaTime)"," Upgrade (ParaTime)",
" Transaction (ParaTime)", " Call (ParaTime)",
};
Expand Down Expand Up @@ -733,7 +734,12 @@ __Z_INLINE parser_error_t parser_getItemRuntimeConsensus(const parser_context_t
return parser_getType(ctx, outVal, outValLen, pageIdx, pageCount);
}
case 1: {
snprintf(outKey, outKeyLen, "To");
if (parser_tx_obj.oasis.runtime.call.method != consensusUndelegate) {
snprintf(outKey, outKeyLen, "To");
} else {
snprintf(outKey, outKeyLen, "From");
}

snprintf(outVal, outValLen, "Self");
if (parser_tx_obj.oasis.runtime.meta.has_orig_to) {
if (parser_tx_obj.oasis.runtime.call.body.consensus.has_to) {
Expand All @@ -749,11 +755,17 @@ __Z_INLINE parser_error_t parser_getItemRuntimeConsensus(const parser_context_t
return parser_ok;
}
case 2: {
snprintf(outKey, outKeyLen, "Amount");
return parser_printRuntimeQuantity(&parser_tx_obj.oasis.runtime.meta,
&parser_tx_obj.oasis.runtime.call.body.consensus.amount,
&parser_tx_obj.oasis.runtime.call.body.consensus.denom,
outVal, outValLen, pageIdx, pageCount);
if (parser_tx_obj.oasis.runtime.call.method != consensusUndelegate) {
snprintf(outKey, outKeyLen, "Amount");
return parser_printRuntimeQuantity(&parser_tx_obj.oasis.runtime.meta,
&parser_tx_obj.oasis.runtime.call.body.consensus.amount,
&parser_tx_obj.oasis.runtime.call.body.consensus.denom,
outVal, outValLen, pageIdx, pageCount);
} else {
snprintf(outKey, outKeyLen, "Shares");
return parser_printShares(&parser_tx_obj.oasis.runtime.call.body.consensus.shares,
outVal, outValLen, pageIdx, pageCount);
}
}
case 3: {
snprintf(outKey, outKeyLen, "Fee");
Expand Down Expand Up @@ -1111,6 +1123,8 @@ __Z_INLINE parser_error_t parser_getItemRuntime(const parser_context_t *ctx,
case consensusDeposit:
case consensusWithdraw:
case accountsTransfer:
case consensusDelegate:
case consensusUndelegate:
return parser_getItemRuntimeConsensus(ctx, displayIdx, outKey, outKeyLen,
outVal, outValLen, pageIdx, pageCount);
case contractsCall:
Expand Down
50 changes: 36 additions & 14 deletions app/src/consumer/parser_impl_con.c
Expand Up @@ -1193,6 +1193,16 @@ __Z_INLINE parser_error_t _readRuntimeMethod(parser_tx_t *v, CborValue *rootItem
return parser_ok;
}

if (CBOR_KEY_MATCHES(&tmp, "consensus.Delegate")) {
v->oasis.runtime.call.method = consensusDelegate;
return parser_ok;
}

if (CBOR_KEY_MATCHES(&tmp, "consensus.Undelegate")) {
v->oasis.runtime.call.method = consensusUndelegate;
return parser_ok;
}

return parser_unexpected_method;
}

Expand Down Expand Up @@ -1285,7 +1295,7 @@ __Z_INLINE parser_error_t _readRuntimeConsensusBody(parser_tx_t *v, CborValue *r

CborValue contents;
CHECK_CBOR_ERR(cbor_value_enter_container(&bodyField, &contents))
if (CBOR_KEY_MATCHES(&contents, "to")) {
if (CBOR_KEY_MATCHES(&contents, "to") || CBOR_KEY_MATCHES(&contents, "from")) {
v->oasis.runtime.call.body.consensus.has_to = true;
CHECK_CBOR_ERR(cbor_value_advance(&contents))
CHECK_PARSER_ERR(_readAddressRaw(&contents, &v->oasis.runtime.call.body.consensus.to))
Expand All @@ -1294,16 +1304,26 @@ __Z_INLINE parser_error_t _readRuntimeConsensusBody(parser_tx_t *v, CborValue *r
v->oasis.runtime.call.body.consensus.has_to = false;
MEMZERO(&v->oasis.runtime.call.body.consensus.to, sizeof(address_raw_t));
}

CborValue amount;
CHECK_CBOR_ERR(cbor_value_map_find_value(&bodyField, "amount", &amount))
if (!cbor_value_is_valid(&amount)) {
return parser_required_call;
if(v->oasis.runtime.call.method != consensusUndelegate) {
CborValue amount;
CHECK_CBOR_ERR(cbor_value_map_find_value(&bodyField, "amount", &amount))
if (!cbor_value_is_valid(&amount)) {
return parser_required_call;
}
CHECK_CBOR_ERR(cbor_value_enter_container(&amount, &contents))
CHECK_PARSER_ERR(_readQuantity(&contents, &v->oasis.runtime.call.body.consensus.amount))
CHECK_CBOR_ERR(cbor_value_advance(&contents))
CHECK_PARSER_ERR(_readRuntimeString(&contents, &v->oasis.runtime.call.body.consensus.denom))
} else {
CborValue shares;
CHECK_CBOR_ERR(cbor_value_map_find_value(&bodyField, "shares", &shares))
if (!cbor_value_is_valid(&shares)) {
return parser_required_call;
}
CHECK_CBOR_ERR(cbor_value_advance(&contents))
CHECK_PARSER_ERR(_readQuantity(&contents, &v->oasis.runtime.call.body.consensus.shares))
CHECK_CBOR_ERR(cbor_value_advance(&contents))
}
CHECK_CBOR_ERR(cbor_value_enter_container(&amount, &contents))
CHECK_PARSER_ERR(_readQuantity(&contents, &v->oasis.runtime.call.body.consensus.amount))
CHECK_CBOR_ERR(cbor_value_advance(&contents))
CHECK_PARSER_ERR(_readRuntimeString(&contents, &v->oasis.runtime.call.body.consensus.denom))

return parser_ok;
}
Expand Down Expand Up @@ -1445,6 +1465,8 @@ __Z_INLINE parser_error_t _readRuntimeCall(parser_tx_t *v, CborValue *rootItem)
switch(v->oasis.runtime.call.method)
{
case consensusDeposit:
case consensusDelegate:
case consensusUndelegate:
case consensusWithdraw:
case accountsTransfer:
CHECK_PARSER_ERR(_readRuntimeConsensusBody(v,&callField))
Expand Down Expand Up @@ -1743,8 +1765,7 @@ parser_error_t _read(const parser_context_t *c, parser_tx_t *v) {
CborValue rootItem;
INIT_CBOR_PARSER(c, rootItem)

// validate CBOR canonical order before even trying to parse
CHECK_CBOR_ERR(cbor_value_validate(&rootItem, CborValidateCanonicalFormat))
CHECK_CBOR_ERR(cbor_value_validate_basic(&rootItem))

if (cbor_value_at_end(&rootItem)) {
return parser_unexpected_buffer_end;
Expand Down Expand Up @@ -1892,6 +1913,8 @@ uint8_t _getNumItems(__Z_UNUSED const parser_context_t *c, const parser_tx_t *v)
case consensusDeposit:
case accountsTransfer:
case consensusWithdraw:
case consensusDelegate:
case consensusUndelegate:
itemCount += 3;
break;
default:
Expand Down Expand Up @@ -2049,8 +2072,7 @@ parser_error_t _getTokenAtIndex(const parser_context_t *c, token_t *token, uint8
CborValue it;
INIT_CBOR_PARSER(c, it)

// validate CBOR canonical order before even trying to parse
CHECK_CBOR_ERR(cbor_value_validate(&it, CborValidateCanonicalFormat))
CHECK_CBOR_ERR(cbor_value_validate_basic(&it))

if (cbor_value_at_end(&it)) {
return parser_unexpected_buffer_end;
Expand Down
3 changes: 3 additions & 0 deletions app/src/consumer/parser_txdef_con.h
Expand Up @@ -62,6 +62,8 @@ typedef enum {
accountsTransfer,
consensusDeposit,
consensusWithdraw,
consensusDelegate,
consensusUndelegate,
contractsInstantiate,
contractsCall,
contractsUpgrade,
Expand Down Expand Up @@ -272,6 +274,7 @@ typedef struct {
quantity_t amount;
string_t denom;
bool has_to;
quantity_t shares;
} body_consensus_t;

typedef struct {
Expand Down
14 changes: 8 additions & 6 deletions app/src/crypto.c
Expand Up @@ -423,12 +423,14 @@ typedef union {
};
} tmp_address_t;

uint16_t crypto_encodeAddress(char *addr_out, uint16_t addr_out_max, uint8_t *pubkey) {
tmp_address_t tmp;
uint16_t crypto_encodeAddress(char *addr_out, uint16_t addr_out_max, uint8_t *pubkey, address_kind_e kind) {
tmp_address_t tmp = {0};
tmp.version = COIN_ADDRESS_VERSION;

const char *context = (kind == addr_ed25519) ? COIN_ADDRESS_ED25519_CONTEXT : COIN_ADDRESS_SR25519_CONTEXT;

SHA512_256_with_context_version (
(uint8_t *) COIN_ADDRESS_CONTEXT, strlen(COIN_ADDRESS_CONTEXT),
(uint8_t *)context, strnlen(context, MAX_CONTEXT_SIZE),
COIN_ADDRESS_VERSION,
pubkey, PK_LEN_ED25519,
tmp.pkHash
Expand All @@ -444,7 +446,7 @@ uint16_t crypto_encodeAddress(char *addr_out, uint16_t addr_out_max, uint8_t *pu
return 0;
}

return strlen(addr_out);
return strnlen(addr_out, addr_out_max);
}

static uint16_t crypto_encodeEthereumAddress(char *addr_out, uint16_t addr_out_max, uint8_t *pubkey) {
Expand Down Expand Up @@ -473,7 +475,7 @@ zxerr_t crypto_fillAddressEd25519(uint8_t *buffer, uint16_t buffer_len, uint16_t
// format pubkey as oasis bech32 address
char *addr_out = (char *) (buffer + PK_LEN_ED25519);
const uint16_t addr_out_max = buffer_len - PK_LEN_ED25519;
const uint16_t addr_out_len = crypto_encodeAddress(addr_out, addr_out_max, buffer);
const uint16_t addr_out_len = crypto_encodeAddress(addr_out, addr_out_max, buffer, addr_ed25519);

*addrLen = PK_LEN_ED25519 + addr_out_len;
return zxerr_ok;
Expand All @@ -490,7 +492,7 @@ zxerr_t crypto_fillAddressSr25519(uint8_t *buffer, uint16_t buffer_len, uint16_t
// format pubkey as oasis bech32 address
char *addr_out = (char *) (buffer + PK_LEN_SR25519);
const uint16_t addr_out_max = buffer_len - PK_LEN_SR25519;
const uint16_t addr_out_len = crypto_encodeAddress(addr_out, addr_out_max, buffer);
const uint16_t addr_out_len = crypto_encodeAddress(addr_out, addr_out_max, buffer, addr_sr25519);

*addrLen = PK_LEN_SR25519 + addr_out_len;
return zxerr_ok;
Expand Down
2 changes: 1 addition & 1 deletion app/src/crypto.h
Expand Up @@ -30,7 +30,7 @@ extern uint32_t hdPath[MAX_BIP32_PATH];
extern uint8_t hdPathLen;
extern uint8_t chain_code;

uint16_t crypto_encodeAddress(char *addr_out, uint16_t addr_out_max, uint8_t *pubkey);
uint16_t crypto_encodeAddress(char *addr_out, uint16_t addr_out_max, uint8_t *pubkey, address_kind_e kind);

zxerr_t crypto_fillAddress(uint8_t *buffer, uint16_t buffer_len, uint16_t *addrLen,address_kind_e kind);
zxerr_t crypto_fillEthAddress(uint8_t *buffer, uint16_t bufferLen, uint16_t *addrLen);
Expand Down
3 changes: 2 additions & 1 deletion app/src/validator/coin_validator.h
Expand Up @@ -77,7 +77,8 @@ extern "C" {

#define COIN_DENOM ""
#define COIN_ADDRESS_VERSION 0
#define COIN_ADDRESS_CONTEXT "oasis-core/address: staking"
#define COIN_ADDRESS_ED25519_CONTEXT "oasis-core/address: staking"
#define COIN_ADDRESS_SR25519_CONTEXT "oasis-runtime-sdk/address: sr25519"

#ifdef __cplusplus
}
Expand Down
2 changes: 1 addition & 1 deletion deps/ledger-zxlib

0 comments on commit 813aedc

Please sign in to comment.