HDNode *fsm_getRootNode(void) { static HDNode node; if (!storage_getRootNode(&node)) { layoutHome(); fsm_sendFailure(FailureType_Failure_NotInitialized, "Device not initialized or passphrase request cancelled"); return 0; } return &node; }
const HDNode *fsm_getDerivedNode(uint32_t *address_n, size_t address_n_count) { static HDNode node; if (!storage_getRootNode(&node)) { fsm_sendFailure(FailureType_Failure_NotInitialized, "Device not initialized or passphrase request cancelled"); layoutHome(); return 0; } if (!address_n || address_n_count == 0) { return &node; } if (hdnode_private_ckd_cached(&node, address_n, address_n_count) == 0) { fsm_sendFailure(FailureType_Failure_Other, "Failed to derive private key"); layoutHome(); return 0; } return &node; }
static HDNode *fsm_getDerivedNode(const char *curve, const uint32_t *address_n, size_t address_n_count, uint32_t *fingerprint) { static CONFIDENTIAL HDNode node; if (fingerprint) { *fingerprint = 0; } if (!storage_getRootNode(&node, curve, true)) { fsm_sendFailure(Failure_FailureType_Failure_NotInitialized, _("Device not initialized or passphrase request cancelled or unsupported curve")); layoutHome(); return 0; } if (!address_n || address_n_count == 0) { return &node; } if (hdnode_private_ckd_cached(&node, address_n, address_n_count, fingerprint) == 0) { fsm_sendFailure(Failure_FailureType_Failure_ProcessError, _("Failed to derive private key")); layoutHome(); return 0; } return &node; }