Skip to content

Commit f80c896

Browse files
authored
Merge pull request #1629 from KeystoneHQ/keystone-connect
Keystone connect
2 parents 13ba192 + a8bbcfb commit f80c896

File tree

17 files changed

+708
-231
lines changed

17 files changed

+708
-231
lines changed

external/ctaes

Submodule ctaes updated 1 file
-2.78 KB
Loading

rust/apps/bitcoin/src/addresses/mod.rs

+11
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,17 @@ mod tests {
152152

153153
#[test]
154154
fn test_btc_p2tr_no_script_address() {
155+
let extended_pubkey = "xpub6Cq9mdT8xwFe9LYQnt9y1hJXTyo7KQJM8pRH6K95F1mbELzgm825m3hyAZ97vsUV8Xh7VRwu7bKuLZEmUV1ABqCRQqFzZHAsfaJXTYSY1cf";
156+
let address =
157+
get_address("M/86'/0'/0'/0/0".to_string(), &extended_pubkey.to_string()).unwrap();
158+
assert_eq!(
159+
address,
160+
"bc1pf7al7fmsrfxftwp0durgv3zv9ezqzrqdhk34gjcuqasw6fnlxu7sw8xvjs"
161+
);
162+
}
163+
164+
#[test]
165+
fn test_btc_p2tr_no_script_address_testnet() {
155166
let extended_pubkey = "tpubDDfvzhdVV4unsoKt5aE6dcsNsfeWbTgmLZPi8LQDYU2xixrYemMfWJ3BaVneH3u7DBQePdTwhpybaKRU95pi6PMUtLPBJLVQRpzEnjfjZzX";
156167
let address =
157168
get_address("M/86'/1'/0'/0/0".to_string(), &extended_pubkey.to_string()).unwrap();

rust/apps/wallets/src/keystone_connect.rs

+424
Large diffs are not rendered by default.

rust/apps/wallets/src/lib.rs

+1
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ pub mod companion_app;
2222
pub mod core_wallet;
2323
pub mod keplr;
2424
pub mod keystone;
25+
pub mod keystone_connect;
2526
pub mod metamask;
2627
pub mod okx;
2728
pub mod solana;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
use crate::common::ffi::CSliceFFI;
2+
use crate::common::structs::ExtendedPublicKey;
3+
use crate::common::types::{Ptr, PtrBytes, PtrString};
4+
use crate::common::ur::{UREncodeResult, FRAGMENT_MAX_LENGTH_DEFAULT};
5+
use crate::common::utils::{recover_c_array, recover_c_char};
6+
use crate::extract_array;
7+
use alloc::{format, string::ToString};
8+
use ur_registry::{
9+
error::URError, extend::crypto_multi_accounts::CryptoMultiAccounts, traits::RegistryItem,
10+
};
11+
12+
use super::utils::normalize_xpub;
13+
14+
#[no_mangle]
15+
pub extern "C" fn get_keystone_connect_wallet_ur(
16+
master_fingerprint: PtrBytes,
17+
master_fingerprint_length: u32,
18+
serial_number: PtrString,
19+
public_keys: Ptr<CSliceFFI<ExtendedPublicKey>>,
20+
device_type: PtrString,
21+
device_version: PtrString,
22+
) -> Ptr<UREncodeResult> {
23+
if master_fingerprint_length != 4 {
24+
return UREncodeResult::from(URError::UrEncodeError(format!(
25+
"master fingerprint length must be 4, current is {}",
26+
master_fingerprint_length
27+
)))
28+
.c_ptr();
29+
}
30+
let mfp = extract_array!(master_fingerprint, u8, master_fingerprint_length);
31+
let mfp = match <[u8; 4]>::try_from(mfp) {
32+
Ok(mfp) => mfp,
33+
Err(e) => return UREncodeResult::from(URError::UrEncodeError(e.to_string())).c_ptr(),
34+
};
35+
unsafe {
36+
let keys = recover_c_array(public_keys);
37+
let serial_number = recover_c_char(serial_number);
38+
let device_version = recover_c_char(device_version);
39+
let device_type = recover_c_char(device_type);
40+
match normalize_xpub(keys) {
41+
Ok(_keys) => {
42+
match app_wallets::keystone_connect::generate_crypto_multi_accounts(
43+
mfp,
44+
&serial_number,
45+
_keys,
46+
&device_type,
47+
&device_version,
48+
) {
49+
Ok(data) => match data.try_into() {
50+
Ok(_v) => UREncodeResult::encode(
51+
_v,
52+
CryptoMultiAccounts::get_registry_type().get_type(),
53+
FRAGMENT_MAX_LENGTH_DEFAULT,
54+
)
55+
.c_ptr(),
56+
Err(_e) => UREncodeResult::from(_e).c_ptr(),
57+
},
58+
Err(_e) => UREncodeResult::from(_e).c_ptr(),
59+
}
60+
}
61+
Err(_e) => UREncodeResult::from(_e).c_ptr(),
62+
}
63+
}
64+
}

rust/rust_c/src/wallet/multi_coins_wallet/mod.rs

+1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ pub mod bitget;
55
mod imtoken;
66
pub mod keplr;
77
pub mod keystone;
8+
pub mod keystone_connect;
89
pub mod okx;
910
pub mod solana;
1011
pub mod structs;

rust/rust_c/src/zcash/mod.rs

+3
Original file line numberDiff line numberDiff line change
@@ -218,6 +218,9 @@ mod tests {
218218

219219
#[test]
220220
fn test_aes256_cbc_decrypt() {
221+
//8dd387c3b2656d9f24ace7c3daf6fc26a1c161098460f8dddd37545fc951f9cd7da6c75c71ae52f32ceb8827eca2169ef4a643d2ccb9f01389d281a85850e2ddd100630ab1ca51310c3e6ccdd3029d0c48db18cdc971dba8f0daff9ad281b56221ffefc7d32333ea310a1f74f99dea444f8a089002cf1f0cd6a4ddf608a7b5388dc09f9417612657b9bf335a466f951547f9707dd129b3c24c900a26010f51c543eba10e9aabef7062845dc6969206b25577a352cb4d984db67c54c7615fe60769726bffa59fd8bd0b66fe29ee3c358af13cf0796c2c062bc79b73271eb0366f0536e425f8e42307ead4c695804fd3281aca5577d9a621e3a8047b14128c280c45343b5bbb783a065d94764e90ad6820fe81a200637401c256b1fb8f58a9d412d303b89c647411662907cdc55ed93adb
222+
//73e6ca87d5cd5622cdc747367905efe7
223+
//68487dc295052aa79c530e283ce698b8c6bb1b42ff0944252e1910dbecdc5425
221224
let data = convert_c_char("639194f4bf964e15d8ea9c9bd9d96918".to_string());
222225
let password = convert_c_char("password".to_string());
223226
let mut seed = hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap();

src/device_setting.h

+1
Original file line numberDiff line numberDiff line change
@@ -52,4 +52,5 @@ void DeviceSettingsTest(int argc, char *argv[]);
5252
bool GetEnableBlindSigning(void);
5353
void SetEnableBlindSigning(bool enable);
5454
void SetBootSecureCheckFlag(bool isSet);
55+
bool GetBootSecureCheckFlag(void);
5556
#endif

src/ui/gui_assets/images_hash.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
2704e955edd599bb96594a78763d6a42
1+
078707a02508f8a8fde177fbd923e28f

src/ui/gui_assets/walletList/walletListKeystone.c

+48-48
Large diffs are not rendered by default.

src/ui/gui_components/gui_status_bar.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ const static CoinWalletInfo_t g_coinWalletBtn[] = {
105105

106106
const static WalletInfo_t g_walletBtn[] = {
107107
#ifndef BTC_ONLY
108-
{WALLET_LIST_KEYSTONE, "Keystone", &walletKeystone},
108+
{WALLET_LIST_KEYSTONE, "Keystone Nexus", &walletKeystone},
109109
{WALLET_LIST_METAMASK, "MetaMask", &walletMetamask},
110110
{WALLET_LIST_OKX, "OKX Wallet", &walletOkx},
111111
{WALLET_LIST_ETERNL, "Eternl Wallet", &walletEternl},

src/ui/gui_wallet/multi/web3/gui_wallet.c

+37-33
Original file line numberDiff line numberDiff line change
@@ -387,59 +387,63 @@ UREncodeResult *GuiGetXrpToolkitDataByIndex(uint16_t index)
387387
return g_urEncode;
388388
}
389389

390-
UREncodeResult *GuiGetKeystoneWalletData(void)
390+
UREncodeResult *GuiGetKeystoneConnectWalletData(void)
391391
{
392392
uint8_t mfp[4] = {0};
393393
GetMasterFingerPrint(mfp);
394394
PtrT_CSliceFFI_ExtendedPublicKey public_keys = SRAM_MALLOC(sizeof(CSliceFFI_ExtendedPublicKey));
395-
// btc 3
395+
// btc 4
396396
// + eth 1
397-
// + bch 1
398-
// + dash 1
399-
// + dot 1
400-
// + ltc 1
401397
// + trx 1
402-
// + xrp 1
403-
404-
// total xpub = 9
405-
uint8_t XPUB_AMMOUNT = 9;
406-
ExtendedPublicKey keys[XPUB_AMMOUNT];
398+
ExtendedPublicKey keys[6];
407399
public_keys->data = keys;
408-
public_keys->size = XPUB_AMMOUNT;
400+
public_keys->size = 6;
409401

410-
keys[0].path = "m/44'/0'/0'";
411-
keys[0].xpub = GetCurrentAccountPublicKey(XPUB_TYPE_BTC_LEGACY);
402+
// eth standard
403+
keys[0].path = "m/44'/60'/0'";
404+
keys[0].xpub = GetCurrentAccountPublicKey(XPUB_TYPE_ETH_BIP44_STANDARD);
412405

413-
keys[1].path = "m/49'/0'/0'";
414-
keys[1].xpub = GetCurrentAccountPublicKey(XPUB_TYPE_BTC);
415406

416-
keys[2].path = "m/84'/0'/0'";
417-
keys[2].xpub = GetCurrentAccountPublicKey(XPUB_TYPE_BTC_NATIVE_SEGWIT);
407+
keys[1].path = "m/44'/0'/0'";
408+
keys[1].xpub = GetCurrentAccountPublicKey(XPUB_TYPE_BTC_LEGACY);
418409

419-
keys[3].path = GetXPubPath(XPUB_TYPE_BCH);
420-
keys[3].xpub = GetCurrentAccountPublicKey(XPUB_TYPE_BCH);
410+
keys[2].path = "m/49'/0'/0'";
411+
keys[2].xpub = GetCurrentAccountPublicKey(XPUB_TYPE_BTC);
421412

422-
keys[4].path = GetXPubPath(XPUB_TYPE_DASH);
423-
keys[4].xpub = GetCurrentAccountPublicKey(XPUB_TYPE_DASH);
413+
keys[3].path = "m/84'/0'/0'";
414+
keys[3].xpub = GetCurrentAccountPublicKey(XPUB_TYPE_BTC_NATIVE_SEGWIT);
424415

425-
keys[5].path = GetXPubPath(XPUB_TYPE_LTC);
426-
keys[5].xpub = GetCurrentAccountPublicKey(XPUB_TYPE_LTC);
416+
keys[4].path = "m/86'/0'/0'";
417+
keys[4].xpub = GetCurrentAccountPublicKey(XPUB_TYPE_BTC_TAPROOT);
427418

428-
keys[6].path = GetXPubPath(XPUB_TYPE_TRX);
429-
keys[6].xpub = GetCurrentAccountPublicKey(XPUB_TYPE_TRX);
419+
keys[5].path = GetXPubPath(XPUB_TYPE_TRX);
420+
keys[5].xpub = GetCurrentAccountPublicKey(XPUB_TYPE_TRX);
430421

431-
keys[7].path = GetXPubPath(XPUB_TYPE_XRP);
432-
keys[7].xpub = GetCurrentAccountPublicKey(XPUB_TYPE_XRP);
433422

434-
keys[8].path = GetXPubPath(XPUB_TYPE_ETH_BIP44_STANDARD);
435-
keys[8].xpub = GetCurrentAccountPublicKey(XPUB_TYPE_ETH_BIP44_STANDARD);
423+
424+
// keys[3].path = GetXPubPath(XPUB_TYPE_BCH);
425+
// keys[3].xpub = GetCurrentAccountPublicKey(XPUB_TYPE_BCH);
426+
427+
// keys[4].path = GetXPubPath(XPUB_TYPE_DASH);
428+
// keys[4].xpub = GetCurrentAccountPublicKey(XPUB_TYPE_DASH);
429+
430+
// keys[5].path = GetXPubPath(XPUB_TYPE_LTC);
431+
// keys[5].xpub = GetCurrentAccountPublicKey(XPUB_TYPE_LTC);
432+
433+
// keys[6].path = GetXPubPath(XPUB_TYPE_TRX);
434+
// keys[6].xpub = GetCurrentAccountPublicKey(XPUB_TYPE_TRX);
435+
436+
// keys[7].path = GetXPubPath(XPUB_TYPE_XRP);
437+
// keys[7].xpub = GetCurrentAccountPublicKey(XPUB_TYPE_XRP);
438+
439+
// keys[8].path = GetXPubPath(XPUB_TYPE_ETH_BIP44_STANDARD);
440+
// keys[8].xpub = GetCurrentAccountPublicKey(XPUB_TYPE_ETH_BIP44_STANDARD);
436441

437442
char serialNumber[256];
438443
GetSerialNumber(serialNumber);
439-
char firmwareVersion[BUFFER_SIZE_32];
444+
char firmwareVersion[12];
440445
GetSoftWareVersionNumber(firmwareVersion);
441-
g_urEncode = get_keystone_wallet_ur(mfp, sizeof(mfp), serialNumber, public_keys, "Keystone 3 Pro", firmwareVersion);
442-
446+
g_urEncode = get_keystone_connect_wallet_ur(mfp, sizeof(mfp), serialNumber, public_keys, "Keystone 3 Pro", firmwareVersion);
443447
CHECK_CHAIN_PRINT(g_urEncode);
444448
SRAM_FREE(public_keys);
445449
return g_urEncode;

src/ui/gui_wallet/multi/web3/gui_wallet.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,6 @@ UREncodeResult *GuiGetXrpToolkitDataByIndex(uint16_t index);
2929
UREncodeResult *GuiGetADADataByIndex(char *walletName);
3030
UREncodeResult *GuiGetImTokenData(void);
3131
UREncodeResult *GuiGetCoreWalletData(void);
32-
UREncodeResult *GuiGetKeystoneWalletData(void);
3332
UREncodeResult *GuiGetThorWalletBtcData(void);
33+
UREncodeResult *GuiGetKeystoneConnectWalletData(void);
3434
#endif

src/ui/gui_widgets/multi/web3/gui_connect_wallet_widgets.c

+11-11
Original file line numberDiff line numberDiff line change
@@ -132,8 +132,7 @@ static const lv_img_dsc_t *g_backpackWalletCoinArray[2] = {
132132
};
133133

134134
static const lv_img_dsc_t *g_keystoneWalletCoinArray[] = {
135-
&coinBtc, &coinEth, &coinBnb, &coinBch,
136-
&coinDash, &coinLtc, &coinTrx, &coinXrp,
135+
&coinBtc, &coinEth,&coinTrx
137136
};
138137

139138
static const lv_img_dsc_t *g_blueWalletCoinArray[4] = {
@@ -324,9 +323,10 @@ static void GuiInitWalletListArray()
324323
case WALLET_LIST_WANDER:
325324
enable = !isTempAccount;
326325
break;
327-
case WALLET_LIST_KEYSTONE:
328-
enable = isRussian;
329-
break;
326+
// open keystone for test
327+
// case WALLET_LIST_KEYSTONE:
328+
// enable = isRussian;
329+
// break;
330330
default:
331331
break;
332332
}
@@ -849,11 +849,11 @@ static void AddKeystoneWalletCoins(void)
849849
lv_img_set_pivot(img, 0, 0);
850850
lv_obj_align(img, LV_ALIGN_TOP_LEFT, 32 * i, 0);
851851
}
852-
lv_obj_t *img = GuiCreateImg(g_coinCont, &imgMore);
853-
lv_img_set_zoom(img, 150);
854-
lv_img_set_pivot(img, 0, 0);
855-
lv_obj_set_style_img_opa(img, LV_OPA_30, LV_PART_MAIN);
856-
lv_obj_align(img, LV_ALIGN_TOP_LEFT, 132, 2);
852+
// lv_obj_t *img = GuiCreateImg(g_coinCont, &imgMore);
853+
// lv_img_set_zoom(img, 150);
854+
// lv_img_set_pivot(img, 0, 0);
855+
// lv_obj_set_style_img_opa(img, LV_OPA_30, LV_PART_MAIN);
856+
// lv_obj_align(img, LV_ALIGN_TOP_LEFT, 132, 2);
857857
}
858858

859859
static void AddBlueWalletCoins(void)
@@ -1352,7 +1352,7 @@ void GuiConnectWalletSetQrdata(WALLET_LIST_INDEX_ENUM index)
13521352
break;
13531353
case WALLET_LIST_KEYSTONE:
13541354
// todo add keystone ur logic
1355-
func = GuiGetKeystoneWalletData;
1355+
func = GuiGetKeystoneConnectWalletData;
13561356
AddKeystoneWalletCoins();
13571357
break;
13581358
default:

src/ui/lv_i18n/data.csv

+1-1
Original file line numberDiff line numberDiff line change
@@ -905,7 +905,7 @@ Wallet Profile,24,wallet_profile_mid_btn,Wallet Profile,Профиль коше
905905
,20,ar_address_check_desc,"Different wallets may generate AR addresses differently, resulting in different addresses from the same phrase. This is normal. After connecting to the software wallet, please compare the address to ensure it matches the hardware wallet.","Разные кошельки могут генерировать AR-адреса по-разному, что приводит к различным адресам от одной и той же фразы. Это нормально. После подключения к программному кошельку, пожалуйста, сравните адрес, чтобы убедиться, что он совпадает с адресом аппаратного кошелька.","서로 다른 지갑은 AR 주소를 다르게 생성할 수 있으며, 결과적으로 동일한 구문에서도 다른 주소가 생성될 수 있습니다. 이는 정상적인 현상입니다. 소프트웨어 지갑에 연결한 후 주소가 하드웨어 지갑과 일치하는지 확인해주시기 바랍니다","不同的钱包可能以不同的方式生成AR地址, 从而导致相同的短语产生不同的地址。这是正常的。连接到软件钱包后, 请比较地址以确保与硬件钱包匹配。","Diferentes monederos pueden generar direcciones AR de manera diferente, resultando en direcciones diferentes a partir de la misma frase. Esto es normal. Después de conectarse al monedero de software, por favor compare la dirección para asegurarse de que coincide con el monedero de hardware.","Unterschiedliche Wallets können AR-Adressen unterschiedlich generieren, was zu unterschiedlichen Adressen aus demselben Satz führt. Dies ist normal. Nach dem Verbinden mit der Software-Wallet vergleichen Sie bitte die Adresse, um sicherzustellen, dass sie mit der Hardware Wallet übereinstimmt",異なるウォレットは、同じフレーズから異なるアドレスを生成する場合があります。これは正常な動作です。ソフトウェアウォレットに接続後、アドレスがハードウェアウォレットと一致するかどうか確認してください。
906906
,20,solana_parse_tx_notice,The accounts in Instructions will be affected by this transaction. Please review carefully.,"Счета, указанные в Инструкциях, будут затронуты этой операцией. Пожалуйста, внимательно проверьте.",지침서에 명시된 계좌들은 이 거래의 영향을 받게 됩니다. 주의 깊게 검토해 주시기 바랍니다.,说明中的账户将受到此交易的影响。请仔细检查。,"Las cuentas indicadas en las Instrucciones se verán afectadas por esta transacción. Por favor, revíselas detenidamente.",Laut Anweisung betroffene Konten werden von dieser Transaktion beeinflusst. Bitte sorgfältig prüfen.,指示書の口座がこの取引の影響を受けます。慎重に確認してください。
907907
,20,solana_alt_notice,The Address Lookup Table URL provides a reference to view detailed account information related to this transaction. Please note that the URL may expire or change over time,"Ссылка на таблицу адресов предоставляет информацию по счетам, связанным с этой операцией. Имейте в виду, что ссылка может измениться или устареть со временем.","주소록 테이블 URL은 이 거래와 관련된 계좌 정보를 제공합니다. 단, URL이 만료되거나 변경될 수 있음을 유의하시기 바랍니다.",地址查找表的网址提供了与此交易相关账户信息的参考。请注意该网址可能会过期。,La URL de la Tabla de Consulta de Direcciones proporciona una referencia para ver la información detallada de las cuentas relacionadas con esta transacción. Tenga en cuenta que la URL puede expirar o cambiar con el tiempo.,"Die URL der Adresstabelle bietet eine Referenz, um detaillierte Kontoinformationen zu dieser Transaktion einzusehen. Bitte beachten Sie, dass die URL ablaufen oder sich ändern kann.",アドレス参照表のURLでは、この取引に関連する詳細な口座情報を確認できます。URLは期限切れや変更の可能性があることにご留意ください。
908-
,20,connect_keystone_title,Keystone,Keystone,Keystone,Keystone,Keystone,Keystone,Keystone
908+
,20,connect_keystone_title,Keystone Nexus,Keystone Nexus,Keystone Nexus,Keystone Nexus,Keystone Nexus,Keystone Nexus,Keystone Nexus
909909
,20,connect_keystone_link,https://keyst.one/t/3rd/keystone,https://keyst.one/t/3rd/keystone,https://keyst.one/t/3rd/keystone,https://keyst.one/t/3rd/keystone,https://keyst.one/t/3rd/keystone,https://keyst.one/t/3rd/keystone,https://keyst.one/t/3rd/keystone
910910
,20,hardware_call_approve_notice,"Please note, if the path not saved on the device will require a password to be recalculated.","Обратите внимание, что если путь не сохранен на устройстве, потребуется пересчитать пароль.",주의사항: 경로가 기기에 저장되어 있지 않으면 비밀번호를 다시 계산해야 합니다.,"请注意,如果路径未保存在设备上,将需要重新计算密码。","Tenga en cuenta que, si la ruta no se guarda en el dispositivo, se requerirá recalcular la contraseña.","Bitte beachten Sie, dass wenn der Pfad nicht auf dem Gerät gespeichert ist, ein Passwort neu berechnet werden muss.",注意事項: デバイスにパスが保存されていない場合、パスワードを再計算する必要があります。
911911
,20,invaild_account_path,Invalid Account Path,Недействительный путь учетной записи,잘못된 계정 경로,无效的账户路径,Ruta de cuenta no válida,Ungültiger Kontopfad,無効なアカウントパス

0 commit comments

Comments
 (0)