90 lines
3.4 KiB
C
90 lines
3.4 KiB
C
#ifdef HAVE_STARKWARE
|
|
|
|
#include "shared_context.h"
|
|
#include "stark_utils.h"
|
|
#include "ui_callbacks.h"
|
|
#include "utils.h"
|
|
|
|
static unsigned char const C_cx_Stark256_n[] = {
|
|
// n: 0x0800000000000010ffffffffffffffffb781126dcae7b2321e66a241adc64d2f
|
|
0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
0xb7, 0x81, 0x12, 0x6d, 0xca, 0xe7, 0xb2, 0x32, 0x1e, 0x66, 0xa2, 0x41, 0xad, 0xc6, 0x4d, 0x2f};
|
|
|
|
// C_cx_secp256k1_n - (C_cx_secp256k1_n % C_cx_Stark256_n)
|
|
static unsigned char const STARK_DERIVE_BIAS[] = {
|
|
0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7,
|
|
0x38, 0xa1, 0x3b, 0x4b, 0x92, 0x0e, 0x94, 0x11, 0xae, 0x6d, 0xa5, 0xf4, 0x0b, 0x03, 0x58, 0xb1};
|
|
|
|
void starkDerivePrivateKey(uint32_t *bip32Path, uint32_t bip32PathLength, uint8_t *privateKeyData) {
|
|
#if 0
|
|
// Sanity check
|
|
if (bip32Path[0] != STARK_BIP32_PATH_0) {
|
|
PRINTF("Invalid Stark derivation path %d\n", bip32Path[0]);
|
|
THROW(0x6a80);
|
|
}
|
|
os_perso_derive_node_bip32(CX_CURVE_256K1, bip32Path, bip32PathLength, privateKeyData, NULL);
|
|
PRINTF("Private key before processing %.*H\n", 32, privateKeyData);
|
|
// TODO - support additional schemes
|
|
cx_math_modm(privateKeyData, 32, C_cx_Stark256_n, 32);
|
|
PRINTF("Private key after processing %.*H\n", 32, privateKeyData);
|
|
#else
|
|
uint8_t tmp[33];
|
|
uint8_t index = 0;
|
|
// Sanity check
|
|
if ((bip32PathLength < 2) || (bip32Path[0] != STARK_BIP32_PATH_0) ||
|
|
(bip32Path[1] != STARK_BIP32_PATH_1)) {
|
|
PRINTF("Invalid Stark derivation path %d %d\n", bip32Path[0], bip32Path[1]);
|
|
THROW(0x6a80);
|
|
}
|
|
os_perso_derive_node_bip32(CX_CURVE_256K1, bip32Path, bip32PathLength, tmp, NULL);
|
|
PRINTF("Private key before processing %.*H\n", 32, tmp);
|
|
for (;;) {
|
|
tmp[32] = index;
|
|
cx_hash_sha256(tmp, 33, privateKeyData, 32);
|
|
PRINTF("Key hash %.*H\n", 32, privateKeyData);
|
|
if (cx_math_cmp(privateKeyData, STARK_DERIVE_BIAS, 32) < 0) {
|
|
cx_math_modm(privateKeyData, 32, C_cx_Stark256_n, 32);
|
|
break;
|
|
}
|
|
index++;
|
|
}
|
|
PRINTF("Key result %.*H\n", 32, privateKeyData);
|
|
|
|
#endif
|
|
}
|
|
|
|
void stark_get_amount_string(uint8_t *contractAddress,
|
|
uint8_t *quantum256,
|
|
uint8_t *amount64,
|
|
char *tmp100,
|
|
char *target100) {
|
|
uint256_t amountPre, quantum, amount;
|
|
uint8_t decimals;
|
|
char *ticker = (char *) PIC(chainConfig->coinName);
|
|
|
|
PRINTF("stark_get_amount_string %.*H\n", 20, contractAddress);
|
|
|
|
if (allzeroes(contractAddress, 20)) {
|
|
decimals = WEI_TO_ETHER;
|
|
PRINTF("stark_get_amount_string - ETH\n");
|
|
} else {
|
|
tokenDefinition_t *token = getKnownToken(contractAddress);
|
|
if (token == NULL) { // caught earlier
|
|
THROW(0x6A80);
|
|
}
|
|
decimals = token->decimals;
|
|
ticker = (char *) token->ticker;
|
|
PRINTF("stark_get_amount_string - decimals %d ticker %s\n", decimals, ticker);
|
|
}
|
|
convertUint256BE(amount64, 8, &amountPre);
|
|
readu256BE(quantum256, &quantum);
|
|
mul256(&amountPre, &quantum, &amount);
|
|
tostring256(&amount, 10, tmp100, 100);
|
|
PRINTF("stark_get_amount_string - mul256 %s\n", tmp100);
|
|
strcpy(target100, ticker);
|
|
adjustDecimals(tmp100, strlen(tmp100), target100 + strlen(ticker), 100, decimals);
|
|
PRINTF("get_amount_string %s\n", target100);
|
|
}
|
|
|
|
#endif // HAVE_STARK
|