layout: print bip32 path in GetAddress dialog

pull/25/head
Pavol Rusnak 7 years ago
parent 61044b3fc3
commit de3b78bd0b
No known key found for this signature in database
GPG Key ID: 91F3B339B9A02A3D

@ -163,7 +163,7 @@ void fsm_sendFailure(FailureType code, const char *text)
msg_write(MessageType_MessageType_Failure, resp);
}
const CoinInfo *fsm_getCoin(bool has_name, const char *name)
static const CoinInfo *fsm_getCoin(bool has_name, const char *name)
{
const CoinInfo *coin;
if (has_name) {
@ -179,7 +179,7 @@ const CoinInfo *fsm_getCoin(bool has_name, const char *name)
return coin;
}
HDNode *fsm_getDerivedNode(const char *curve, uint32_t *address_n, size_t address_n_count)
static HDNode *fsm_getDerivedNode(const char *curve, const uint32_t *address_n, size_t address_n_count)
{
static CONFIDENTIAL HDNode node;
if (!storage_getRootNode(&node, curve, true)) {
@ -696,7 +696,7 @@ void fsm_msgGetAddress(GetAddress *msg)
}
bool qrcode = false;
for (;;) {
layoutAddress(address, desc, qrcode, msg->script_type == InputScriptType_SPENDWITNESS);
layoutAddress(address, desc, qrcode, msg->script_type == InputScriptType_SPENDWITNESS, msg->address_n, msg->address_n_count);
if (protectButton(ButtonRequestType_ButtonRequest_Address, false)) {
break;
}
@ -734,7 +734,7 @@ void fsm_msgEthereumGetAddress(EthereumGetAddress *msg)
bool qrcode = false;
for (;;) {
layoutAddress(address, desc, qrcode, false);
layoutAddress(address, desc, qrcode, false, msg->address_n, msg->address_n_count);
if (protectButton(ButtonRequestType_ButtonRequest_Address, false)) {
break;
}
@ -1156,7 +1156,7 @@ void fsm_msgNEMGetAddress(NEMGetAddress *msg)
bool qrcode = false;
for (;;) {
layoutAddress(resp->address, desc, qrcode, true);
layoutAddress(resp->address, desc, qrcode, true, msg->address_n, msg->address_n_count);
if (protectButton(ButtonRequestType_ButtonRequest_Address, false)) {
break;
}

@ -164,7 +164,7 @@ void layoutFeeOverThreshold(const CoinInfo *coin, uint64_t fee)
}
// split longer string into 4 rows, rowlen chars each
const char **split_message(const uint8_t *msg, uint32_t len, uint32_t rowlen)
static const char **split_message(const uint8_t *msg, uint32_t len, uint32_t rowlen)
{
static char str[4][32 + 1];
if (rowlen > 32) {
@ -289,7 +289,45 @@ void layoutResetWord(const char *word, int pass, int word_pos, bool last)
oledRefresh();
}
void layoutAddress(const char *address, const char *desc, bool qrcode, bool ignorecase)
static const char *address_n_str(const uint32_t *address_n, size_t address_n_count)
{
if (address_n_count > 8) {
return _("Unknown long path");
}
if (address_n_count == 0) {
return _("Path: m");
}
// "Path: m" / i '
static char address_str[7 + 8 * (1 + 9 + 1) + 1];
char *c = address_str + sizeof(address_str) - 1;
*c = 0; c--;
for (int n = (int)address_n_count - 1; n >= 0; n--) {
uint32_t i = address_n[n];
if (i & 0x80000000) {
*c = '\''; c--;
}
i = i & 0x7fffffff;
do {
*c = '0' + (i % 10); c--;
i /= 10;
} while (i > 0);
*c = '/'; c--;
}
*c = 'm'; c--;
*c = ' '; c--;
*c = ':'; c--;
*c = 'h'; c--;
*c = 't'; c--;
*c = 'a'; c--;
*c = 'P';
return c;
}
void layoutAddress(const char *address, const char *desc, bool qrcode, bool ignorecase, const uint32_t *address_n, size_t address_n_count)
{
if (layoutLast != layoutAddress) {
layoutSwipe();
@ -313,7 +351,7 @@ void layoutAddress(const char *address, const char *desc, bool qrcode, bool igno
oledInvert(0, 0, 63, 63);
if (side > 0 && side <= 29) {
int offset = 32 - side;
int offset = 32 - side;
for (int i = 0; i < side; i++) {
for (int j = 0; j< side; j++) {
int a = j * side + i;
@ -343,6 +381,7 @@ void layoutAddress(const char *address, const char *desc, bool qrcode, bool igno
for (int i = 0; i < 4; i++) {
oledDrawString(0, (i + 1) * 9 + 4, str[i]);
}
oledDrawString(0, 42, address_n_str(address_n, address_n_count));
}
if (!qrcode) {

@ -50,7 +50,7 @@ void layoutCipherKeyValue(bool encrypt, const char *key);
void layoutEncryptMessage(const uint8_t *msg, uint32_t len, bool signing);
void layoutDecryptMessage(const uint8_t *msg, uint32_t len, const char *address);
void layoutResetWord(const char *word, int pass, int word_pos, bool last);
void layoutAddress(const char *address, const char *desc, bool qrcode, bool ignorecase);
void layoutAddress(const char *address, const char *desc, bool qrcode, bool ignorecase, const uint32_t *address_n, size_t address_n_count);
void layoutPublicKey(const uint8_t *pubkey);
void layoutSignIdentity(const IdentityType *identity, const char *challenge);
void layoutDecryptIdentity(const IdentityType *identity);

@ -430,7 +430,7 @@ void u2f_version(const APDU *a)
send_u2f_msg(version_response, sizeof(version_response));
}
void getReadableAppId(const uint8_t appid[U2F_APPID_SIZE], const char **appname, const BITMAP **appicon) {
static void getReadableAppId(const uint8_t appid[U2F_APPID_SIZE], const char **appname, const BITMAP **appicon) {
static char buf[8+2+8+1];
for (unsigned int i = 0; i < sizeof(u2f_well_known)/sizeof(U2FWellKnown); i++) {
@ -448,7 +448,7 @@ void getReadableAppId(const uint8_t appid[U2F_APPID_SIZE], const char **appname,
*appicon = NULL;
}
const HDNode *getDerivedNode(uint32_t *address_n, size_t address_n_count)
static const HDNode *getDerivedNode(uint32_t *address_n, size_t address_n_count)
{
static CONFIDENTIAL HDNode node;
if (!storage_getRootNode(&node, NIST256P1_NAME, false)) {
@ -467,7 +467,7 @@ const HDNode *getDerivedNode(uint32_t *address_n, size_t address_n_count)
return &node;
}
const HDNode *generateKeyHandle(const uint8_t app_id[], uint8_t key_handle[])
static const HDNode *generateKeyHandle(const uint8_t app_id[], uint8_t key_handle[])
{
uint8_t keybase[U2F_APPID_SIZE + KEY_PATH_LEN];
@ -499,7 +499,7 @@ const HDNode *generateKeyHandle(const uint8_t app_id[], uint8_t key_handle[])
}
const HDNode *validateKeyHandle(const uint8_t app_id[], const uint8_t key_handle[])
static const HDNode *validateKeyHandle(const uint8_t app_id[], const uint8_t key_handle[])
{
uint32_t key_path[KEY_PATH_ENTRIES];
key_path[0] = U2F_KEY_PATH;

Loading…
Cancel
Save