|
|
|
@ -89,18 +89,23 @@ HDNode *fsm_getRootNode(void)
|
|
|
|
|
return &node;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void fsm_deriveKey(HDNode *node, uint32_t *address_n, size_t address_n_count)
|
|
|
|
|
int fsm_deriveKey(HDNode *node, uint32_t *address_n, size_t address_n_count)
|
|
|
|
|
{
|
|
|
|
|
size_t i;
|
|
|
|
|
if (address_n_count > 3) {
|
|
|
|
|
layoutProgressSwipe("Preparing keys", 0, 0);
|
|
|
|
|
}
|
|
|
|
|
for (i = 0; i < address_n_count; i++) {
|
|
|
|
|
hdnode_private_ckd(node, address_n[i]);
|
|
|
|
|
if (hdnode_private_ckd(node, address_n[i]) == 0) {
|
|
|
|
|
fsm_sendFailure(FailureType_Failure_Other, "Failed to derive private key");
|
|
|
|
|
layoutHome();
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
if (address_n_count > 3) {
|
|
|
|
|
layoutProgress("Preparing keys", 1000 * i / address_n_count, i);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return 1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void fsm_msgInitialize(Initialize *msg)
|
|
|
|
@ -265,8 +270,7 @@ void fsm_msgGetPublicKey(GetPublicKey *msg)
|
|
|
|
|
|
|
|
|
|
HDNode *node = fsm_getRootNode();
|
|
|
|
|
if (!node) return;
|
|
|
|
|
|
|
|
|
|
fsm_deriveKey(node, msg->address_n, msg->address_n_count);
|
|
|
|
|
if (fsm_deriveKey(node, msg->address_n, msg->address_n_count) == 0) return;
|
|
|
|
|
|
|
|
|
|
resp->node.depth = node->depth;
|
|
|
|
|
resp->node.fingerprint = node->fingerprint;
|
|
|
|
@ -395,7 +399,7 @@ void fsm_msgCipherKeyValue(CipherKeyValue *msg)
|
|
|
|
|
}
|
|
|
|
|
HDNode *node = fsm_getRootNode();
|
|
|
|
|
if (!node) return;
|
|
|
|
|
fsm_deriveKey(node, msg->address_n, msg->address_n_count);
|
|
|
|
|
if (fsm_deriveKey(node, msg->address_n, msg->address_n_count) == 0) return;
|
|
|
|
|
|
|
|
|
|
bool encrypt = msg->has_encrypt && msg->encrypt;
|
|
|
|
|
bool ask_on_encrypt = msg->has_ask_on_encrypt && msg->ask_on_encrypt;
|
|
|
|
@ -499,8 +503,7 @@ void fsm_msgGetAddress(GetAddress *msg)
|
|
|
|
|
layoutHome();
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fsm_deriveKey(node, msg->address_n, msg->address_n_count);
|
|
|
|
|
if (fsm_deriveKey(node, msg->address_n, msg->address_n_count) == 0) return;
|
|
|
|
|
|
|
|
|
|
if (msg->has_multisig) {
|
|
|
|
|
if (cryptoMultisigPubkeyIndex(&(msg->multisig), node->public_key) < 0) {
|
|
|
|
@ -567,8 +570,8 @@ void fsm_msgSignMessage(SignMessage *msg)
|
|
|
|
|
layoutHome();
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
if (fsm_deriveKey(node, msg->address_n, msg->address_n_count) == 0) return;
|
|
|
|
|
|
|
|
|
|
fsm_deriveKey(node, msg->address_n, msg->address_n_count);
|
|
|
|
|
layoutProgressSwipe("Signing", 0, 0);
|
|
|
|
|
if (cryptoMessageSign(msg->message.bytes, msg->message.size, node->private_key, resp->signature.bytes) == 0) {
|
|
|
|
|
resp->has_address = true;
|
|
|
|
@ -642,7 +645,8 @@ void fsm_msgEncryptMessage(EncryptMessage *msg)
|
|
|
|
|
}
|
|
|
|
|
node = fsm_getRootNode();
|
|
|
|
|
if (!node) return;
|
|
|
|
|
fsm_deriveKey(node, msg->address_n, msg->address_n_count);
|
|
|
|
|
if (fsm_deriveKey(node, msg->address_n, msg->address_n_count) == 0) return;
|
|
|
|
|
|
|
|
|
|
hdnode_fill_public_key(node);
|
|
|
|
|
ecdsa_get_address_raw(node->public_key, coin->address_type, address_raw);
|
|
|
|
|
}
|
|
|
|
@ -690,7 +694,8 @@ void fsm_msgDecryptMessage(DecryptMessage *msg)
|
|
|
|
|
}
|
|
|
|
|
HDNode *node = fsm_getRootNode();
|
|
|
|
|
if (!node) return;
|
|
|
|
|
fsm_deriveKey(node, msg->address_n, msg->address_n_count);
|
|
|
|
|
if (fsm_deriveKey(node, msg->address_n, msg->address_n_count) == 0) return;
|
|
|
|
|
|
|
|
|
|
layoutProgressSwipe("Decrypting", 0, 0);
|
|
|
|
|
RESP_INIT(DecryptedMessage);
|
|
|
|
|
bool display_only = false;
|
|
|
|
|