update the wallet list to support Nabox
What changed, and why it matters
This commit adds support for the Nabox wallet app in Keystone 3 firmware. It changes which cryptocurrency account data is shared with Nabox, switches the data format to a newer 'Keystone Connect' style, and exposes the device's serial number and firmware version during pairing. There is no direct evidence this is a security fix or vulnerability; it appears to be a routine wallet-integration update.
Treat as a normal feature/integration commit. Reviewers should verify that serialNumber and firmwareVersion exposure in the UR payload is intentional and documented in Nabox's integration spec, and confirm that making generate_ed25519_key public does not weaken encapsulation elsewhere. No security patch action is indicated by the diff alone.
Security signals we found
New device metadata (serial number, firmware version) is transmitted to the connected wallet during QR pairing
Wallet-specific key derivation paths are expanded for Nabox, including Solana (44'/501') and Bitcoin Cash (44'/145'/0')
A previously private/internal Rust helper is now public to support cross-module reuse
Evidence from the diff
The patch updates Nabox wallet integration: (1) changes Nabox’s coin list from Ethereum-only (g_ethWalletCoinArray, 4 coins) to a broader array (g_naboxWalletCoinArray, 7 coins) and wallet filter from ETH to OTHER; (2) replaces the generic UR encoder with get_keystone_connect_wallet_ur, sending serialNumber and firmwareVersion alongside the master fingerprint and extended public keys; (3) adds Solana Ed25519 key generation and Bitcoin Cash path support to the Keystone Connect Rust module; (4) makes backpack::generate_ed25519_key public so it can be reused. The version bump from build 4 to 5 is consistent with a minor feature release.
Changed components
Nabox wallet integration UIKeystone Connect wallet connection protocolRust apps/wallets key generation modulesDevice version metadataInspect captured patch +14 / −4
diff --git a/rust/apps/wallets/src/backpack.rs b/rust/apps/wallets/src/backpack.rs
index de8903a..a17d190 100644
--- a/rust/apps/wallets/src/backpack.rs
+++ b/rust/apps/wallets/src/backpack.rs
@@ -91,7 +91,7 @@ pub fn generate_crypto_multi_accounts(
))
}
-fn generate_ed25519_key(
+pub fn generate_ed25519_key(
mfp: [u8; 4],
key: ExtendedPublicKey,
note: Option<String>,
diff --git a/rust/apps/wallets/src/keystone_connect.rs b/rust/apps/wallets/src/keystone_connect.rs
index 074597b..4c3273b 100644
--- a/rust/apps/wallets/src/keystone_connect.rs
+++ b/rust/apps/wallets/src/keystone_connect.rs
@@ -34,6 +34,8 @@ const DOGE_LEGACY_PREFIX: &str = "44'/3'/0'";
const XRP_PREFIX: &str = "44'/144'/0'";
const LTC_PREFIX: &str = "49'/2'/0'";
const LTC_NATIVE_SEGWIT_PREFIX: &str = "84'/2'/0'";
+const SOL_BIP44_PREFIX: &str = "44'/501'";
+const BCH_PREFIX: &str = "44'/145'/0'";
pub fn generate_crypto_multi_accounts(
master_fingerprint: [u8; 4],
@@ -54,6 +56,7 @@ pub fn generate_crypto_multi_accounts(
XRP_PREFIX.to_string(),
LTC_PREFIX.to_string(),
LTC_NATIVE_SEGWIT_PREFIX.to_string(),
+ BCH_PREFIX.to_string(),
];
for ele in extended_public_keys {
match ele.get_path() {
@@ -83,6 +86,9 @@ pub fn generate_crypto_multi_accounts(
Some("account.ledger_live".to_string()),
)?);
}
+ _path if _path.to_string().to_lowercase().starts_with(SOL_BIP44_PREFIX) => {
+ keys.push(crate::backpack::generate_ed25519_key(master_fingerprint, ele.clone(), None)?);
+ }
_path
if _path
.to_string()
diff --git a/src/config/version.h b/src/config/version.h
index 32d026c..d12832b 100644
--- a/src/config/version.h
+++ b/src/config/version.h
@@ -7,7 +7,7 @@
#define SOFTWARE_VERSION_MAJOR 12
#define SOFTWARE_VERSION_MAJOR_OFFSET 10
#define SOFTWARE_VERSION_MINOR 3
-#define SOFTWARE_VERSION_BUILD 4
+#define SOFTWARE_VERSION_BUILD 5
#define SOFTWARE_VERSION_BETA 1
#define SOFTWARE_VERSION (SOFTWARE_VERSION_MAJOR * 10000 + SOFTWARE_VERSION_MINOR * 100 + SOFTWARE_VERSION_BUILD)
#ifdef WEB3_VERSION
diff --git a/src/ui/gui_wallet/multi/web3/gui_wallet.c b/src/ui/gui_wallet/multi/web3/gui_wallet.c
index ace7842..104a348 100644
--- a/src/ui/gui_wallet/multi/web3/gui_wallet.c
+++ b/src/ui/gui_wallet/multi/web3/gui_wallet.c
@@ -233,8 +233,12 @@ UREncodeResult *GuiGetNaboxData(void)
ExtendedPublicKey keys[chainNum];
uint8_t mfp[4] = {0};
GetMasterFingerPrint(mfp);
+ char serialNumber[256];
+ GetSerialNumber(serialNumber);
+ char firmwareVersion[12];
+ GetSoftWareVersionNumber(firmwareVersion);
PtrT_CSliceFFI_ExtendedPublicKey public_keys = BuildChainPaths(chainPaths, keys, chainNum);
- UREncodeResult *urEncode = generate_common_crypto_multi_accounts_ur(mfp, sizeof(mfp), public_keys, "Keystone3");
+ UREncodeResult *urEncode = get_keystone_connect_wallet_ur(mfp, sizeof(mfp), serialNumber, public_keys, "Keystone 3 Pro", firmwareVersion);
for (int i = 9; i < chainNum; i++) {
if (chainPaths[i].path != NULL) {
SRAM_FREE(chainPaths[i].path);
diff --git a/src/ui/gui_widgets/multi/web3/gui_connect_wallet_widgets.c b/src/ui/gui_widgets/multi/web3/gui_connect_wallet_widgets.c
index c85d18c..456de85 100644
--- a/src/ui/gui_widgets/multi/web3/gui_connect_wallet_widgets.c
+++ b/src/ui/gui_widgets/multi/web3/gui_connect_wallet_widgets.c
@@ -220,7 +220,7 @@ WalletListItem_t g_walletListArray[] = {
{WALLET_LIST_BTC_WALLET, &coinBtc, "Bitcoin Wallets", g_btcWalletCoinArray, 4, true, WALLET_FILTER_BTC},
{WALLET_LIST_TONKEEPER, &walletTonkeeper, "Tonkeeper", g_tonKeeperCoinArray, 1, false, WALLET_FILTER_OTHER},
{WALLET_LIST_RABBY, &walletRabby, "Rabby", g_ethWalletCoinArray, 4, true, WALLET_FILTER_ETH},
- {WALLET_LIST_NABOX, &walletNabox, "Nabox", g_ethWalletCoinArray, 4, true, WALLET_FILTER_ETH},
+ {WALLET_LIST_NABOX, &walletNabox, "Nabox", g_naboxWalletCoinArray, 7, true, WALLET_FILTER_OTHER},
{WALLET_LIST_BITGET, &walletBitget, "Bitget Wallet", g_bitgetWalletCoinArray, 3, true, WALLET_FILTER_BTC | WALLET_FILTER_ETH | WALLET_FILTER_OTHER},
{WALLET_LIST_ETERNL, &walletEternl, "Eternl", g_adaCoinArray, 1, true, WALLET_FILTER_ADA},
{WALLET_LIST_VESPR, &walletVespr, "Vespr", g_adaCoinArray, 1, true, WALLET_FILTER_ADA},
Why this scored 18/100
Community notes
Notes can correct, qualify, or add evidence to the AI analysis. Every note shown here has been validated by a human moderator.
The AI analysis stands alone for now. Submit a note if you can add evidence or important context.