What changed, and why it matters
This commit adds the ability to set a BIP-39 passphrase during wallet creation and import, not just afterward in settings. Most of the change is UI flow wiring, but it also fixes a small bug in the SLIP-39 salt construction and adds a length check for passphrases. There is no clear security vulnerability introduced by the patch itself; the main risk is that passphrase handling is complex and any mistake could lock users out of funds or, in edge cases, weaken key derivation.
Treat as a normal feature commit. Review the SLIP-39 salt change for standards compliance (SLIP-39 extendable backups use a specific salt prefix), verify the 255-byte passphrase limit is consistent with BIP-39/SLIP-39 expectations, and ensure the passphrase is cleared from SRAM after use. No immediate security patch is indicated.
Security signals we found
Passphrase now participates in initial wallet creation/import key derivation
SLIP-39 salt construction changed from fixed 6-byte copy to zero-init + strlen-based copy
Passphrase length capped at 255 bytes in MasterSecretEncrypt
New random_buffer combines three RNG sources for entropy generation
Passphrase cached in SRAM and passed via UI signal pointers
Evidence from the diff
The patch extends passphrase support to the initial setup flows (create single phrase, create SLIP-39 shares, import single phrase, import SLIP-39 shares). It adds new passphrase entry tiles, caches the passphrase via SecretCacheSetPassphrase, and applies it when writing entropy/seed to the secure element. A few non-UI changes are notable: SecretCacheSetPassphrase now takes const char*; SLIP-39 salt construction was changed from a 6-byte memcpy of SHAMIR_SALT_HEAD to a memset-zero + strlen-based copy; MasterSecretEncrypt now rejects passphrases over 255 bytes and handles a NULL passphrase; a new random_buffer helper mixes TRNG, DS28S60, and ATECC608B RNG outputs. The passphrase is passed through GUI signals as a string pointer, which is later cached and used in key derivation.
Changed components
src/crypto/slip39/slip39.csrc/crypto/secret_cache.c/hsrc/managers/keystore.csrc/ui/gui_model/gui_model.csrc/ui/gui_widgets/gui_create_wallet_widgets.csrc/ui/gui_widgets/gui_single_phrase_widgets.csrc/ui/gui_widgets/gui_create_share_widgets.csrc/ui/gui_widgets/gui_import_phrase_widgets.csrc/ui/gui_widgets/gui_import_share_widgets.csrc/ui/gui_widgets/setting/gui_passphrase_setting_widgets.cInspect captured patch +709 / −198
diff --git a/images/img/imgEnterPassphrase.png b/images/img/imgEnterPassphrase.png
new file mode 100644
index 0000000..6e83fe0
Binary files /dev/null and b/images/img/imgEnterPassphrase.png differ
diff --git a/src/crypto/secret_cache.c b/src/crypto/secret_cache.c
index bd3c794..151ffa3 100644
--- a/src/crypto/secret_cache.c
+++ b/src/crypto/secret_cache.c
@@ -72,7 +72,7 @@ char *SecretCacheGetPassword(void)
return g_passwordCache;
}
-void SecretCacheSetPassphrase(char *passPhrase)
+void SecretCacheSetPassphrase(const char *passPhrase)
{
if (g_passphraseCache) {
SRAM_FREE(g_passphraseCache);
diff --git a/src/crypto/secret_cache.h b/src/crypto/secret_cache.h
index f6b8546..e8d2469 100644
--- a/src/crypto/secret_cache.h
+++ b/src/crypto/secret_cache.h
@@ -28,7 +28,7 @@ char *SecretCacheGetMnemonic(void);
char *SecretCacheGetSlip39Mnemonic(int index);
void SecretCacheSetSlip39Mnemonic(char *mnemonic, int index);
-void SecretCacheSetPassphrase(char *passPhrase);
+void SecretCacheSetPassphrase(const char *passPhrase);
char *SecretCacheGetPassphrase(void);
void SecretCacheSetIteration(uint8_t ie);
diff --git a/src/crypto/slip39/slip39.c b/src/crypto/slip39/slip39.c
index 4d8e746..4707952 100644
--- a/src/crypto/slip39/slip39.c
+++ b/src/crypto/slip39/slip39.c
@@ -279,7 +279,8 @@ static int _get_salt(uint16_t id, bool eb, uint8_t *salt)
return 0;
} else {
if (salt != NULL) {
- memcpy(salt, SHAMIR_SALT_HEAD, 6);
+ memset(salt, 0, SHAMIR_SALT_HEAD_LEN);
+ memcpy(salt, SHAMIR_SALT_HEAD, strlen(SHAMIR_SALT_HEAD));
salt[6] = id >> 8;
salt[7] = id & 0xFF;
}
@@ -444,7 +445,10 @@ int MasterSecretEncrypt(uint8_t *masterSecret, uint8_t masterSecretLen, uint8_t
uint8_t left[halfLen], right[halfLen], rightTemp[halfLen], key[halfLen];
uint8_t saltLen = _get_salt(identifier, extendableBackupFlag, NULL);
uint8_t salt[saltLen + halfLen];
- uint8_t passPhraseLen = strlen((const char *)passPhrase) + 1;
+ size_t passPhraseLen = (passPhrase != NULL) ? strlen((const char *)passPhrase) + 1 : 1;
+ if (passPhraseLen > 255) {
+ return -1;
+ }
uint8_t pass[passPhraseLen];
uint32_t iterations;
@@ -457,9 +461,10 @@ int MasterSecretEncrypt(uint8_t *masterSecret, uint8_t masterSecretLen, uint8_t
// get salt
_get_salt(identifier, extendableBackupFlag, salt);
- // todo pass
memset(pass, 0, sizeof(pass));
- // memcpy(pass, passPhraseLen + 1, strlen(passPhrase));
+ if (passPhrase != NULL && passPhraseLen > 1) {
+ memcpy(pass + 1, passPhrase, passPhraseLen - 1);
+ }
iterations = PBKDF2_BASE_ITERATION_COUNT << iterationExponent;
for (int i = 0; i < PBKDF2_ROUND_COUNT; i++) {
diff --git a/src/managers/keystore.c b/src/managers/keystore.c
index ec54a44..e0ba394 100644
--- a/src/managers/keystore.c
+++ b/src/managers/keystore.c
@@ -809,6 +809,27 @@ int32_t GenerateTRNGRandomness(uint8_t *randomness, uint8_t len)
return GenerateEntropy(randomness, len, "generate trng randomness");
}
+#ifndef COMPILE_SIMULATOR
+void random_buffer(uint8_t *buf, size_t len)
+{
+ uint8_t *tempBuf1 = SRAM_MALLOC(len);
+ uint8_t *tempBuf2 = SRAM_MALLOC(len);
+
+ if (tempBuf1 && tempBuf2) {
+ TrngGet(buf, len);
+ assert(SE_GetDS28S60Rng(tempBuf1, len) == 0);
+ assert(SE_GetAtecc608bRng(tempBuf2, len) == 0);
+
+ for (size_t i = 0; i < len; i++) {
+ buf[i] ^= tempBuf1[i] ^ tempBuf2[i];
+ }
+
+ SRAM_FREE(tempBuf1);
+ SRAM_FREE(tempBuf2);
+ }
+}
+#endif
+
#ifndef BUILD_PRODUCTION
/// @brief
diff --git a/src/ui/gui_assets/font/cn/cnText.c b/src/ui/gui_assets/font/cn/cnText.c
index 499196f..3fd1ec2 100644
--- a/src/ui/gui_assets/font/cn/cnText.c
+++ b/src/ui/gui_assets/font/cn/cnText.c
@@ -1,7 +1,7 @@
/*******************************************************************************
* Size: 24 px
* Bpp: 2
- * Opts: --bpp 2 --size 24 --no-compress --font NotoSansSC-Regular.ttf --symbols "!#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~£¥·€、一三上不与个中为主么了二于互交产享亮什从代以件传体何作使例保信候允入全公共关准出分列创初删前办功加动助励包化升单卡即压原取受变可号各同名后吗启和固在地址坊型基处备复多天太失奖好如始委子字安完定密导小屏展差已币帐幕广序度建开异式强当径待志忘快念态总恢息悉您情成我或户扩扫拒择持指振换捷接描播擦收改教数文新方日时明易是显暂更未本机条析查标校格检概模款正毕气永池派测消添熵片版状理生用电白的盘相知短码确示私种秒称移程稍立端签简算管类系级纹络绝统继续维网置署脚自要解言计认记许设访证词试详语误请败账资路跳软载输过这进连退选通道重金钟钥钱链锁错键闭问除随隙页额验骰,:? --format lvgl -o ../gui_assets/font/cn/cnText.c
+ * Opts: --bpp 2 --size 24 --no-compress --font NotoSansSC-Regular.ttf --symbols "!#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~£¥·€、一三上不与个中为主么了二于互交产享亮什从代以件传体何作使例保信候允入全公共关准出分列创初删前办功加动助励包化升单卡即压原取受变可号各同名后吗启和固在地址坊型基处备复多天太失奖好如始委子字安完定密导小屏展差已币帐幕广序度建开异式强当径待志忘快念态总恢息悉您情成我或户扩扫拒择持指振换捷接描播擦收改教数文新方日时明易是显暂更未本机条析查标校格检概模款正毕气永池派测消添熵片版状理生用电白的盘相知短码确示禁私种秒称移程稍立端签简算管类系级纹络绝统继续维网置署脚自要解言计认记许设访证词试详语误请败账资路跳软载输过这进连退选通道重金钟钥钱链锁错键闭问除随隙页额验骰,:? --format lvgl -o ../gui_assets/font/cn/cnText.c
******************************************************************************/
#ifdef LV_LVGL_H_INCLUDE_SIMPLE
@@ -4580,6 +4580,26 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = {
0xf0, 0x0, 0x0, 0x0, 0x1, 0xff, 0x40, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ /* U+7981 "禁" */
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x34,
+ 0x0, 0x3, 0xc0, 0x0, 0x0, 0xd0, 0x0, 0xf,
+ 0x0, 0x2, 0xab, 0xe9, 0x2a, 0xbe, 0xa8, 0xf,
+ 0xff, 0xfc, 0xff, 0xff, 0xf0, 0x0, 0xfc, 0x0,
+ 0xf, 0xf0, 0x0, 0xf, 0xfd, 0x0, 0xbf, 0xe0,
+ 0x0, 0xb7, 0x6e, 0xb, 0x7d, 0xe0, 0xb, 0x4d,
+ 0x18, 0xb8, 0xf1, 0xe0, 0xf8, 0x34, 0xf, 0x83,
+ 0xc2, 0xe0, 0x40, 0xd0, 0x4, 0xf, 0x1, 0x0,
+ 0x1a, 0xaa, 0xaa, 0xaa, 0x80, 0x0, 0xbf, 0xff,
+ 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xaa,
+ 0xaa, 0xaa, 0xaa, 0xa9, 0x1f, 0xff, 0xff, 0xff,
+ 0xff, 0xf4, 0x0, 0x0, 0xf, 0x0, 0x0, 0x0,
+ 0x2, 0xd0, 0x3c, 0xb, 0x40, 0x0, 0x2e, 0x0,
+ 0xf0, 0xf, 0x80, 0x3, 0xe0, 0x3, 0xc0, 0xb,
+ 0xc0, 0x7d, 0x2, 0xaf, 0x0, 0x7, 0xc0, 0x40,
+ 0xf, 0xf4, 0x0, 0x4, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0,
+
/* U+79C1 "私" */
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x68, 0x1, 0x80, 0x0, 0x1, 0x6f, 0xf8, 0x2,
@@ -6389,87 +6409,88 @@ static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = {
{.bitmap_index = 30273, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -3},
{.bitmap_index = 30400, .adv_w = 384, .box_w = 22, .box_h = 24, .ofs_x = 0, .ofs_y = -3},
{.bitmap_index = 30532, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -3},
- {.bitmap_index = 30659, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -2},
- {.bitmap_index = 30797, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2},
- {.bitmap_index = 30930, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2},
- {.bitmap_index = 31063, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3},
- {.bitmap_index = 31196, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -3},
- {.bitmap_index = 31334, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -2},
- {.bitmap_index = 31461, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -3},
- {.bitmap_index = 31588, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -1},
- {.bitmap_index = 31709, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3},
- {.bitmap_index = 31847, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2},
- {.bitmap_index = 31980, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3},
+ {.bitmap_index = 30659, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3},
+ {.bitmap_index = 30797, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -2},
+ {.bitmap_index = 30935, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2},
+ {.bitmap_index = 31068, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2},
+ {.bitmap_index = 31201, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3},
+ {.bitmap_index = 31334, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -3},
+ {.bitmap_index = 31472, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -2},
+ {.bitmap_index = 31599, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -3},
+ {.bitmap_index = 31726, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -1},
+ {.bitmap_index = 31847, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3},
+ {.bitmap_index = 31985, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 32118, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3},
{.bitmap_index = 32256, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3},
- {.bitmap_index = 32394, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -2},
- {.bitmap_index = 32527, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -3},
- {.bitmap_index = 32654, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2},
- {.bitmap_index = 32787, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -2},
- {.bitmap_index = 32920, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3},
- {.bitmap_index = 33064, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2},
- {.bitmap_index = 33197, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 1, .ofs_y = -3},
- {.bitmap_index = 33335, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -1},
- {.bitmap_index = 33462, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2},
- {.bitmap_index = 33595, .adv_w = 384, .box_w = 24, .box_h = 22, .ofs_x = 0, .ofs_y = -2},
- {.bitmap_index = 33727, .adv_w = 384, .box_w = 20, .box_h = 21, .ofs_x = 2, .ofs_y = -2},
- {.bitmap_index = 33832, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2},
- {.bitmap_index = 33953, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -2},
- {.bitmap_index = 34080, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2},
- {.bitmap_index = 34213, .adv_w = 384, .box_w = 18, .box_h = 24, .ofs_x = 3, .ofs_y = -3},
- {.bitmap_index = 34321, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -3},
- {.bitmap_index = 34448, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3},
- {.bitmap_index = 34586, .adv_w = 384, .box_w = 22, .box_h = 24, .ofs_x = 1, .ofs_y = -3},
- {.bitmap_index = 34718, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -2},
- {.bitmap_index = 34845, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -2},
- {.bitmap_index = 34978, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -2},
- {.bitmap_index = 35105, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -2},
- {.bitmap_index = 35238, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -2},
- {.bitmap_index = 35365, .adv_w = 384, .box_w = 22, .box_h = 24, .ofs_x = 1, .ofs_y = -3},
- {.bitmap_index = 35497, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -2},
- {.bitmap_index = 35624, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -3},
- {.bitmap_index = 35751, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 1, .ofs_y = -3},
- {.bitmap_index = 35889, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2},
- {.bitmap_index = 36022, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3},
- {.bitmap_index = 36155, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -3},
- {.bitmap_index = 36293, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -2},
- {.bitmap_index = 36426, .adv_w = 384, .box_w = 24, .box_h = 22, .ofs_x = 0, .ofs_y = -2},
- {.bitmap_index = 36558, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -3},
- {.bitmap_index = 36696, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2},
- {.bitmap_index = 36817, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3},
- {.bitmap_index = 36961, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -3},
- {.bitmap_index = 37099, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3},
- {.bitmap_index = 37243, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 1, .ofs_y = -3},
- {.bitmap_index = 37381, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3},
- {.bitmap_index = 37525, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -2},
- {.bitmap_index = 37652, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3},
- {.bitmap_index = 37796, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -2},
- {.bitmap_index = 37923, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3},
- {.bitmap_index = 38067, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -2},
- {.bitmap_index = 38194, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 1, .ofs_y = -3},
- {.bitmap_index = 38332, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -3},
- {.bitmap_index = 38470, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3},
- {.bitmap_index = 38608, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2},
- {.bitmap_index = 38729, .adv_w = 384, .box_w = 24, .box_h = 22, .ofs_x = 0, .ofs_y = -1},
- {.bitmap_index = 38861, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2},
- {.bitmap_index = 38994, .adv_w = 384, .box_w = 22, .box_h = 24, .ofs_x = 0, .ofs_y = -3},
- {.bitmap_index = 39126, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -2},
- {.bitmap_index = 39264, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3},
- {.bitmap_index = 39408, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -2},
- {.bitmap_index = 39546, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3},
- {.bitmap_index = 39690, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3},
- {.bitmap_index = 39834, .adv_w = 384, .box_w = 20, .box_h = 22, .ofs_x = 2, .ofs_y = -2},
- {.bitmap_index = 39944, .adv_w = 384, .box_w = 20, .box_h = 23, .ofs_x = 2, .ofs_y = -3},
- {.bitmap_index = 40059, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 1, .ofs_y = -3},
+ {.bitmap_index = 32394, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3},
+ {.bitmap_index = 32532, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -2},
+ {.bitmap_index = 32665, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -3},
+ {.bitmap_index = 32792, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2},
+ {.bitmap_index = 32925, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -2},
+ {.bitmap_index = 33058, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3},
+ {.bitmap_index = 33202, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2},
+ {.bitmap_index = 33335, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 1, .ofs_y = -3},
+ {.bitmap_index = 33473, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -1},
+ {.bitmap_index = 33600, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2},
+ {.bitmap_index = 33733, .adv_w = 384, .box_w = 24, .box_h = 22, .ofs_x = 0, .ofs_y = -2},
+ {.bitmap_index = 33865, .adv_w = 384, .box_w = 20, .box_h = 21, .ofs_x = 2, .ofs_y = -2},
+ {.bitmap_index = 33970, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2},
+ {.bitmap_index = 34091, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -2},
+ {.bitmap_index = 34218, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2},
+ {.bitmap_index = 34351, .adv_w = 384, .box_w = 18, .box_h = 24, .ofs_x = 3, .ofs_y = -3},
+ {.bitmap_index = 34459, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -3},
+ {.bitmap_index = 34586, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3},
+ {.bitmap_index = 34724, .adv_w = 384, .box_w = 22, .box_h = 24, .ofs_x = 1, .ofs_y = -3},
+ {.bitmap_index = 34856, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -2},
+ {.bitmap_index = 34983, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -2},
+ {.bitmap_index = 35116, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -2},
+ {.bitmap_index = 35243, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -2},
+ {.bitmap_index = 35376, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -2},
+ {.bitmap_index = 35503, .adv_w = 384, .box_w = 22, .box_h = 24, .ofs_x = 1, .ofs_y = -3},
+ {.bitmap_index = 35635, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -2},
+ {.bitmap_index = 35762, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -3},
+ {.bitmap_index = 35889, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 1, .ofs_y = -3},
+ {.bitmap_index = 36027, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2},
+ {.bitmap_index = 36160, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3},
+ {.bitmap_index = 36293, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -3},
+ {.bitmap_index = 36431, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -2},
+ {.bitmap_index = 36564, .adv_w = 384, .box_w = 24, .box_h = 22, .ofs_x = 0, .ofs_y = -2},
+ {.bitmap_index = 36696, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -3},
+ {.bitmap_index = 36834, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2},
+ {.bitmap_index = 36955, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3},
+ {.bitmap_index = 37099, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -3},
+ {.bitmap_index = 37237, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3},
+ {.bitmap_index = 37381, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 1, .ofs_y = -3},
+ {.bitmap_index = 37519, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3},
+ {.bitmap_index = 37663, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -2},
+ {.bitmap_index = 37790, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3},
+ {.bitmap_index = 37934, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -2},
+ {.bitmap_index = 38061, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3},
+ {.bitmap_index = 38205, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -2},
+ {.bitmap_index = 38332, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 1, .ofs_y = -3},
+ {.bitmap_index = 38470, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -3},
+ {.bitmap_index = 38608, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3},
+ {.bitmap_index = 38746, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2},
+ {.bitmap_index = 38867, .adv_w = 384, .box_w = 24, .box_h = 22, .ofs_x = 0, .ofs_y = -1},
+ {.bitmap_index = 38999, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2},
+ {.bitmap_index = 39132, .adv_w = 384, .box_w = 22, .box_h = 24, .ofs_x = 0, .ofs_y = -3},
+ {.bitmap_index = 39264, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -2},
+ {.bitmap_index = 39402, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3},
+ {.bitmap_index = 39546, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -2},
+ {.bitmap_index = 39684, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3},
+ {.bitmap_index = 39828, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3},
+ {.bitmap_index = 39972, .adv_w = 384, .box_w = 20, .box_h = 22, .ofs_x = 2, .ofs_y = -2},
+ {.bitmap_index = 40082, .adv_w = 384, .box_w = 20, .box_h = 23, .ofs_x = 2, .ofs_y = -3},
{.bitmap_index = 40197, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 1, .ofs_y = -3},
{.bitmap_index = 40335, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 1, .ofs_y = -3},
- {.bitmap_index = 40473, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -3},
- {.bitmap_index = 40594, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3},
- {.bitmap_index = 40738, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3},
- {.bitmap_index = 40882, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -2},
- {.bitmap_index = 41009, .adv_w = 384, .box_w = 5, .box_h = 9, .ofs_x = 3, .ofs_y = -3},
- {.bitmap_index = 41021, .adv_w = 384, .box_w = 4, .box_h = 17, .ofs_x = 4, .ofs_y = -1},
- {.bitmap_index = 41038, .adv_w = 384, .box_w = 12, .box_h = 20, .ofs_x = 0, .ofs_y = -1}
+ {.bitmap_index = 40473, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 1, .ofs_y = -3},
+ {.bitmap_index = 40611, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -3},
+ {.bitmap_index = 40732, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3},
+ {.bitmap_index = 40876, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3},
+ {.bitmap_index = 41020, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -2},
+ {.bitmap_index = 41147, .adv_w = 384, .box_w = 5, .box_h = 9, .ofs_x = 3, .ofs_y = -3},
+ {.bitmap_index = 41159, .adv_w = 384, .box_w = 4, .box_h = 17, .ofs_x = 4, .ofs_y = -1},
+ {.bitmap_index = 41176, .adv_w = 384, .box_w = 12, .box_h = 20, .ofs_x = 0, .ofs_y = -1}
};
/*---------------------
@@ -6502,17 +6523,17 @@ static const uint16_t unicode_list_1[] = {
0x697e, 0x6a9b, 0x6ac0, 0x6b32, 0x6b71, 0x6b95, 0x6bbd, 0x6c9b,
0x6ca8, 0x6ce5, 0x6d58, 0x7112, 0x71a4, 0x71a5, 0x7213, 0x7363,
0x747c, 0x7485, 0x7492, 0x75da, 0x75e1, 0x7635, 0x7655, 0x7742,
- 0x774a, 0x775e, 0x77cb, 0x7897, 0x791e, 0x792a, 0x792f, 0x794d,
- 0x7958, 0x7968, 0x796a, 0x7a28, 0x7a4c, 0x7adb, 0x7add, 0x7af4,
- 0x7afe, 0x7bd8, 0x7c58, 0x7e04, 0x7e16, 0x7e39, 0x7e3a, 0x7e3c,
- 0x7e44, 0x7e4a, 0x7e51, 0x7eae, 0x7ecb, 0x7ecf, 0x8077, 0x8147,
- 0x88de, 0x8940, 0x895d, 0x8afe, 0x8b01, 0x8b0d, 0x8b15, 0x8b1b,
- 0x8b1c, 0x8b1e, 0x8b2a, 0x8b32, 0x8b43, 0x8b4a, 0x8b4c, 0x8b54,
- 0x8c82, 0x8c83, 0x8ca1, 0x8d4c, 0x8d50, 0x8ecc, 0x8eda, 0x8ef0,
- 0x8f24, 0x8f36, 0x8f38, 0x8f3b, 0x8f5d, 0x8f66, 0x8f77, 0x8fb0,
- 0x912a, 0x912e, 0x93fc, 0x9402, 0x940e, 0x945b, 0x945e, 0x9476,
- 0x948b, 0x954a, 0x954b, 0x95c1, 0x95ec, 0x95f6, 0x97d2, 0x97fa,
- 0x99e9, 0x9a0d, 0xfe69, 0xfe77, 0xfe7c
+ 0x774a, 0x775e, 0x77cb, 0x7897, 0x78de, 0x791e, 0x792a, 0x792f,
+ 0x794d, 0x7958, 0x7968, 0x796a, 0x7a28, 0x7a4c, 0x7adb, 0x7add,
+ 0x7af4, 0x7afe, 0x7bd8, 0x7c58, 0x7e04, 0x7e16, 0x7e39, 0x7e3a,
+ 0x7e3c, 0x7e44, 0x7e4a, 0x7e51, 0x7eae, 0x7ecb, 0x7ecf, 0x8077,
+ 0x8147, 0x88de, 0x8940, 0x895d, 0x8afe, 0x8b01, 0x8b0d, 0x8b15,
+ 0x8b1b, 0x8b1c, 0x8b1e, 0x8b2a, 0x8b32, 0x8b43, 0x8b4a, 0x8b4c,
+ 0x8b54, 0x8c82, 0x8c83, 0x8ca1, 0x8d4c, 0x8d50, 0x8ecc, 0x8eda,
+ 0x8ef0, 0x8f24, 0x8f36, 0x8f38, 0x8f3b, 0x8f5d, 0x8f66, 0x8f77,
+ 0x8fb0, 0x912a, 0x912e, 0x93fc, 0x9402, 0x940e, 0x945b, 0x945e,
+ 0x9476, 0x948b, 0x954a, 0x954b, 0x95c1, 0x95ec, 0x95f6, 0x97d2,
+ 0x97fa, 0x99e9, 0x9a0d, 0xfe69, 0xfe77, 0xfe7c
};
/*Collect the unicode lists and glyph_id offsets*/
@@ -6523,7 +6544,7 @@ static const lv_font_fmt_txt_cmap_t cmaps[] = {
},
{
.range_start = 163, .range_length = 65149, .glyph_id_start = 96,
- .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 285, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY
+ .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 286, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY
}
};
@@ -6581,7 +6602,7 @@ static const uint8_t kern_left_class_mapping[] = {
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0
+ 0, 0, 0, 0, 0, 0
};
/*Map glyph_ids to kern right classes*/
@@ -6633,7 +6654,7 @@ static const uint8_t kern_right_class_mapping[] = {
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0
+ 0, 0, 0, 0, 0, 0
};
/*Kern values between classes*/
diff --git a/src/ui/gui_assets/font/ko/koText.c b/src/ui/gui_assets/font/ko/koText.c
index 5ef1347..b128e25 100644
--- a/src/ui/gui_assets/font/ko/koText.c
+++ b/src/ui/gui_assets/font/ko/koText.c
@@ -1,7 +1,7 @@
/*******************************************************************************
* Size: 24 px
* Bpp: 2
- * Opts: --bpp 2 --size 24 --no-compress --font NotoSansKR-Regular.ttf --symbols "!#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~£¥·€原生가간갑강개갭거건검겠결경계고공과관구국그글금기까내너네넷념노는니다단당대더덤덧데도동되된드디딩또뛰라락란래랜러레렛려력렸로료루류르른를름리린림립마만맷메면명모무문미밀및바반받밝방배백버번법변보복본부분붙브블비빠사삭산상새색생샤서선설섬성세션소속손송수스습시식신실십싱아안않알암압액약어언얼업없엇에엔여연예오옵완요용우움워원월웨웹위유으은을음의이인일임입있잊자작잘잠장재잭전점정제져조종주준중즈증지진차체초총추출취치카캔켜코크큰키타탐태택터테템토톤튜트파패펌페포표프플피필하한할함합해행허현형호화확환 --format lvgl -o ../gui_assets/font/ko/koText.c
+ * Opts: --bpp 2 --size 24 --no-compress --font NotoSansKR-Regular.ttf --symbols "!#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~£¥·€原生가간갑강개갭거건검겠결경계고공과관구국그글금기까내너네넷념노는니다단당대더덤덧데도동되된드디딩또뛰라락란래랜러레렛려력렸로료루류르른를름리린림립마만맷메면명모무문미밀및바반받밝방배백버번법변보복본부분붙브블비빠사삭산상새색생샤서선설섬성세션소속손송수스습시식신실십싱아안않알암압액약어언얼업없엇에엔여연예오옵완요용우움워원월웨웹위유으은을음의이인일임입있잊자작잘잠장재잭전점정제져조종주준중즈증지진차체초총추출취치카캔켜코크큰키타탐태택터테템토톤튜트파패펌페포표프플피필하한할함합해행허현형호화확환활 --format lvgl -o ../gui_assets/font/ko/koText.c
******************************************************************************/
#ifdef LV_LVGL_H_INCLUDE_SIMPLE
@@ -4810,6 +4810,23 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = {
0xc0, 0x0, 0xb4, 0x0, 0x0, 0x50, 0x0, 0x2d,
0x0, 0x0, 0x0, 0x0, 0xb, 0x95, 0x55, 0x55,
0x40, 0x2, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xbf,
+ 0xff, 0xff, 0xfc, 0x0,
+
+ /* U+D65C "활" */
+ 0x0, 0xf, 0x0, 0x2, 0x80, 0x0, 0x3, 0xc0,
+ 0x0, 0xf0, 0x7, 0xff, 0xff, 0xfc, 0x3c, 0x0,
+ 0x55, 0x55, 0x55, 0xf, 0x0, 0x1, 0xbf, 0xe0,
+ 0x3, 0xc0, 0x2, 0xf9, 0x6f, 0x40, 0xf0, 0x0,
+ 0xf0, 0x0, 0xf0, 0x3f, 0xf0, 0x3c, 0x0, 0x7c,
+ 0xf, 0xa8, 0x7, 0xfa, 0xfc, 0x3, 0xc0, 0x0,
+ 0x1b, 0xe4, 0x0, 0xf0, 0x0, 0x0, 0xf0, 0x15,
+ 0x3c, 0x2, 0xff, 0xff, 0xff, 0x8f, 0x0, 0x6a,
+ 0xa5, 0x50, 0x3, 0xc0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x3f, 0xff, 0xff, 0xfc, 0x0, 0x5,
+ 0x55, 0x55, 0x5f, 0x0, 0x0, 0x0, 0x0, 0x3,
+ 0xc0, 0x0, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x3d,
+ 0x55, 0x55, 0x54, 0x0, 0xf, 0x0, 0x0, 0x0,
+ 0x0, 0x3, 0xff, 0xff, 0xff, 0xe0, 0x0, 0xff,
0xff, 0xff, 0xfc, 0x0
};
@@ -5169,7 +5186,8 @@ static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = {
{.bitmap_index = 30802, .adv_w = 353, .box_w = 20, .box_h = 20, .ofs_x = 1, .ofs_y = 0},
{.bitmap_index = 30902, .adv_w = 353, .box_w = 21, .box_h = 22, .ofs_x = 1, .ofs_y = -2},
{.bitmap_index = 31018, .adv_w = 353, .box_w = 21, .box_h = 23, .ofs_x = 1, .ofs_y = -2},
- {.bitmap_index = 31139, .adv_w = 353, .box_w = 21, .box_h = 22, .ofs_x = 1, .ofs_y = -2}
+ {.bitmap_index = 31139, .adv_w = 353, .box_w = 21, .box_h = 22, .ofs_x = 1, .ofs_y = -2},
+ {.bitmap_index = 31255, .adv_w = 353, .box_w = 21, .box_h = 22, .ofs_x = 1, .ofs_y = -2}
};
/*---------------------
@@ -5208,7 +5226,7 @@ static const uint16_t unicode_list_1[] = {
0xd08d, 0xd0a9, 0xd0b9, 0xd0fd, 0xd101, 0xd1f9, 0xd215, 0xd269,
0xd285, 0xd2e9, 0xd2f5, 0xd349, 0xd3b9, 0xd461, 0xd469, 0xd499,
0xd4a1, 0xd4b5, 0xd4b9, 0xd4bd, 0xd4c5, 0xd4c6, 0xd4d1, 0xd4e6,
- 0xd525, 0xd561, 0xd572, 0xd595, 0xd5b1, 0xd5b2, 0xd5b5
+ 0xd525, 0xd561, 0xd572, 0xd595, 0xd5b1, 0xd5b2, 0xd5b5, 0xd5b9
};
/*Collect the unicode lists and glyph_id offsets*/
@@ -5218,8 +5236,8 @@ static const lv_font_fmt_txt_cmap_t cmaps[] = {
.unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY
},
{
- .range_start = 163, .range_length = 54710, .glyph_id_start = 96,
- .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 255, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY
+ .range_start = 163, .range_length = 54714, .glyph_id_start = 96,
+ .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 256, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY
}
};
@@ -5273,7 +5291,7 @@ static const uint8_t kern_left_class_mapping[] = {
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0
+ 0, 0, 0, 0, 0, 0, 0, 0
};
/*Map glyph_ids to kern right classes*/
@@ -5321,7 +5339,7 @@ static const uint8_t kern_right_class_mapping[] = {
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0
+ 0, 0, 0, 0, 0, 0, 0, 0
};
/*Kern values between classes*/
diff --git a/src/ui/gui_assets/images_hash.txt b/src/ui/gui_assets/images_hash.txt
index f7b0eab..066b1ad 100644
--- a/src/ui/gui_assets/images_hash.txt
+++ b/src/ui/gui_assets/images_hash.txt
@@ -1 +1 @@
-d33f14272bfaf5e0d9f75b7899cda732
\ No newline at end of file
+1e7148e4c6f6864f125a78e8700445c4
\ No newline at end of file
diff --git a/src/ui/gui_assets/img/imgEnterPassphrase.c b/src/ui/gui_assets/img/imgEnterPassphrase.c
new file mode 100644
index 0000000..28ff0a2
--- /dev/null
+++ b/src/ui/gui_assets/img/imgEnterPassphrase.c
@@ -0,0 +1,64 @@
+#if defined(LV_LVGL_H_INCLUDE_SIMPLE)
+#include "lvgl.h"
+#else
+#include "../lvgl/lvgl.h"
+#endif
+
+#ifndef LV_ATTRIBUTE_MEM_ALIGN
+#define LV_ATTRIBUTE_MEM_ALIGN
+#endif
+
+#ifndef LV_ATTRIBUTE_IMG_IMGENTERPASSPHRASE
+#define LV_ATTRIBUTE_IMG_IMGENTERPASSPHRASE
+#endif
+
+const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_IMGENTERPASSPHRASE uint8_t imgEnterPassphrase_map[] = {
+#if LV_COLOR_DEPTH == 16 && LV_COLOR_16_SWAP != 0
+ /*Pixel format: Blue: 5 bit Green: 6 bit, Red: 5 bit, Alpha 8 bit BUT the 2 color bytes are swapped*/
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x2B, 0xFF, 0xFF, 0x56, 0xFF, 0xFF, 0x72, 0xFF, 0xFF, 0x72, 0xFF, 0xFF, 0x47, 0xFF, 0xFF, 0x2B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x56, 0xFF, 0xFF, 0xBA, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xC8, 0xFF, 0xFF, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x1D, 0xFF, 0xFF, 0xAB, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xC8, 0xFF, 0xFF, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x1D, 0xFF, 0xFF, 0xC9, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xD7, 0xFF, 0xFF, 0x8F, 0xFF, 0xFF, 0x72, 0xFF, 0xFF, 0x72, 0xFF, 0xFF, 0x9E, 0xFF, 0xFF, 0xD7, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xC8, 0xFF, 0xFF, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xC9, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0x73, 0xFF, 0xFF, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x73, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xC8, 0xFF, 0xFF, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x72, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xD7, 0xFF, 0xFF, 0x2B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x2B, 0xFF, 0xFF, 0xD7, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x0E, 0xFF, 0xFF, 0xC9, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x64, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xD7, 0xFF, 0xFF, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x56, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xC8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xAC, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x81, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x72, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xAB, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x47, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0x9D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xAB, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x39, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xAC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xAB, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x39, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xAC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x39, 0xFF, 0xFF, 0x72, 0xFF, 0xFF, 0x72, 0xFF, 0xFF, 0x72, 0xFF, 0xFF, 0xC9, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0x8F, 0xFF, 0xFF, 0x72, 0xFF, 0xFF, 0x72, 0xFF, 0xFF, 0x72, 0xFF, 0xFF, 0x72, 0xFF, 0xFF, 0x72, 0xFF, 0xFF, 0x72, 0xFF, 0xFF, 0x72, 0xFF, 0xFF, 0x72, 0xFF, 0xFF, 0x72, 0xFF, 0xFF, 0x72, 0xFF, 0xFF, 0x72, 0xFF, 0xFF, 0x72, 0xFF, 0xFF, 0x8F, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xC8, 0xFF, 0xFF, 0x72, 0xFF, 0xFF, 0x72, 0xFF, 0xFF, 0x72, 0xFF, 0xFF, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x72, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x72, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x72, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xAC, 0xFF, 0xFF, 0x72, 0xFF, 0xFF, 0x72, 0xFF, 0xFF, 0x72, 0xFF, 0xFF, 0x72, 0xFF, 0xFF, 0x72, 0xFF, 0xFF, 0x72, 0xFF, 0xFF, 0x72, 0xFF, 0xFF, 0x72, 0xFF, 0xFF, 0x72, 0xFF, 0xFF, 0x72, 0xFF, 0xFF, 0x72, 0xFF, 0xFF, 0x72, 0xFF, 0xFF, 0x72, 0xFF, 0xFF, 0x72, 0xFF, 0xFF, 0x72, 0xFF, 0xFF, 0x72, 0xFF, 0xFF, 0x72, 0xFF, 0xFF, 0x72, 0xFF, 0xFF, 0x72, 0xFF, 0xFF, 0x72, 0xFF, 0xFF, 0x72, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x72, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x72, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x72, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x72, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x72, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xAB, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0x39, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x72, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x01, 0x20, 0xF4, 0x21, 0x70, 0xF4, 0x21, 0x80, 0xF4, 0x21, 0x70, 0xF4, 0x41, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x72, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xAB, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0x39, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x72, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF4, 0x41, 0x20, 0xF4, 0x41, 0xBF, 0xFC, 0x41, 0xFF, 0xFC, 0x41, 0xFF, 0xFC, 0x41, 0xFF, 0xFC, 0x41, 0xFF, 0xFC, 0x41, 0xFF, 0xFC, 0x41, 0x9F, 0xF4, 0x41, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x72, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xAB, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0x39, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x72, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF4, 0x41, 0x20, 0xFC, 0x41, 0xDF, 0xFC, 0x41, 0xFF, 0xFC, 0x41, 0xFF, 0xFC, 0x41, 0xFF, 0xFC, 0x41, 0xFF, 0xFC, 0x41, 0xFF, 0xFC, 0x41, 0xFF, 0xFC, 0x41, 0xFF, 0xFC, 0x41, 0xDF, 0xF4, 0x41, 0x20, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x72, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF4, 0x21, 0xA0, 0xFC, 0x41, 0xFF, 0xFC, 0x41, 0xFF, 0xFC, 0x41, 0xFF, 0xF4, 0x21, 0xC0, 0xF4, 0x21, 0x80, 0xF4, 0x41, 0xB0, 0xFC, 0x41, 0xFF, 0xFC, 0x41, 0xFF, 0xFC, 0x41, 0xFF, 0xF4, 0x41, 0xBF, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x72, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF4, 0x41, 0x20, 0xFC, 0x41, 0xFF, 0xFC, 0x41, 0xFF, 0xFC, 0x41, 0xFF, 0xF4, 0x41, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF4, 0x41, 0x60, 0xFC, 0x41, 0xFF, 0xFC, 0x41, 0xFF, 0xFC, 0x41, 0xFF, 0xFC, 0x01, 0x20,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x72, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF4, 0x21, 0x70, 0xFC, 0x41, 0xFF, 0xFC, 0x41, 0xFF, 0xF4, 0x21, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x41, 0xBF, 0xFC, 0x41, 0xFF, 0xFC, 0x41, 0xFF, 0xF4, 0x21, 0x70,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x72, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF4, 0x21, 0x80, 0xFC, 0x41, 0xFF, 0xFC, 0x41, 0xFF, 0xF4, 0x21, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF4, 0x21, 0x80, 0xFC, 0x41, 0xFF, 0xFC, 0x41, 0xFF, 0xF4, 0x21, 0x80,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x72, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xC8, 0xFF, 0xFF, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF4, 0x21, 0x70, 0xFC, 0x41, 0xFF, 0xFC, 0x41, 0xFF, 0xF4, 0x41, 0xBF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x21, 0xB0, 0xFC, 0x41, 0xFF, 0xFC, 0x41, 0xFF, 0xF4, 0x21, 0x70,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x1D, 0xFF, 0xFF, 0xC9, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xC8, 0xFF, 0xFF, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x41, 0x20, 0xFC, 0x41, 0xFF, 0xFC, 0x41, 0xFF, 0xFC, 0x41, 0xFF, 0xFC, 0x21, 0x5F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x21, 0x5F, 0xFC, 0x41, 0xFF, 0xFC, 0x41, 0xFF, 0xFC, 0x41, 0xFF, 0xFC, 0x41, 0x20,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x1D, 0xFF, 0xFF, 0xC9, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x41, 0xBF, 0xFC, 0x41, 0xFF, 0xFC, 0x41, 0xFF, 0xFC, 0x41, 0xFF, 0xFC, 0x21, 0xAF, 0xF4, 0x21, 0x80, 0xF4, 0x41, 0xBF, 0xFC, 0x41, 0xFF, 0xFC, 0x41, 0xFF, 0xFC, 0x41, 0xFF, 0xFC, 0x41, 0x9F, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x1D, 0xFF, 0xFF, 0xC9, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x41, 0x20, 0xFC, 0x41, 0xDF, 0xFC, 0x41, 0xFF, 0xFC, 0x41, 0xFF, 0xFC, 0x41, 0xFF, 0xFC, 0x41, 0xFF, 0xFC, 0x41, 0xFF, 0xFC, 0x41, 0xFF, 0xFC, 0x41, 0xFF, 0xFC, 0x41, 0xDF, 0xFC, 0x41, 0x20, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x1D, 0xFF, 0xFF, 0xC9, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xE5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x41, 0x20, 0xF4, 0x21, 0xA0, 0xFC, 0x41, 0xFF, 0xFC, 0x41, 0xFF, 0xFC, 0x41, 0xFF, 0xFC, 0x41, 0xFF, 0xFC, 0x41, 0xFF, 0xF4, 0x21, 0xC0, 0xFC, 0x41, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x41, 0x20, 0xF4, 0x21, 0x70, 0xF4, 0x21, 0x80, 0xF4, 0x21, 0x70, 0xFC, 0x41, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+#endif
+};
+
+const lv_img_dsc_t imgEnterPassphrase = {
+ .header.always_zero = 0,
+ .header.w = 36,
+ .header.h = 36,
+ .data_size = 1296 * LV_IMG_PX_SIZE_ALPHA_BYTE,
+ .header.cf = LV_IMG_CF_TRUE_COLOR_ALPHA,
+ .data = imgEnterPassphrase_map,
+};
diff --git a/src/ui/gui_components/gui_mnemonic_input.c b/src/ui/gui_components/gui_mnemonic_input.c
index 5ad6b39..3e273d3 100644
--- a/src/ui/gui_components/gui_mnemonic_input.c
+++ b/src/ui/gui_components/gui_mnemonic_input.c
@@ -182,12 +182,6 @@ void ImportShareNextSlice(MnemonicKeyBoard_t *mkb, KeyBoard_t *letterKb)
static void ProceedWithBip39(MnemonicKeyBoard_t *mkb)
{
GuiEmitSignal(SIG_SETUP_VIEW_TILE_NEXT, NULL, 0);
- Bip39Data_t bip39 = {
- .wordCnt = mkb->wordCnt,
- .forget = false,
- };
- GuiModelBip39CalWriteSe(bip39);
- GuiCreateCircleAroundAnimation(lv_scr_act(), -40);
}
static void HandleInputType(MnemonicKeyBoard_t *mkb)
diff --git a/src/ui/gui_frame/gui_obj.c b/src/ui/gui_frame/gui_obj.c
index 61e6744..64cd3f4 100644
--- a/src/ui/gui_frame/gui_obj.c
+++ b/src/ui/gui_frame/gui_obj.c
@@ -215,9 +215,6 @@ void *GuiCreateBlindSigningCheckBoxWithFont(lv_obj_t *parent, const char *text,
return checkBox;
}
-
-
-
void *GuiCreateSelectPathCheckBox(lv_obj_t *parent)
{
lv_obj_t *checkBox = lv_btn_create(parent);
diff --git a/src/ui/gui_frame/gui_resource.h b/src/ui/gui_frame/gui_resource.h
index 62fdd62..85f8836 100644
--- a/src/ui/gui_frame/gui_resource.h
+++ b/src/ui/gui_frame/gui_resource.h
@@ -152,6 +152,7 @@ LV_IMG_DECLARE(imgWIF);
LV_IMG_DECLARE(imgSoftwareWallet);
LV_IMG_DECLARE(imgJupiter);
LV_IMG_DECLARE(imgEllipse);
+LV_IMG_DECLARE(imgEnterPassphrase);
// emoji
LV_IMG_DECLARE(emojiAlien);
LV_IMG_DECLARE(emojiAt);
diff --git a/src/ui/gui_model/gui_model.c b/src/ui/gui_model/gui_model.c
index 1775e1e..51952de 100644
--- a/src/ui/gui_model/gui_model.c
+++ b/src/ui/gui_model/gui_model.c
@@ -401,7 +401,10 @@ static int32_t ModelWriteEntropyAndSeed(const void *inData, uint32_t inDataLen)
CHECK_ERRCODE_BREAK("duplicated entropy", ret);
ret = CreateNewAccount(newAccount, entropy, entropyLen, SecretCacheGetNewPassword());
ClearAccountPassphrase(newAccount);
- CHECK_ERRCODE_BREAK("save entropy error", ret);
+ if (SecretCacheGetPassphrase()) {
+ SetPassphrase(GetCurrentAccountIndex(), SecretCacheGetPassphrase(), SecretCacheGetNewPassword());
+ SetPassphraseQuickAccess(GuiPassphraseQuickAccess());
+ }
MODEL_WRITE_SE_END
SetLockScreen(enable);
return 0;
@@ -441,6 +444,10 @@ static int32_t ModelBip39CalWriteEntropyAndSeed(const void *inData, uint32_t inD
ret = CreateNewAccount(newAccount, entropy, (uint8_t)entropyOutLen, SecretCacheGetNewPassword());
CHECK_ERRCODE_BREAK("save entropy error", ret);
ClearAccountPassphrase(newAccount);
+ if (SecretCacheGetPassphrase()) {
+ SetPassphrase(GetCurrentAccountIndex(), SecretCacheGetPassphrase(), SecretCacheGetNewPassword());
+ SetPassphraseQuickAccess(GuiPassphraseQuickAccess());
+ }
ret = VerifyPasswordAndLogin(&newAccount, SecretCacheGetNewPassword());
CHECK_ERRCODE_BREAK("login error", ret);
UpdateFingerSignFlag(GetCurrentAccountIndex(), false);
@@ -735,6 +742,10 @@ static int32_t ModelSlip39WriteEntropy(const void *inData, uint32_t inDataLen)
ret = CreateNewSlip39Account(newAccount, ems, entropy, entropyLen, SecretCacheGetNewPassword(), SecretCacheGetIdentifier(), SecretCacheGetExtendable(), SecretCacheGetIteration());
CHECK_ERRCODE_BREAK("save slip39 entropy error", ret);
ClearAccountPassphrase(newAccount);
+ if (SecretCacheGetPassphrase()) {
+ SetPassphrase(GetCurrentAccountIndex(), SecretCacheGetPassphrase(), SecretCacheGetNewPassword());
+ SetPassphraseQuickAccess(GuiPassphraseQuickAccess());
+ }
MODEL_WRITE_SE_END
SetLockScreen(enable);
@@ -790,6 +801,10 @@ static int32_t ModelSlip39CalWriteEntropyAndSeed(const void *inData, uint32_t in
ret = CreateNewSlip39Account(newAccount, emsBak, entropy, entropyLen, SecretCacheGetNewPassword(), id, eb, ie);
CHECK_ERRCODE_BREAK("save slip39 entropy error", ret);
ClearAccountPassphrase(newAccount);
+ if (SecretCacheGetPassphrase()) {
+ SetPassphrase(GetCurrentAccountIndex(), SecretCacheGetPassphrase(), SecretCacheGetNewPassword());
+ SetPassphraseQuickAccess(GuiPassphraseQuickAccess());
+ }
ret = VerifyPasswordAndLogin(&newAccount, SecretCacheGetNewPassword());
CHECK_ERRCODE_BREAK("login error", ret);
UpdateFingerSignFlag(GetCurrentAccountIndex(), false);
diff --git a/src/ui/gui_views/gui_create_share_view.c b/src/ui/gui_views/gui_create_share_view.c
index e87a565..ce6994f 100644
--- a/src/ui/gui_views/gui_create_share_view.c
+++ b/src/ui/gui_views/gui_create_share_view.c
@@ -28,7 +28,10 @@ int32_t GuiCreateShareViewEventProcess(void *self, uint16_t usEvent, void *param
GuiCreateSharePrevTile();
break;
case SIG_SETUP_VIEW_TILE_NEXT:
- GuiCreateShareNextTile();
+ GuiCreateShareNextTile(NULL);
+ break;
+ case SIG_SETTING_WRITE_PASSPHRASE:
+ GuiCreateShareNextTile((const char *)param);
break;
case SIG_CREATE_SHARE_VIEW_NEXT_SLICE:
GuiCreateShareNextSlice();
diff --git a/src/ui/gui_views/gui_import_phrase_view.c b/src/ui/gui_views/gui_import_phrase_view.c
index 5bdb462..46c0327 100644
--- a/src/ui/gui_views/gui_import_phrase_view.c
+++ b/src/ui/gui_views/gui_import_phrase_view.c
@@ -38,7 +38,10 @@ int32_t GuiImportPhraseViewEventProcess(void *self, uint16_t usEvent, void *para
GuiImportPhrasePrevTile();
break;
case SIG_SETUP_VIEW_TILE_NEXT:
- GuiImportPhraseNextTile();
+ GuiImportPhraseNextTile(NULL);
+ break;
+ case SIG_SETTING_WRITE_PASSPHRASE:
+ GuiImportPhraseNextTile((const char *)param);
break;
#ifdef WEB3_VERSION
case SIG_SETUP_SHOW_TON_MNEMONIC_HINT:
diff --git a/src/ui/gui_views/gui_import_share_view.c b/src/ui/gui_views/gui_import_share_view.c
index 1dea36d..14d0fd3 100644
--- a/src/ui/gui_views/gui_import_share_view.c
+++ b/src/ui/gui_views/gui_import_share_view.c
@@ -49,7 +49,10 @@ int32_t GuiImportShareViewEventProcess(void *self, uint16_t usEvent, void *param
GuiImportSharePrevTile();
break;
case SIG_SETUP_VIEW_TILE_NEXT:
- GuiImportShareNextTile();
+ GuiImportShareNextTile(NULL);
+ break;
+ case SIG_SETTING_WRITE_PASSPHRASE:
+ GuiImportShareNextTile((const char *)param);
break;
default:
return ERR_GUI_UNHANDLED;
diff --git a/src/ui/gui_views/gui_single_phrase_view.c b/src/ui/gui_views/gui_single_phrase_view.c
index 6bc6e79..e28639e 100644
--- a/src/ui/gui_views/gui_single_phrase_view.c
+++ b/src/ui/gui_views/gui_single_phrase_view.c
@@ -28,7 +28,10 @@ int32_t GuiSinglePhraseViewEventProcess(void *self, uint16_t usEvent, void *para
GuiSinglePhrasePrevTile();
break;
case SIG_SETUP_VIEW_TILE_NEXT:
- GuiSinglePhraseNextTile();
+ GuiSinglePhraseNextTile(NULL);
+ break;
+ case SIG_SETTING_WRITE_PASSPHRASE:
+ GuiSinglePhraseNextTile((const char *)param);
break;
case SIG_CREAT_SINGLE_PHRASE_TON_GENERATION_START:
GuiShowTonGeneratingModal(true);
diff --git a/src/ui/gui_widgets/gui_create_share_widgets.c b/src/ui/gui_widgets/gui_create_share_widgets.c
index 7938329..7edd16e 100644
--- a/src/ui/gui_widgets/gui_create_share_widgets.c
+++ b/src/ui/gui_widgets/gui_create_share_widgets.c
@@ -14,12 +14,14 @@
#include "user_utils.h"
#include "motor_manager.h"
#include "gui_page.h"
+#include "gui_setting_widgets.h"
typedef enum {
CREATE_SHARE_SELECT_SLICE = 0,
CREATE_SHARE_CUSTODIAN,
CREATE_SHARE_BACKUPFROM,
CREATE_SHARE_CONFIRM,
+ CREATE_SHARE_PASSPHRASE,
CREATE_SHARE_WRITE_SE,
CREATE_SHARE_BUTT,
@@ -34,6 +36,7 @@ typedef struct CreateShareWidget {
lv_obj_t *custodian;
lv_obj_t *backupFrom;
lv_obj_t *confirm;
+ lv_obj_t *passphrase;
lv_obj_t *writeSe;
} CreateShareWidget_t;
static CreateShareWidget_t g_createShareTileView;
@@ -357,6 +360,11 @@ static void GuiShareBackupWidget(lv_obj_t *parent)
lv_obj_add_event_cb(btn, ShareUpdateTileHandler, LV_EVENT_CLICKED, NULL);
}
+static void GuiSharePassphraseWidget(lv_obj_t *parent)
+{
+ GuiWalletPassphraseEnter(parent, false);
+}
+
static void GuiShareConfirmWidget(lv_obj_t *parent)
{
lv_obj_t *label = GuiCreateTitleLabel(parent, _("single_phrase_confirm_title"));
@@ -377,12 +385,10 @@ void GuiCreateShareInit(uint8_t entropyMethod)
g_entropyMethod = entropyMethod;
g_pageWidget = CreatePageWidget();
lv_obj_t *cont = g_pageWidget->contentZone;
-
lv_obj_t *tileView = GuiCreateTileView(cont);
lv_obj_t *tile = lv_tileview_add_tile(tileView, CREATE_SHARE_SELECT_SLICE, 0, LV_DIR_HOR);
g_createShareTileView.selectSlice = tile;
GuiShareSelectSliceWidget(tile);
-
tile = lv_tileview_add_tile(tileView, CREATE_SHARE_CUSTODIAN, 0, LV_DIR_HOR);
g_createShareTileView.custodian = tile;
GuiShareCustodianWidget(tile);
@@ -395,6 +401,10 @@ void GuiCreateShareInit(uint8_t entropyMethod)
g_createShareTileView.confirm = tile;
GuiShareConfirmWidget(tile);
+ tile = lv_tileview_add_tile(tileView, CREATE_SHARE_PASSPHRASE, 0, LV_DIR_HOR);
+ g_createShareTileView.passphrase = tile;
+ GuiSharePassphraseWidget(tile);
+
tile = lv_tileview_add_tile(tileView, CREATE_SHARE_WRITE_SE, 0, LV_DIR_HOR);
g_createShareTileView.writeSe = tile;
GuiWriteSeWidget(tile);
@@ -408,7 +418,9 @@ void GuiCreateShareInit(uint8_t entropyMethod)
int8_t GuiCreateShareNextSlice(void)
{
- g_createShareTileView.currentSlice++;
+ if (g_createShareTileView.currentSlice < g_selectSliceTile.memberCnt) {
+ g_createShareTileView.currentSlice++;
+ }
if (g_createShareTileView.currentSlice == g_selectSliceTile.memberCnt) {
// GuiModelWriteSe();
GuiEmitSignal(SIG_SETUP_VIEW_TILE_NEXT, NULL, 0);
@@ -429,13 +441,16 @@ int8_t GuiCreateShareNextSlice(void)
return SUCCESS_CODE;
}
-int8_t GuiCreateShareNextTile(void)
+int8_t GuiCreateShareNextTile(const char *passphrase)
{
Slip39Data_t slip39 = {
.threShold = g_selectSliceTile.memberThreshold,
.memberCnt = g_selectSliceTile.memberCnt,
.wordCnt = g_selectCnt,
};
+ if (passphrase != NULL) {
+ SecretCacheSetPassphrase(passphrase);
+ }
switch (g_createShareTileView.currentTile) {
case CREATE_SHARE_SELECT_SLICE:
if (g_entropyMethod == 0) {
@@ -460,8 +475,21 @@ int8_t GuiCreateShareNextTile(void)
lv_obj_add_flag(g_shareBackupTile.nextCont, LV_OBJ_FLAG_HIDDEN);
break;
case CREATE_SHARE_CONFIRM:
- SetNavBarLeftBtn(g_pageWidget->navBarWidget, NVS_LEFT_BUTTON_BUTT, NULL, NULL);
SetNavBarRightBtn(g_pageWidget->navBarWidget, NVS_RIGHT_BUTTON_BUTT, NULL, NULL);
+ if (GuiCreateWalletNeedPassphrase()) {
+ SetNavBarLeftBtn(g_pageWidget->navBarWidget, NVS_BAR_RETURN, ReturnHandler, NULL);
+ SetNavBarRightBtn(g_pageWidget->navBarWidget, NVS_BAR_QUESTION_MARK, OpenPassphraseTutorialHandler, NULL);
+ SetMidBtnLabel(g_pageWidget->navBarWidget, NVS_BAR_MID_LABEL, _("Passphrase"));
+ } else {
+ SetNavBarLeftBtn(g_pageWidget->navBarWidget, NVS_LEFT_BUTTON_BUTT, NULL, NULL);
+ SetNavBarMidBtn(g_pageWidget->navBarWidget, NVS_MID_BUTTON_BUTT, NULL, NULL);
+ g_createShareTileView.currentTile++;
+ GuiModelSlip39WriteSe(g_selectCnt);
+ }
+ break;
+ case CREATE_SHARE_PASSPHRASE:
+ SetNavBarLeftBtn(g_pageWidget->navBarWidget, NVS_LEFT_BUTTON_BUTT, NULL, NULL);
+ SetNavBarMidBtn(g_pageWidget->navBarWidget, NVS_MID_BUTTON_BUTT, NULL, NULL);
GuiModelSlip39WriteSe(g_selectCnt);
break;
}
@@ -481,6 +509,17 @@ int8_t GuiCreateSharePrevTile(void)
case CREATE_SHARE_BACKUPFROM:
lv_obj_add_flag(g_shareBackupTile.nextCont, LV_OBJ_FLAG_HIDDEN);
break;
+ case CREATE_SHARE_CONFIRM:
+ SetNavBarLeftBtn(g_pageWidget->navBarWidget, NVS_BAR_CLOSE, StopCreateViewHandler, NULL);
+ SetNavBarRightBtn(g_pageWidget->navBarWidget, NVS_BAR_WORD_RESET, ResetBtnHandler, NULL);
+ lv_obj_clear_flag(g_shareBackupTile.nextCont, LV_OBJ_FLAG_HIDDEN);
+ break;
+ case CREATE_SHARE_PASSPHRASE:
+ g_createShareTileView.currentSlice--;
+ SetNavBarMidBtn(g_pageWidget->navBarWidget, NVS_MID_BUTTON_BUTT, NULL, NULL);
+ SetNavBarLeftBtn(g_pageWidget->navBarWidget, NVS_BAR_CLOSE, StopCreateViewHandler, NULL);
+ SetNavBarRightBtn(g_pageWidget->navBarWidget, NVS_BAR_WORD_RESET, ResetBtnHandler, NULL);
+ break;
}
g_createShareTileView.currentTile--;
@@ -525,6 +564,9 @@ void GuiCreateShareRefresh(void)
SetNavBarRightBtn(g_pageWidget->navBarWidget, NVS_BAR_WORD_RESET, ResetBtnHandler, NULL);
} else if (g_createShareTileView.currentTile == CREATE_SHARE_WRITE_SE) {
SetNavBarRightBtn(g_pageWidget->navBarWidget, NVS_RIGHT_BUTTON_BUTT, NULL, NULL);
+ } else if (g_createShareTileView.currentTile == CREATE_SHARE_PASSPHRASE) {
+ SetNavBarRightBtn(g_pageWidget->navBarWidget, NVS_BAR_QUESTION_MARK, OpenPassphraseTutorialHandler, NULL);
+ SetMidBtnLabel(g_pageWidget->navBarWidget, NVS_BAR_MID_LABEL, _("Passphrase"));
}
SetNavBarMidBtn(g_pageWidget->navBarWidget, NVS_MID_BUTTON_BUTT, NULL, NULL);
}
diff --git a/src/ui/gui_widgets/gui_create_share_widgets.h b/src/ui/gui_widgets/gui_create_share_widgets.h
index 1f20cd9..1d3f569 100644
--- a/src/ui/gui_widgets/gui_create_share_widgets.h
+++ b/src/ui/gui_widgets/gui_create_share_widgets.h
@@ -5,7 +5,7 @@ void GuiCreateShareInit(uint8_t entropyMethod);
void GuiCreateShareDeInit(void);
void GuiCreateShareRefresh(void);
int8_t GuiCreateSharePrevTile(void);
-int8_t GuiCreateShareNextTile(void);
+int8_t GuiCreateShareNextTile(const char *passphrase);
int8_t GuiCreateShareNextSlice(void);
void GuiCreateShareUpdateMnemonic(void *signalParam, uint16_t paramLen);
diff --git a/src/ui/gui_widgets/gui_create_wallet_widgets.c b/src/ui/gui_widgets/gui_create_wallet_widgets.c
index 6bac365..b14e2de 100644
--- a/src/ui/gui_widgets/gui_create_wallet_widgets.c
+++ b/src/ui/gui_widgets/gui_create_wallet_widgets.c
@@ -42,7 +42,7 @@ static void OpenChangeEntropyHandler(lv_event_t *e);
static void GuiRefreshNavBar(void);
static void CloseChangeEntropyHandler(lv_event_t *e);
static void OpenChangeEntropyTutorialHandler(lv_event_t *e);
-
+static void PassphraseButtonHandler(lv_event_t *e);
#ifdef WEB3_VERSION
static void TonPhraseButtonHandler(lv_event_t *e);
#endif
@@ -58,6 +58,7 @@ static lv_obj_t *g_noticeWindow = NULL;
static char g_pinBuf[PASSWORD_MAX_LEN + 1];
static lv_obj_t *g_openMoreHintBox;
static PageWidget_t *g_changeEntropyPage;
+static lv_obj_t *g_warningCont = NULL;
//indicates the way to generate entropy;
static uint8_t g_selectedEntropyMethod = ENTROPY_TYPE_STANDARD;
@@ -206,7 +207,7 @@ static void SelectImportShareHandler(lv_event_t *e)
g_noticeWindow = GuiCreateMoreInfoHintBox(&imgClose, _("single_phrase_word_amount_select"), moreInfoTable, NUMBER_OF_ARRAYS(moreInfoTable), false, &g_noticeWindow);
}
-static void GuiCreateBackupWidget(lv_obj_t *parent)
+static void GuiCreateBackupWidget(lv_obj_t *parent, bool enablePassphrase)
{
lv_obj_t *label = GuiCreateScrollTitleLabel(parent, _("single_backup_choose_backup_title"));
lv_obj_align(label, LV_ALIGN_DEFAULT, 36, 156 - GUI_MAIN_AREA_OFFSET);
@@ -222,13 +223,13 @@ static void GuiCreateBackupWidget(lv_obj_t *parent)
lv_obj_t *imgArrow = GuiCreateImg(parent, &imgArrowRightO);
GuiButton_t table[] = {
- {.obj = img, .align = LV_ALIGN_DEFAULT, .position = {24, 24}},
- {.obj = GuiCreateLabelWithFontAndTextColor(parent, _("single_backup_single_phrase_title"), g_defLittleTitleFont, 0xF5870A), .align = LV_ALIGN_DEFAULT, .position = {24, 84}},
- {.obj = imgArrow, .align = LV_ALIGN_DEFAULT, .position = {372, 86}},
- {.obj = labelNotice, .align = LV_ALIGN_DEFAULT, .position = {24, 132}}
+ {.obj = img, .align = LV_ALIGN_DEFAULT, .position = {24, 14}},
+ {.obj = GuiCreateLabelWithFontAndTextColor(parent, _("single_backup_single_phrase_title"), g_defLittleTitleFont, 0xF5870A), .align = LV_ALIGN_DEFAULT, .position = {24, 74}},
+ {.obj = imgArrow, .align = LV_ALIGN_DEFAULT, .position = {372, 76}},
+ {.obj = labelNotice, .align = LV_ALIGN_DEFAULT, .position = {24, 112}}
};
- lv_obj_t *button = GuiCreateButton(parent, 432, 216, table, NUMBER_OF_ARRAYS(table), OpenNoticeHandler, NULL);
- lv_obj_align_to(button, label, LV_ALIGN_OUT_BOTTOM_LEFT, -12, 20);
+ lv_obj_t *button = GuiCreateButton(parent, 432, 176, table, NUMBER_OF_ARRAYS(table), OpenNoticeHandler, NULL);
+ lv_obj_align_to(button, label, LV_ALIGN_OUT_BOTTOM_LEFT, -12, 10);
lv_obj_t *line = GuiCreateDividerLine(parent);
lv_obj_align_to(line, button, LV_ALIGN_OUT_BOTTOM_LEFT, -24, 10);
@@ -236,12 +237,12 @@ static void GuiCreateBackupWidget(lv_obj_t *parent)
labelNotice = GuiCreateNoticeLabel(parent, _("single_backup_shamir_desc"));
lv_obj_set_width(labelNotice, 384);
GuiButton_t importTable[] = {
- {.obj = GuiCreateScrollLittleTitleLabel(parent, _("single_backup_shamir_title"), 350), .align = LV_ALIGN_DEFAULT, .position = {24, 24}},
- {.obj = labelNotice, .align = LV_ALIGN_DEFAULT, .position = {24, 72}},
- {.obj = GuiCreateImg(parent, &imgArrowRight), .align = LV_ALIGN_DEFAULT, .position = {372, 26}},
+ {.obj = GuiCreateScrollLittleTitleLabel(parent, _("single_backup_shamir_title"), 350), .align = LV_ALIGN_DEFAULT, .position = {24, 14}},
+ {.obj = labelNotice, .align = LV_ALIGN_DEFAULT, .position = {24, 62}},
+ {.obj = GuiCreateImg(parent, &imgArrowRight), .align = LV_ALIGN_DEFAULT, .position = {372, 16}},
};
- lv_obj_t *importButton = GuiCreateButton(parent, 432, 157, importTable, 3, OpenSecretShareHandler, NULL);
- lv_obj_align_to(importButton, button, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 20);
+ lv_obj_t *importButton = GuiCreateButton(parent, 432, 136, importTable, 3, OpenSecretShareHandler, NULL);
+ lv_obj_align_to(importButton, button, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 10);
lv_obj_t *obj = GuiCreateContainerWithParent(parent, 222, 30);
lv_obj_align(obj, LV_ALIGN_BOTTOM_MID, 0, -54);
@@ -255,10 +256,25 @@ static void GuiCreateBackupWidget(lv_obj_t *parent)
lv_obj_set_style_text_opa(label, LV_OPA_64, LV_PART_MAIN);
lv_obj_add_flag(obj, LV_OBJ_FLAG_HIDDEN);
+ lv_obj_t *warningCont = GuiCreateContainerWithParent(parent, 432, 100);
+ lv_obj_align_to(warningCont, importButton, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 10);
+
+ button = GuiCreateImgLabelAdaptButton(warningCont, _("passphrase_enabled_title"), &imgLock, UnHandler, NULL);
+ lv_obj_clear_flag(button, LV_OBJ_FLAG_CLICKABLE);
+ lv_obj_align(button, LV_ALIGN_TOP_MID, 0, 0);
+
+ lv_obj_t *warningLabel = GuiCreateNoticeLabel(warningCont, _("passphrase_warning_text"));
+ lv_obj_align(warningLabel, LV_ALIGN_TOP_MID, 0, 38);
+ lv_obj_set_style_text_align(warningLabel, LV_TEXT_ALIGN_CENTER, LV_PART_MAIN);
+ lv_obj_set_width(warningLabel, 432);
+ g_warningCont = warningCont;
+ if (!enablePassphrase) {
+ lv_obj_add_flag(g_warningCont, LV_OBJ_FLAG_HIDDEN);
+ }
g_createWalletTileView.diceRollsHint = obj;
}
-static void GuiImportBackupWidget(lv_obj_t *parent)
+static void GuiImportBackupWidget(lv_obj_t *parent, bool enablePassphrase)
{
lv_obj_t *label = GuiCreateScrollTitleLabel(parent, _("import_wallet_choose_method"));
lv_obj_align(label, LV_ALIGN_DEFAULT, 36, 156 - GUI_MAIN_AREA_OFFSET);
@@ -272,13 +288,13 @@ static void GuiImportBackupWidget(lv_obj_t *parent)
lv_obj_set_style_text_opa(labelNotice, LV_OPA_60, LV_PART_MAIN);
lv_obj_t *imgArrow = GuiCreateImg(parent, &imgArrowRightO);
GuiButton_t table[] = {
- {.obj = img, .align = LV_ALIGN_DEFAULT, .position = {24, 24}},
- {.obj = GuiCreateLabelWithFontAndTextColor(parent, _("import_wallet_single_phrase"), g_defLittleTitleFont, 0xF5870A), .align = LV_ALIGN_DEFAULT, .position = {24, 84}},
- {.obj = imgArrow, .align = LV_ALIGN_DEFAULT, .position = {372, 86}},
- {.obj = labelNotice, .align = LV_ALIGN_DEFAULT, .position = {24, 132}}
+ {.obj = img, .align = LV_ALIGN_DEFAULT, .position = {24, 14}},
+ {.obj = GuiCreateLabelWithFontAndTextColor(parent, _("import_wallet_single_phrase"), g_defLittleTitleFont, 0xF5870A), .align = LV_ALIGN_DEFAULT, .position = {24, 74}},
+ {.obj = imgArrow, .align = LV_ALIGN_DEFAULT, .position = {372, 76}},
+ {.obj = labelNotice, .align = LV_ALIGN_DEFAULT, .position = {24, 112}}
};
- lv_obj_t *button = GuiCreateButton(parent, 432, 216, table, NUMBER_OF_ARRAYS(table), ChooseWordsAmountHandler, NULL);
- lv_obj_align_to(button, label, LV_ALIGN_OUT_BOTTOM_LEFT, -12, 20);
+ lv_obj_t *button = GuiCreateButton(parent, 432, 176, table, NUMBER_OF_ARRAYS(table), ChooseWordsAmountHandler, NULL);
+ lv_obj_align_to(button, label, LV_ALIGN_OUT_BOTTOM_LEFT, -12, 10);
lv_obj_t *line = GuiCreateDividerLine(parent);
lv_obj_align_to(line, button, LV_ALIGN_OUT_BOTTOM_LEFT, -24, 10);
@@ -286,13 +302,29 @@ static void GuiImportBackupWidget(lv_obj_t *parent)
labelNotice = GuiCreateNoticeLabel(parent, _("import_wallet_shamir_backup_desc"));
lv_obj_set_width(labelNotice, 384);
GuiButton_t importTable[] = {
- {.obj = GuiCreateScrollLittleTitleLabel(parent, _("import_wallet_shamir_backup"), 350), .align = LV_ALIGN_DEFAULT, .position = {24, 24}},
- {.obj = labelNotice, .align = LV_ALIGN_DEFAULT, .position = {24, 72}},
- {.obj = GuiCreateImg(parent, &imgArrowRight), .align = LV_ALIGN_DEFAULT, .position = {372, 26}},
+ {.obj = GuiCreateScrollLittleTitleLabel(parent, _("import_wallet_shamir_backup"), 350), .align = LV_ALIGN_DEFAULT, .position = {24, 14}},
+ {.obj = labelNotice, .align = LV_ALIGN_DEFAULT, .position = {24, 62}},
+ {.obj = GuiCreateImg(parent, &imgArrowRight), .align = LV_ALIGN_DEFAULT, .position = {372, 16}},
};
- lv_obj_t *importButton = GuiCreateButton(parent, 432, 156, importTable, 3, SelectImportShareHandler, NULL);
- lv_obj_align_to(importButton, button, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 20);
+ lv_obj_t *importButton = GuiCreateButton(parent, 432, 136, importTable, 3, SelectImportShareHandler, NULL);
+ lv_obj_align_to(importButton, button, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 10);
+
+ lv_obj_t *warningCont = GuiCreateContainerWithParent(parent, 432, 100);
+ lv_obj_align_to(warningCont, importButton, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 10);
+
+ button = GuiCreateImgLabelAdaptButton(warningCont, _("passphrase_enabled_title"), &imgEnterPassphrase, UnHandler, NULL);
+ lv_obj_clear_flag(button, LV_OBJ_FLAG_CLICKABLE);
+ lv_obj_align(button, LV_ALIGN_TOP_MID, 0, 0);
+
+ lv_obj_t *warningLabel = GuiCreateNoticeLabel(warningCont, _("passphrase_warning_text"));
+ lv_obj_align(warningLabel, LV_ALIGN_TOP_MID, 0, 38);
+ lv_obj_set_style_text_align(warningLabel, LV_TEXT_ALIGN_CENTER, LV_PART_MAIN);
+ lv_obj_set_width(warningLabel, 432);
+ g_warningCont = warningCont;
+ if (!enablePassphrase) {
+ lv_obj_add_flag(g_warningCont, LV_OBJ_FLAG_HIDDEN);
+ }
}
void GuiCreateWalletInit(uint8_t walletMethod)
@@ -318,9 +350,9 @@ void GuiCreateWalletInit(uint8_t walletMethod)
tile = lv_tileview_add_tile(tileView, CREATE_WALLET_BACKUPFROM, 0, LV_DIR_HOR);
g_createWalletTileView.backupForm = tile;
if (walletMethod == WALLET_METHOD_CREATE) {
- GuiCreateBackupWidget(tile);
+ GuiCreateBackupWidget(tile, false);
} else {
- GuiImportBackupWidget(tile);
+ GuiImportBackupWidget(tile, false);
}
g_createWalletTileView.currentTile = CREATE_WALLET_SETPIN;
@@ -452,7 +484,7 @@ static void GuiRefreshNavBar(void)
}
//import wallet, dont't show change entropy
else {
- SetNavBarRightBtn(g_pageWidget->navBarWidget, NVS_BAR_QUESTION_MARK, QuestionMarkEventCb, NULL);
+ SetNavBarRightBtn(g_pageWidget->navBarWidget, NVS_BAR_MORE_INFO, OpenMoreHandler, NULL);
}
}
if (CREATE_WALLET_SETPIN == g_createWalletTileView.currentTile) {
@@ -478,14 +510,24 @@ void GuiCreateWalletRefresh(void)
static void OpenMoreHandler(lv_event_t *e)
{
- MoreInfoTable_t moreInfoTable[] = {
- {.name = _("change_entropy"), .src = &imgConnect, .callBack = OpenChangeEntropyHandler, NULL},
+ const char *passphraseText = GuiCreateWalletNeedPassphrase() ? _("disable_passphrase") : _("enable_passphrase");
+ if (g_createWalletTileView.walletMethod == WALLET_METHOD_CREATE) {
+ MoreInfoTable_t moreInfoTable[] = {
+ {.name = _("change_entropy"), .src = &imgConnect, .callBack = OpenChangeEntropyHandler, NULL},
+ {.name = passphraseText, .src = &imgEnterPassphrase, .callBack = PassphraseButtonHandler, NULL},
#ifdef WEB3_VERSION
- {.name = _("generate_ton_mnenonic"), .src = &imgTonPhrase, .callBack = TonPhraseButtonHandler, NULL},
+ {.name = _("generate_ton_mnenonic"), .src = &imgTonPhrase, .callBack = TonPhraseButtonHandler, NULL},
#endif
- {.name = _("Tutorial"), .src = &imgTutorial, .callBack = QuestionMarkEventCb, NULL},
- };
- g_openMoreHintBox = GuiCreateMoreInfoHintBox(NULL, NULL, moreInfoTable, NUMBER_OF_ARRAYS(moreInfoTable), true, &g_openMoreHintBox);
+ {.name = _("Tutorial"), .src = &imgTutorial, .callBack = QuestionMarkEventCb, NULL},
+ };
+ g_openMoreHintBox = GuiCreateMoreInfoHintBox(NULL, NULL, moreInfoTable, NUMBER_OF_ARRAYS(moreInfoTable), true, &g_openMoreHintBox);
+ } else {
+ MoreInfoTable_t moreInfoTable[] = {
+ {.name = passphraseText, .src = &imgEnterPassphrase, .callBack = PassphraseButtonHandler, NULL},
+ {.name = _("Tutorial"), .src = &imgTutorial, .callBack = QuestionMarkEventCb, NULL},
+ };
+ g_openMoreHintBox = GuiCreateMoreInfoHintBox(NULL, NULL, moreInfoTable, NUMBER_OF_ARRAYS(moreInfoTable), true, &g_openMoreHintBox);
+ }
}
// Change Entropy
@@ -666,6 +708,26 @@ static void OpenChangeEntropyTutorialHandler(lv_event_t *e)
GuiFrameOpenViewWithParam(&g_tutorialView, &index, sizeof(index));
}
+static void PassphraseButtonHandler(lv_event_t *e)
+{
+ if (lv_obj_has_flag(g_warningCont, LV_OBJ_FLAG_HIDDEN)) {
+ lv_obj_clear_flag(g_warningCont, LV_OBJ_FLAG_HIDDEN);
+ } else {
+ lv_obj_add_flag(g_warningCont, LV_OBJ_FLAG_HIDDEN);
+ }
+
+ GUI_DEL_OBJ(g_openMoreHintBox);
+}
+
+
+bool GuiCreateWalletNeedPassphrase(void)
+{
+ if (g_warningCont == NULL) {
+ return false;
+ }
+ return !lv_obj_has_flag(g_warningCont, LV_OBJ_FLAG_HIDDEN);
+}
+
#ifdef WEB3_VERSION
static void TonPhraseButtonHandler(lv_event_t *e)
{
diff --git a/src/ui/gui_widgets/gui_create_wallet_widgets.h b/src/ui/gui_widgets/gui_create_wallet_widgets.h
index 60100b4..2752773 100644
--- a/src/ui/gui_widgets/gui_create_wallet_widgets.h
+++ b/src/ui/gui_widgets/gui_create_wallet_widgets.h
@@ -16,6 +16,7 @@ void GuiCreateWalletRepeatPinPass(const char* buf);
const char *GetCurrentKbWalletName(void);
void GuiCreateWalletRefresh(void);
void GuiSetupKeyboardWidgetMode(void);
+bool GuiCreateWalletNeedPassphrase(void);
#define WALLET_TYPE_TON 0b00000010
#define ENTROPY_TYPE_STANDARD 0b00000000
diff --git a/src/ui/gui_widgets/gui_import_phrase_widgets.c b/src/ui/gui_widgets/gui_import_phrase_widgets.c
index 797fcbe..012de7f 100644
--- a/src/ui/gui_widgets/gui_import_phrase_widgets.c
+++ b/src/ui/gui_widgets/gui_import_phrase_widgets.c
@@ -14,8 +14,12 @@
#include "gui_single_phrase_widgets.h"
#include "gui_mnemonic_input.h"
#include "gui_page.h"
+#include "gui_create_wallet_widgets.h"
+#include "gui_setting_widgets.h"
+
typedef enum {
SINGLE_PHRASE_INPUT_PHRASE = 0,
+ SINGLE_PHRASE_PASSPHRASE,
SINGLE_PHRASE_WRITE_SE,
SINGLE_PHRASE_BUTT,
@@ -26,6 +30,7 @@ typedef struct ImportSinglePhraseWidget {
lv_obj_t *cont;
lv_obj_t *tileView;
lv_obj_t *inputPhrase;
+ lv_obj_t *passphrase;
lv_obj_t *writeSe;
} ImportSinglePhraseWidget_t;
@@ -106,6 +111,11 @@ void GuiImportPhraseUpdateKeyboard(void)
GuiKeyBoardSetMode(g_importPhraseKb);
}
+static void GuiPassphraseWidget(lv_obj_t *parent)
+{
+ GuiWalletPassphraseEnter(parent, false);
+}
+
void GuiImportPhraseInit(uint8_t num)
{
g_inputWordsCnt = num;
@@ -116,6 +126,10 @@ void GuiImportPhraseInit(uint8_t num)
g_importSinglePhraseTileView.inputPhrase = tile;
GuiInputPhraseWidget(tile);
+ tile = lv_tileview_add_tile(tileView, SINGLE_PHRASE_PASSPHRASE, 0, LV_DIR_HOR);
+ g_importSinglePhraseTileView.passphrase = tile;
+ GuiPassphraseWidget(tile);
+
tile = lv_tileview_add_tile(tileView, SINGLE_PHRASE_WRITE_SE, 0, LV_DIR_HOR);
g_importSinglePhraseTileView.writeSe = tile;
GuiWriteSeWidget(tile);
@@ -127,13 +141,36 @@ void GuiImportPhraseInit(uint8_t num)
lv_obj_set_tile_id(g_importSinglePhraseTileView.tileView, g_importSinglePhraseTileView.currentTile, 0, LV_ANIM_OFF);
}
-int8_t GuiImportPhraseNextTile(void)
+int8_t GuiImportPhraseNextTile(const char *passphrase)
{
+ Bip39Data_t bip39 = {
+ .wordCnt = g_importMkb->wordCnt,
+ .forget = false,
+ };
+ if (passphrase != NULL) {
+ SecretCacheSetPassphrase(passphrase);
+ }
switch (g_importSinglePhraseTileView.currentTile) {
case SINGLE_PHRASE_INPUT_PHRASE:
if (g_buttonCont != NULL) lv_obj_add_flag(g_buttonCont, LV_OBJ_FLAG_HIDDEN);
+ SetNavBarRightBtn(g_pageWidget->navBarWidget, NVS_RIGHT_BUTTON_BUTT, NULL, NULL);
+ if (GuiCreateWalletNeedPassphrase()) {
+ SetNavBarLeftBtn(g_pageWidget->navBarWidget, NVS_BAR_RETURN, ReturnHandler, NULL);
+ SetMidBtnLabel(g_pageWidget->navBarWidget, NVS_BAR_MID_LABEL, _("Passphrase"));
+ SetNavBarRightBtn(g_pageWidget->navBarWidget, NVS_BAR_QUESTION_MARK, OpenPassphraseTutorialHandler, NULL);
+ } else {
+ SetNavBarLeftBtn(g_pageWidget->navBarWidget, NVS_LEFT_BUTTON_BUTT, NULL, NULL);
+ g_importSinglePhraseTileView.currentTile++;
+ GuiModelBip39CalWriteSe(bip39);
+ GuiCreateCircleAroundAnimation(lv_scr_act(), -40);
+ }
+ break;
+ case SINGLE_PHRASE_PASSPHRASE:
SetNavBarLeftBtn(g_pageWidget->navBarWidget, NVS_LEFT_BUTTON_BUTT, NULL, NULL);
SetNavBarRightBtn(g_pageWidget->navBarWidget, NVS_RIGHT_BUTTON_BUTT, NULL, NULL);
+ SetNavBarMidBtn(g_pageWidget->navBarWidget, NVS_MID_BUTTON_BUTT, NULL, NULL);
+ GuiModelBip39CalWriteSe(bip39);
+ GuiCreateCircleAroundAnimation(lv_scr_act(), -40);
break;
}
@@ -146,11 +183,13 @@ int8_t GuiImportPhrasePrevTile(void)
{
switch (g_importSinglePhraseTileView.currentTile) {
case SINGLE_PHRASE_INPUT_PHRASE:
+ GuiCloseCurrentWorkingView();
break;
- case SINGLE_PHRASE_WRITE_SE:
+ case SINGLE_PHRASE_PASSPHRASE:
if (g_buttonCont != NULL) lv_obj_clear_flag(g_buttonCont, LV_OBJ_FLAG_HIDDEN);
- SetNavBarLeftBtn(g_pageWidget->navBarWidget, NVS_BAR_RETURN, CloseCurrentViewHandler, NULL);
- GuiImportPhraseRefresh();
+ SetRightBtnLabel(g_pageWidget->navBarWidget, NVS_BAR_WORD_RESET, _("import_wallet_phrase_clear_btn"));
+ SetRightBtnCb(g_pageWidget->navBarWidget, ResetClearImportHandler, NULL);
+ SetNavBarMidBtn(g_pageWidget->navBarWidget, NVS_MID_BUTTON_BUTT, NULL, NULL);
break;
}
@@ -164,10 +203,17 @@ void GuiImportPhraseRefresh(void)
SetNavBarLeftBtn(g_pageWidget->navBarWidget, NVS_BAR_RETURN, ReturnHandler, NULL);
if (g_importSinglePhraseTileView.currentTile == SINGLE_PHRASE_INPUT_PHRASE) {
SetNavBarLeftBtn(g_pageWidget->navBarWidget, NVS_BAR_RETURN, CloseCurrentViewHandler, NULL);
+ SetRightBtnLabel(g_pageWidget->navBarWidget, NVS_BAR_WORD_RESET, _("import_wallet_phrase_clear_btn"));
+ SetRightBtnCb(g_pageWidget->navBarWidget, ResetClearImportHandler, NULL);
+ SetNavBarMidBtn(g_pageWidget->navBarWidget, NVS_MID_BUTTON_BUTT, NULL, NULL);
+ } else if (g_importSinglePhraseTileView.currentTile == SINGLE_PHRASE_PASSPHRASE) {
+ SetNavBarRightBtn(g_pageWidget->navBarWidget, NVS_BAR_QUESTION_MARK, OpenPassphraseTutorialHandler, NULL);
+ SetMidBtnLabel(g_pageWidget->navBarWidget, NVS_BAR_MID_LABEL, _("Passphrase"));
+ } else {
+ SetNavBarMidBtn(g_pageWidget->navBarWidget, NVS_MID_BUTTON_BUTT, NULL, NULL);
+ SetRightBtnLabel(g_pageWidget->navBarWidget, NVS_BAR_WORD_RESET, _("import_wallet_phrase_clear_btn"));
+ SetRightBtnCb(g_pageWidget->navBarWidget, ResetClearImportHandler, NULL);
}
- SetNavBarMidBtn(g_pageWidget->navBarWidget, NVS_MID_BUTTON_BUTT, NULL, NULL);
- SetRightBtnLabel(g_pageWidget->navBarWidget, NVS_BAR_WORD_RESET, _("import_wallet_phrase_clear_btn"));
- SetRightBtnCb(g_pageWidget->navBarWidget, ResetClearImportHandler, NULL);
}
void GuiImportPhraseDeInit(void)
@@ -190,7 +236,12 @@ void GuiImportPhraseDeInit(void)
static void GuiImportTonMnemonicHandler(lv_event_t *e)
{
GUI_DEL_OBJ(g_noticeWindow)
- GuiEmitSignal(SIG_SETUP_VIEW_TILE_NEXT, NULL, 0);
+ SetNavBarLeftBtn(g_pageWidget->navBarWidget, NVS_LEFT_BUTTON_BUTT, NULL, NULL);
+ SetNavBarRightBtn(g_pageWidget->navBarWidget, NVS_RIGHT_BUTTON_BUTT, NULL, NULL);
+ SetNavBarMidBtn(g_pageWidget->navBarWidget, NVS_MID_BUTTON_BUTT, NULL, NULL);
+ g_importSinglePhraseTileView.currentTile += 2;
+ if (g_buttonCont != NULL) lv_obj_add_flag(g_buttonCont, LV_OBJ_FLAG_HIDDEN);
+ lv_obj_set_tile_id(g_importSinglePhraseTileView.tileView, g_importSinglePhraseTileView.currentTile, 0, LV_ANIM_OFF);
TonData_t ton = {
.forget = false
};
@@ -204,12 +255,6 @@ static void GuiImportMultiCoinMnemonicHandler(lv_event_t *e)
{
GUI_DEL_OBJ(g_noticeWindow)
GuiEmitSignal(SIG_SETUP_VIEW_TILE_NEXT, NULL, 0);
- Bip39Data_t bip39 = {
- .wordCnt = 24,
- .forget = false,
- };
- GuiModelBip39CalWriteSe(bip39);
- GuiCreateCircleAroundAnimation(lv_scr_act(), -40);
}
void GuiShowTonMnemonicHint()
diff --git a/src/ui/gui_widgets/gui_import_phrase_widgets.h b/src/ui/gui_widgets/gui_import_phrase_widgets.h
index 1a882f6..0dafaac 100644
--- a/src/ui/gui_widgets/gui_import_phrase_widgets.h
+++ b/src/ui/gui_widgets/gui_import_phrase_widgets.h
@@ -3,7 +3,7 @@
void GuiImportPhraseInit(uint8_t num);
void GuiImportPhraseDeInit(void);
-int8_t GuiImportPhraseNextTile(void);
+int8_t GuiImportPhraseNextTile(const char *passphrase);
int8_t GuiImportPhrasePrevTile(void);
void GuiImportPhraseWriteSe(bool en, int32_t errCode);
void GuiImportPhraseRefresh(void);
diff --git a/src/ui/gui_widgets/gui_import_share_widgets.c b/src/ui/gui_widgets/gui_import_share_widgets.c
index 7292262..865e3ee 100644
--- a/src/ui/gui_widgets/gui_import_share_widgets.c
+++ b/src/ui/gui_widgets/gui_import_share_widgets.c
@@ -1,5 +1,4 @@
#include "gui.h"
-
#include "gui_views.h"
#include "gui_status_bar.h"
#include "gui_keyboard.h"
@@ -13,9 +12,12 @@
#include "gui_single_phrase_widgets.h"
#include "gui_mnemonic_input.h"
#include "gui_page.h"
+#include "gui_create_wallet_widgets.h"
+#include "gui_setting_widgets.h"
typedef enum {
IMPORT_SHARE_SSB_INPUT = 0,
+ IMPORT_SHARE_PASSPHRASE,
IMPORT_SHARE_WRITE_SE,
IMPORT_SHARE_BUTT,
@@ -26,6 +28,7 @@ typedef struct ImportShareWidget {
lv_obj_t *cont;
lv_obj_t *tileView;
lv_obj_t *ssbInput;
+ lv_obj_t *passphrase;
lv_obj_t *writeSe;
} ImportShareWidget_t;
static ImportShareWidget_t g_importShareTileView;
@@ -77,6 +80,11 @@ static void ImportShareNextSliceHandler(lv_event_t *e)
ImportShareNextSlice(g_importMkb, g_ssbImportKb);
}
+static void GuiSharePassphraseWidget(lv_obj_t *parent)
+{
+ GuiWalletPassphraseEnter(parent, false);
+}
+
static void GuiShareSsbInputWidget(lv_obj_t *parent)
{
uint16_t height = 296;
@@ -143,6 +151,10 @@ void GuiImportShareInit(uint8_t wordsCnt)
g_importShareTileView.ssbInput = tile;
GuiShareSsbInputWidget(tile);
+ tile = lv_tileview_add_tile(tileView, IMPORT_SHARE_PASSPHRASE, 0, LV_DIR_HOR);
+ g_importShareTileView.passphrase = tile;
+ GuiSharePassphraseWidget(tile);
+
tile = lv_tileview_add_tile(tileView, IMPORT_SHARE_WRITE_SE, 0, LV_DIR_HOR);
g_importShareTileView.writeSe = tile;
GuiWriteSeWidget(tile);
@@ -154,22 +166,38 @@ void GuiImportShareInit(uint8_t wordsCnt)
lv_obj_set_tile_id(g_importShareTileView.tileView, g_importShareTileView.currentTile, 0, LV_ANIM_OFF);
}
-int8_t GuiImportShareNextTile(void)
+int8_t GuiImportShareNextTile(const char *passphrase)
{
Slip39Data_t slip39 = {
.threShold = g_importMkb->threShold,
.wordCnt = g_phraseCnt,
.forget = false,
};
+ if (passphrase != NULL) {
+ SecretCacheSetPassphrase(passphrase);
+ }
switch (g_importShareTileView.currentTile) {
case IMPORT_SHARE_SSB_INPUT:
- SetNavBarLeftBtn(g_pageWidget->navBarWidget, NVS_LEFT_BUTTON_BUTT, NULL, NULL);
SetNavBarRightBtn(g_pageWidget->navBarWidget, NVS_RIGHT_BUTTON_BUTT, NULL, NULL);
- GuiCreateCircleAroundAnimation(lv_scr_act(), -40);
- GuiModelSlip39CalWriteSe(slip39);
+ if (GuiCreateWalletNeedPassphrase()) {
+ SetNavBarLeftBtn(g_pageWidget->navBarWidget, NVS_BAR_RETURN, ReturnHandler, NULL);
+ SetMidBtnLabel(g_pageWidget->navBarWidget, NVS_BAR_MID_LABEL, _("Passphrase"));
+ SetNavBarRightBtn(g_pageWidget->navBarWidget, NVS_BAR_QUESTION_MARK, OpenPassphraseTutorialHandler, NULL);
+ } else {
+ g_importShareTileView.currentTile++;
+ SetNavBarLeftBtn(g_pageWidget->navBarWidget, NVS_LEFT_BUTTON_BUTT, NULL, NULL);
+ GuiCreateCircleAroundAnimation(lv_scr_act(), -40);
+ GuiModelSlip39CalWriteSe(slip39);
+ }
lv_obj_add_flag(g_nextCont, LV_OBJ_FLAG_HIDDEN);
lv_obj_add_flag(g_ssbImportKb->cont, LV_OBJ_FLAG_HIDDEN);
break;
+ case IMPORT_SHARE_PASSPHRASE:
+ SetNavBarLeftBtn(g_pageWidget->navBarWidget, NVS_LEFT_BUTTON_BUTT, NULL, NULL);
+ SetNavBarMidBtn(g_pageWidget->navBarWidget, NVS_MID_BUTTON_BUTT, NULL, NULL);
+ GuiCreateCircleAroundAnimation(lv_scr_act(), -40);
+ GuiModelSlip39CalWriteSe(slip39);
+ break;
}
g_importShareTileView.currentTile++;
lv_obj_set_tile_id(g_importShareTileView.tileView, g_importShareTileView.currentTile, 0, LV_ANIM_OFF);
@@ -181,6 +209,12 @@ int8_t GuiImportSharePrevTile(void)
switch (g_importShareTileView.currentTile) {
case IMPORT_SHARE_WRITE_SE:
break;
+ case IMPORT_SHARE_PASSPHRASE:
+ SetNavBarLeftBtn(g_pageWidget->navBarWidget, NVS_BAR_CLOSE, StopCreateViewHandler, NULL);
+ SetNavBarMidBtn(g_pageWidget->navBarWidget, NVS_MID_BUTTON_BUTT, NULL, NULL);
+ SetRightBtnLabel(g_pageWidget->navBarWidget, NVS_BAR_WORD_RESET, _("import_wallet_phrase_clear_btn"));
+ SetRightBtnCb(g_pageWidget->navBarWidget, ConfirmClearHandler, NULL);
+ break;
}
g_importShareTileView.currentTile--;
lv_obj_set_tile_id(g_importShareTileView.tileView, g_importShareTileView.currentTile, 0, LV_ANIM_OFF);
@@ -209,10 +243,15 @@ void GuiImportShareRefresh(void)
SetNavBarLeftBtn(g_pageWidget->navBarWidget, NVS_BAR_CLOSE, StopCreateViewHandler, NULL);
SetRightBtnLabel(g_pageWidget->navBarWidget, NVS_BAR_WORD_RESET, _("import_wallet_phrase_clear_btn"));
SetRightBtnCb(g_pageWidget->navBarWidget, ConfirmClearHandler, NULL);
+ SetNavBarMidBtn(g_pageWidget->navBarWidget, NVS_MID_BUTTON_BUTT, NULL, NULL);
+ } else if (g_importShareTileView.currentTile == IMPORT_SHARE_PASSPHRASE) {
+ SetNavBarRightBtn(g_pageWidget->navBarWidget, NVS_BAR_QUESTION_MARK, OpenPassphraseTutorialHandler, NULL);
+ SetMidBtnLabel(g_pageWidget->navBarWidget, NVS_BAR_MID_LABEL, _("Passphrase"));
+ SetNavBarLeftBtn(g_pageWidget->navBarWidget, NVS_BAR_RETURN, ReturnHandler, NULL);
} else {
SetNavBarLeftBtn(g_pageWidget->navBarWidget, NVS_LEFT_BUTTON_BUTT, NULL, NULL);
SetNavBarRightBtn(g_pageWidget->navBarWidget, NVS_RIGHT_BUTTON_BUTT, NULL, NULL);
+ SetNavBarMidBtn(g_pageWidget->navBarWidget, NVS_MID_BUTTON_BUTT, NULL, NULL);
}
- SetNavBarMidBtn(g_pageWidget->navBarWidget, NVS_MID_BUTTON_BUTT, NULL, NULL);
}
diff --git a/src/ui/gui_widgets/gui_import_share_widgets.h b/src/ui/gui_widgets/gui_import_share_widgets.h
index e60e26f..7e7a3e6 100644
--- a/src/ui/gui_widgets/gui_import_share_widgets.h
+++ b/src/ui/gui_widgets/gui_import_share_widgets.h
@@ -5,7 +5,7 @@ void GuiImportShareInit(uint8_t wordsCnt);
void GuiImportShareDeInit(void);
void GuiImportShareRefresh(void);
int8_t GuiImportSharePrevTile(void);
-int8_t GuiImportShareNextTile(void);
+int8_t GuiImportShareNextTile(const char *passphrase);
int8_t GuiImportShareNextSlice(void);
void GuiImportShareWriteSe(bool en, int32_t ret);
diff --git a/src/ui/gui_widgets/gui_passphrase_widgets.c b/src/ui/gui_widgets/gui_passphrase_widgets.c
index 78f2cb2..2a2bdce 100644
--- a/src/ui/gui_widgets/gui_passphrase_widgets.c
+++ b/src/ui/gui_widgets/gui_passphrase_widgets.c
@@ -249,7 +249,7 @@ static void UpdatePassPhraseHandler(lv_event_t *e)
GuiFrameOpenView(&g_homeView);
}
} else {
- SecretCacheSetPassphrase((char *)repeat);
+ SecretCacheSetPassphrase(repeat);
g_waitAnimWidget.cont = GuiCreateAnimHintBox(480, 278, 82);
g_waitAnimWidget.label = GuiCreateTextLabel(g_waitAnimWidget.cont, _("seed_check_wait_verify"));
lv_obj_align(g_waitAnimWidget.label, LV_ALIGN_BOTTOM_MID, 0, -76);
diff --git a/src/ui/gui_widgets/gui_single_phrase_widgets.c b/src/ui/gui_widgets/gui_single_phrase_widgets.c
index 9da836d..ac9e8cc 100644
--- a/src/ui/gui_widgets/gui_single_phrase_widgets.c
+++ b/src/ui/gui_widgets/gui_single_phrase_widgets.c
@@ -17,11 +17,13 @@
#include "gui_page.h"
#include "gui_pending_hintbox.h"
#include "gui_tutorial_widgets.h"
+#include "gui_setting_widgets.h"
#define SINGLE_PHRASE_MAX_WORDS 24
typedef enum {
SINGLE_PHRASE_RANDOM_PHRASE = 0,
SINGLE_PHRASE_CONFIRM_PHRASE,
+ SINGLE_PHRASE_PASSPHRASE,
SINGLE_PHRASE_WRITE_SE,
SINGLE_PHRASE_CONNECT,
@@ -35,6 +37,7 @@ typedef struct SinglePhraseWidget {
lv_obj_t *notice;
lv_obj_t *randomPhrase;
lv_obj_t *confirmPhrase;
+ lv_obj_t *passphrase;
lv_obj_t *writeSe;
lv_obj_t *backupForm;
} SinglePhraseWidget_t;
@@ -203,7 +206,6 @@ static void MnemonicConfirmHandler(lv_event_t *e)
}
}
if (strcmp(confirmMnemonic, SecretCacheGetMnemonic()) == 0) {
- WriteSE();
GuiEmitSignal(SIG_SETUP_VIEW_TILE_NEXT, NULL, 0);
} else {
g_noticeHintBox = GuiCreateErrorCodeWindow(ERR_KEYSTORE_MNEMONIC_NOT_MATCH_WALLET, &g_noticeHintBox, NULL);
@@ -225,6 +227,11 @@ static void ResetConfirmInput(void)
lv_btnmatrix_clear_btn_ctrl_all(g_confirmPhraseKb->btnm, LV_BTNMATRIX_CTRL_CHECKED);
}
+static void GuiPassphraseWidget(lv_obj_t *parent)
+{
+ GuiWalletPassphraseEnter(parent, false);
+}
+
static void GuiConfirmPhraseWidget(lv_obj_t *parent)
{
lv_obj_set_style_bg_opa(parent, LV_OPA_0, LV_PART_SCROLLBAR | LV_STATE_SCROLLED);
@@ -258,6 +265,10 @@ void GuiSinglePhraseInit(uint8_t entropyMethod)
g_singlePhraseTileView.confirmPhrase = tile;
GuiConfirmPhraseWidget(tile);
+ tile = lv_tileview_add_tile(tileView, SINGLE_PHRASE_PASSPHRASE, 0, LV_DIR_HOR);
+ g_singlePhraseTileView.passphrase = tile;
+ GuiPassphraseWidget(tile);
+
tile = lv_tileview_add_tile(tileView, SINGLE_PHRASE_WRITE_SE, 0, LV_DIR_HOR);
g_singlePhraseTileView.writeSe = tile;
GuiWriteSeWidget(tile);
@@ -369,8 +380,11 @@ static void ResetBtnHandler(lv_event_t *e)
ResetConfirmInput();
}
-int8_t GuiSinglePhraseNextTile(void)
+int8_t GuiSinglePhraseNextTile(const char *passphrase)
{
+ if (passphrase != NULL) {
+ SecretCacheSetPassphrase(passphrase);
+ }
switch (g_singlePhraseTileView.currentTile) {
case SINGLE_PHRASE_CONNECT:
return SUCCESS_CODE;
@@ -387,8 +401,21 @@ int8_t GuiSinglePhraseNextTile(void)
GuiUpdateMnemonicKeyBoard(g_confirmPhraseKb, g_randomBuff, true);
break;
case SINGLE_PHRASE_CONFIRM_PHRASE:
+ if (!g_isTon && GuiCreateWalletNeedPassphrase()) {
+ SetMidBtnLabel(g_pageWidget->navBarWidget, NVS_BAR_MID_LABEL, _("Passphrase"));
+ SetNavBarRightBtn(g_pageWidget->navBarWidget, NVS_BAR_QUESTION_MARK, OpenPassphraseTutorialHandler, NULL);
+ } else {
+ g_singlePhraseTileView.currentTile++;
+ SetNavBarLeftBtn(g_pageWidget->navBarWidget, NVS_LEFT_BUTTON_BUTT, NULL, NULL);
+ SetNavBarRightBtn(g_pageWidget->navBarWidget, NVS_RIGHT_BUTTON_BUTT, NULL, NULL);
+ WriteSE();
+ }
+ break;
+ case SINGLE_PHRASE_PASSPHRASE:
SetNavBarLeftBtn(g_pageWidget->navBarWidget, NVS_LEFT_BUTTON_BUTT, NULL, NULL);
+ SetNavBarMidBtn(g_pageWidget->navBarWidget, NVS_MID_BUTTON_BUTT, NULL, NULL);
SetNavBarRightBtn(g_pageWidget->navBarWidget, NVS_RIGHT_BUTTON_BUTT, NULL, NULL);
+ WriteSE();
break;
}
@@ -414,7 +441,8 @@ int8_t GuiSinglePhrasePrevTile(void)
SetNavBarRightBtn(g_pageWidget->navBarWidget, NVS_BAR_QUESTION_MARK, OpenTonTutorial, NULL);
}
break;
- case SINGLE_PHRASE_WRITE_SE:
+ case SINGLE_PHRASE_PASSPHRASE:
+ SetNavBarMidBtn(g_pageWidget->navBarWidget, NVS_MID_BUTTON_BUTT, NULL, NULL);
SetRightBtnLabel(g_pageWidget->navBarWidget, NVS_BAR_WORD_RESET, _("single_phrase_reset"));
SetRightBtnCb(g_pageWidget->navBarWidget, ResetBtnHandler, NULL);
ResetConfirmInput();
@@ -459,11 +487,15 @@ void GuiSinglePhraseRefresh(void)
SetNavBarRightBtn(g_pageWidget->navBarWidget, NVS_BAR_QUESTION_MARK, OpenTonTutorial, NULL);
}
SetNavBarLeftBtn(g_pageWidget->navBarWidget, NVS_BAR_RETURN, CloseCurrentViewHandler, NULL);
+ SetNavBarMidBtn(g_pageWidget->navBarWidget, NVS_MID_BUTTON_BUTT, NULL, NULL);
} else if (g_singlePhraseTileView.currentTile == SINGLE_PHRASE_CONFIRM_PHRASE) {
SetRightBtnLabel(g_pageWidget->navBarWidget, NVS_BAR_WORD_RESET, _("single_phrase_reset"));
+ SetNavBarMidBtn(g_pageWidget->navBarWidget, NVS_MID_BUTTON_BUTT, NULL, NULL);
SetRightBtnCb(g_pageWidget->navBarWidget, ResetBtnHandler, NULL);
+ } else if (g_singlePhraseTileView.currentTile == SINGLE_PHRASE_PASSPHRASE) {
+ SetNavBarRightBtn(g_pageWidget->navBarWidget, NVS_BAR_QUESTION_MARK, OpenPassphraseTutorialHandler, NULL);
+ SetMidBtnLabel(g_pageWidget->navBarWidget, NVS_BAR_MID_LABEL, _("Passphrase"));
}
- SetNavBarMidBtn(g_pageWidget->navBarWidget, NVS_MID_BUTTON_BUTT, NULL, NULL);
}
#ifdef WEB3_VERSION
diff --git a/src/ui/gui_widgets/gui_single_phrase_widgets.h b/src/ui/gui_widgets/gui_single_phrase_widgets.h
index 81041a7..3a330e3 100644
--- a/src/ui/gui_widgets/gui_single_phrase_widgets.h
+++ b/src/ui/gui_widgets/gui_single_phrase_widgets.h
@@ -2,7 +2,7 @@
#define _GUI_SINGLE_PHRASE_WIDGETS_H
void GuiSinglePhraseInit(uint8_t entropyMethod);
-int8_t GuiSinglePhraseNextTile(void);
+int8_t GuiSinglePhraseNextTile(const char *passphrase);
int8_t GuiSinglePhrasePrevTile(void);
void GuiSinglePhraseDeInit(void);
void GuiSinglePhraseRefresh(void);
diff --git a/src/ui/gui_widgets/gui_tutorial_widgets.c b/src/ui/gui_widgets/gui_tutorial_widgets.c
index 7097ed8..74db34a 100644
--- a/src/ui/gui_widgets/gui_tutorial_widgets.c
+++ b/src/ui/gui_widgets/gui_tutorial_widgets.c
@@ -146,6 +146,66 @@ static void GuiOpenQRHintBoxHandler(lv_event_t *e)
GuiOpenQRHintBox(t);
}
+static void GuiOpenPassphraseLearnMoreHandler(void)
+{
+ uint16_t height;
+ lv_obj_t *cont = g_tutorialWidget.cont;
+ lv_obj_t *label = GuiCreateTextLabel(cont, _("passphrase_learn_more_title"));
+ lv_obj_align(label, LV_ALIGN_DEFAULT, 36, 156 - GUI_MAIN_AREA_OFFSET);
+
+ lv_obj_t *led = lv_led_create(cont);
+ lv_led_set_brightness(led, 150);
+ lv_obj_align_to(led, label, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 12 + 15);
+ lv_obj_set_size(led, 12, 12);
+ lv_led_set_color(led, ORANGE_COLOR);
+ label = GuiCreateNoticeLabel(cont, _("passphrase_learn_more_desc1"));
+ lv_obj_align_to(label, led, LV_ALIGN_OUT_RIGHT_TOP, 12, -15);
+ height = lv_obj_get_self_height(label) + 12;
+
+ lv_obj_t *newLed = lv_led_create(cont);
+ lv_led_set_brightness(newLed, 150);
+ lv_obj_set_size(newLed, 12, 12);
+ lv_led_set_color(newLed, ORANGE_COLOR);
+ lv_obj_align_to(newLed, led, LV_ALIGN_TOP_LEFT, 0, height + 15);
+ led = newLed;
+ label = GuiCreateNoticeLabel(cont, _("passphrase_learn_more_desc2"));
+ lv_obj_align_to(label, led, LV_ALIGN_OUT_RIGHT_TOP, 12, -15);
+ height = lv_obj_get_self_height(label) + 12;
+
+ newLed = lv_led_create(cont);
+ lv_led_set_brightness(newLed, 150);
+ lv_obj_set_size(newLed, 12, 12);
+ lv_led_set_color(newLed, ORANGE_COLOR);
+ lv_obj_align_to(newLed, led, LV_ALIGN_TOP_LEFT, 0, height + 15);
+ led = newLed;
+ label = GuiCreateNoticeLabel(cont, _("passphrase_learn_more_desc3"));
+ lv_obj_align_to(label, led, LV_ALIGN_OUT_RIGHT_TOP, 12, -15);
+ height = lv_obj_get_self_height(label) + 12;
+
+ newLed = lv_led_create(cont);
+ lv_led_set_brightness(newLed, 150);
+ lv_obj_align(newLed, LV_ALIGN_DEFAULT, 36, 432 - GUI_MAIN_AREA_OFFSET);
+ lv_obj_set_size(newLed, 12, 12);
+ lv_led_set_color(newLed, ORANGE_COLOR);
+ lv_obj_align_to(newLed, led, LV_ALIGN_TOP_LEFT, 0, height + 15);
+ led = newLed;
+ label = GuiCreateNoticeLabel(cont, _("passphrase_learn_more_desc4"));
+ lv_obj_align_to(label, led, LV_ALIGN_OUT_RIGHT_TOP, 12, -15);
+ height = lv_obj_get_self_height(label) + 12;
+
+ cont = GuiCreateContainerWithParent(cont, 144, 30);
+ lv_obj_align_to(cont, newLed, LV_ALIGN_TOP_LEFT, 0, height);
+ lv_obj_add_flag(cont, LV_OBJ_FLAG_CLICKABLE);
+ lv_obj_add_event_cb(cont, cont, LV_EVENT_CLICKED, NULL);
+
+ label = GuiCreateIllustrateLabel(cont, _("learn_more"));
+ lv_obj_set_style_text_color(label, BLUE_GREEN_COLOR, LV_PART_MAIN);
+
+ lv_obj_t *img = GuiCreateImg(cont, &imgQrcodeTurquoise);
+ lv_obj_align_to(img, label, LV_ALIGN_OUT_RIGHT_MID, 10, 0);
+ lv_obj_set_width(cont, lv_obj_get_self_width(label) + lv_obj_get_self_width(img) + 10);
+}
+
void GuiTutorialInit(TUTORIAL_LIST_INDEX_ENUM tutorialIndex)
{
TutorialsInit();
@@ -163,6 +223,11 @@ void GuiTutorialInit(TUTORIAL_LIST_INDEX_ENUM tutorialIndex)
g_tutorialWidget.cont = parent;
GuiAddObjFlag(parent, LV_OBJ_FLAG_SCROLLABLE);
+ if (tutorialIndex == TUTORIAL_PASSPHRASE_LEARN_MORE) {
+ GuiOpenPassphraseLearnMoreHandler();
+ return;
+ }
+
TutorialList_t *tutorialList = &g_tutorials[tutorialIndex];
for (size_t i = 0; i < tutorialList->len; i++) {
diff --git a/src/ui/gui_widgets/gui_tutorial_widgets.h b/src/ui/gui_widgets/gui_tutorial_widgets.h
index 81b17b4..1f18cf8 100644
--- a/src/ui/gui_widgets/gui_tutorial_widgets.h
+++ b/src/ui/gui_widgets/gui_tutorial_widgets.h
@@ -10,6 +10,7 @@ typedef enum {
TUTORIAL_XMR_RECEIVE,
TUTORIAL_CHANGE_ENTROPY,
TUTORIAL_TON_MNEMONIC,
+ TUTORIAL_PASSPHRASE_LEARN_MORE,
TUTORIAL_LIST_INDEX_BUTT,
} TUTORIAL_LIST_INDEX_ENUM;
diff --git a/src/ui/gui_widgets/setting/gui_passphrase_setting_widgets.c b/src/ui/gui_widgets/setting/gui_passphrase_setting_widgets.c
index 194e665..0294f4b 100644
--- a/src/ui/gui_widgets/setting/gui_passphrase_setting_widgets.c
+++ b/src/ui/gui_widgets/setting/gui_passphrase_setting_widgets.c
@@ -34,9 +34,11 @@ static PassphraseWidget_t g_passphraseWidget;
static void PassphraseQuickAccessHandler(lv_event_t *e);
static void SetKeyboardTaHandler(lv_event_t *e);
static void UpdatePassPhraseHandler(lv_event_t *e);
+static void UpdatePassphraseQuickAccess(lv_event_t *e);
static lv_obj_t *g_passphraseQuickAccessSwitch = NULL;
static KeyBoard_t *g_setPassPhraseKb = NULL; // setting keyboard
+static bool g_needVerify = false;
void GuiWalletPassphrase(lv_obj_t *parent)
{
@@ -99,8 +101,9 @@ void GuiWalletPassphrase(lv_obj_t *parent)
lv_obj_align(button, LV_ALIGN_DEFAULT, 12, 254 - GUI_MAIN_AREA_OFFSET);
}
-void GuiWalletPassphraseEnter(lv_obj_t *parent)
+void GuiWalletPassphraseEnter(lv_obj_t *parent, bool needVerify)
{
+ g_needVerify = needVerify;
lv_obj_set_style_bg_opa(parent, LV_OPA_0, LV_PART_SCROLLBAR | LV_STATE_SCROLLED);
lv_obj_set_style_bg_opa(parent, LV_OPA_0, LV_PART_SCROLLBAR | LV_STATE_DEFAULT);
@@ -172,6 +175,23 @@ void GuiWalletPassphraseEnter(lv_obj_t *parent)
lv_obj_set_style_text_color(label, RED_COLOR, LV_PART_MAIN);
lv_obj_add_flag(label, LV_OBJ_FLAG_HIDDEN);
g_passphraseWidget.lenOverLabel = label;
+
+ if (!needVerify) {
+ label = GuiCreateTextLabel(parent, _("passphrase_access_switch_title"));
+ g_passphraseQuickAccessSwitch = lv_switch_create(parent);
+ lv_obj_set_style_bg_color(g_passphraseQuickAccessSwitch, ORANGE_COLOR, LV_STATE_CHECKED | LV_PART_INDICATOR);
+ lv_obj_set_style_bg_color(g_passphraseQuickAccessSwitch, WHITE_COLOR, LV_PART_MAIN);
+ lv_obj_set_style_bg_opa(g_passphraseQuickAccessSwitch, LV_OPA_30, LV_PART_MAIN);
+ lv_obj_clear_state(g_passphraseQuickAccessSwitch, LV_STATE_CHECKED);
+ GuiButton_t tableSwitch[] = {
+ {.obj = label, .align = LV_ALIGN_DEFAULT, .position = {8, 18},},
+ {.obj = GuiCreateNoticeLabel(parent, _("passphrase_access_switch_desc")), .align = LV_ALIGN_DEFAULT, .position = {8, 60},},
+ {.obj = g_passphraseQuickAccessSwitch, .align = LV_ALIGN_TOP_RIGHT, .position = {-8, 16},},
+ };
+ lv_obj_t *button = GuiCreateButton(parent, 432, 132, tableSwitch, NUMBER_OF_ARRAYS(tableSwitch),
+ UpdatePassphraseQuickAccess, NULL);
+ lv_obj_align(button, LV_ALIGN_TOP_MID, 0, 336 - GUI_MAIN_AREA_OFFSET);
+ }
}
static void SetKeyboardTaHandler(lv_event_t *e)
@@ -199,7 +219,7 @@ static void SetKeyboardTaHandler(lv_event_t *e)
}
}
-static void PassphraseQuickAccessHandler(lv_event_t *e)
+static void UpdatePassphraseQuickAccess(lv_event_t *e)
{
lv_obj_t *switchBox = g_passphraseQuickAccessSwitch;
bool en = lv_obj_has_state(switchBox, LV_STATE_CHECKED);
@@ -208,10 +228,22 @@ static void PassphraseQuickAccessHandler(lv_event_t *e)
} else {
lv_obj_add_state(switchBox, LV_STATE_CHECKED);
}
- SetPassphraseQuickAccess(!en);
lv_event_send(switchBox, LV_EVENT_VALUE_CHANGED, NULL);
}
+static void PassphraseQuickAccessHandler(lv_event_t *e)
+{
+ lv_obj_t *switchBox = g_passphraseQuickAccessSwitch;
+ bool en = lv_obj_has_state(switchBox, LV_STATE_CHECKED);
+ UpdatePassphraseQuickAccess(e);
+ SetPassphraseQuickAccess(!en);
+}
+
+bool GuiPassphraseQuickAccess(void)
+{
+ return lv_obj_has_state(g_passphraseQuickAccessSwitch, LV_STATE_CHECKED);
+}
+
static void UpdatePassPhraseHandler(lv_event_t *e)
{
static bool delayFlag = false;
@@ -225,9 +257,14 @@ static void UpdatePassPhraseHandler(lv_event_t *e)
const char *input = lv_textarea_get_text(g_passphraseWidget.inputTa);
const char *repeat = lv_textarea_get_text(g_passphraseWidget.repeatTa);
if (!strcmp(input, repeat)) {
- SecretCacheSetPassphrase((char *)repeat);
- static uint16_t signal = SIG_SETTING_WRITE_PASSPHRASE;
- GuiShowKeyboard(&signal, true, NULL);
+ if (g_needVerify) {
+ SecretCacheSetPassphrase(repeat);
+ static uint16_t signal = SIG_SETTING_WRITE_PASSPHRASE;
+ GuiShowKeyboard(&signal, true, NULL);
+ } else {
+ SecretCacheSetPassphrase(repeat);
+ GuiEmitSignal(SIG_SETTING_WRITE_PASSPHRASE, (char *)repeat, strnlen_s(repeat, PASSWORD_MAX_LEN));
+ }
} else {
delayFlag = true;
lv_obj_clear_flag(g_passphraseWidget.errLabel, LV_OBJ_FLAG_HIDDEN);
diff --git a/src/ui/gui_widgets/setting/gui_setting_widgets.c b/src/ui/gui_widgets/setting/gui_setting_widgets.c
index 7132a0f..0270a96 100644
--- a/src/ui/gui_widgets/setting/gui_setting_widgets.c
+++ b/src/ui/gui_widgets/setting/gui_setting_widgets.c
@@ -20,6 +20,7 @@
#include "screen_manager.h"
#include <stdlib.h>
#include "user_fatfs.h"
+#include "gui_tutorial_widgets.h"
typedef void (*setting_update_cb)(void *obj, void *param);
@@ -206,6 +207,12 @@ static void GuiOpenPassphraseLearnMore()
SetMidBtnLabel(g_pageWidget->navBarWidget, NVS_BAR_MID_LABEL, "");
}
+void OpenPassphraseTutorialHandler(lv_event_t *e)
+{
+ TUTORIAL_LIST_INDEX_ENUM index = TUTORIAL_PASSPHRASE_LEARN_MORE;
+ GuiFrameOpenViewWithParam(&g_tutorialView, &index, sizeof(index));
+}
+
static void OpenPassphraseLearnMoreHandler(lv_event_t *e)
{
GuiOpenPassphraseLearnMore();
@@ -603,7 +610,7 @@ int8_t GuiDevSettingNextTile(uint8_t tileIndex)
break;
case DEVICE_SETTING_PASSPHRASE_ENTER:
tile = lv_tileview_add_tile(g_deviceSetTileView.tileView, currentTile, 0, LV_DIR_HOR);
- GuiWalletPassphraseEnter(tile);
+ GuiWalletPassphraseEnter(tile, true);
strcpy_s(midLabel, sizeof(midLabel), _("Passphrase"));
break;
diff --git a/src/ui/gui_widgets/setting/gui_setting_widgets.h b/src/ui/gui_widgets/setting/gui_setting_widgets.h
index 3437a1f..3b8b75e 100644
--- a/src/ui/gui_widgets/setting/gui_setting_widgets.h
+++ b/src/ui/gui_widgets/setting/gui_setting_widgets.h
@@ -163,10 +163,10 @@ void FingerSignHandler(lv_event_t *e);
void GuiFingerManagerDestruct(void *obj, void *param);
void GuiFpVerifyDestruct(void);
void GuiWalletFingerOpenSign(void);
-
// set passphrase
void GuiWalletPassphrase(lv_obj_t *parent);
-void GuiWalletPassphraseEnter(lv_obj_t *parent);
+void GuiWalletPassphraseEnter(lv_obj_t *parent, bool needVerify);
+void OpenPassphraseTutorialHandler(lv_event_t *e);
// seed check
void GuiWalletRecoveryMethodCheck(lv_obj_t *parent);
diff --git a/src/ui/lv_i18n/data.csv b/src/ui/lv_i18n/data.csv
index 39dc974..4ef219a 100644
--- a/src/ui/lv_i18n/data.csv
+++ b/src/ui/lv_i18n/data.csv
@@ -1050,4 +1050,8 @@ Wallet Profile,24,wallet_profile_mid_btn,Wallet Profile,Профиль коше
,20,connect_medusa_link,https://keyst.one/t/3rd/medusa,https://keyst.one/t/3rd/medusa,https://keyst.one/t/3rd/medusa,https://keyst.one/t/3rd/medusa,https://keyst.one/t/3rd/medusa,https://keyst.one/t/3rd/medusa,https://keyst.one/t/3rd/medusa
,20,swap_token_approve_hint,"This transaction may invovle a swap and token approve operation. Please review details carefully.","Эта транзакция может включать обмен и операцию утверждения токена. Пожалуйста, тщательно проверьте все детали.","이 거래는 스왑 및 토큰 승인 작업을 포함할 수 있습니다. 모든 세부 사항을 주의 깊게 검토하세요.","此交易可能涉及代币交换和代币批准操作。请仔细检查所有细节。","Esta transacción puede incluir una operación de intercambio y aprobación de tokens. Revise cuidadosamente todos los detalles.","Diese Transaktion kann einen Token-Swap und einen Token-Approval-Vorgang umfassen. Bitte überprüfen Sie alle Details sorgfältig.","このトランザクションはトークン交換とトークン承認操作を含む場合があります。すべての詳細を注意深く確認してください。"
,20,iota_max_amount_notice,"In object-based models like IOTA, Max means transferring ownership of the entire coin, so no specific amount is shown.","В моделях на основе объектов, таких как IOTA, Max означает передачу владения всей монетой, поэтому не отображается конкретная сумма.","객체 기반 모델(IOTA)에서 Max는 전체 코인의 소유권을 이전하는 것을 의미하므로 구체적인 금액이 표시되지 않습니다.","在基于对象的模型(如IOTA)中,Max表示转移整个币的所有权,因此不显示具体金额。","En modelos basados en objetos como IOTA, Max significa transferir la propiedad de toda la moneda, por lo que no se muestra una cantidad específica.","In object-based models like IOTA, Max means transferring ownership of the entire coin, so no specific amount is shown.","IOTAのようなオブジェクトベースのモデルでは、Maxは全体のコインの所有権を移転することを意味するため、具体的な金額は表示されません。"
-,20,custom_path_parse_notice,"This address uses a custom HD path.Please verify carefully with your software wallet.","Этот адрес использует пользовательский путь HD. Пожалуйста, проверьте его тщательно с вашим программным кошельком.","이 주소는 사용자 정의 HD 경로를 사용합니다. 소프트웨어 지갑으로 자세히 확인하세요.","此地址使用自定义HD路径。请仔细检查您的软件钱包。","Esta dirección utiliza una ruta HD personalizada. Por favor, verifique cuidadosamente con su billetera de software.","Diese Adresse verwendet einen benutzerdefinierten HD-Pfad. Bitte überprüfen Sie sie sorgfältig mit Ihrer Software-Wallet.","このアドレスはカスタムHDパスを使用しています。ソフトウェアウォレットで詳細に確認してください。"
\ No newline at end of file
+,20,custom_path_parse_notice,"This address uses a custom HD path.Please verify carefully with your software wallet.","Этот адрес использует пользовательский путь HD. Пожалуйста, проверьте его тщательно с вашим программным кошельком.","이 주소는 사용자 정의 HD 경로를 사용합니다. 소프트웨어 지갑으로 자세히 확인하세요.","此地址使用自定义HD路径。请仔细检查您的软件钱包。","Esta dirección utiliza una ruta HD personalizada. Por favor, verifique cuidadosamente con su billetera de software.","Diese Adresse verwendet einen benutzerdefinierten HD-Pfad. Bitte überprüfen Sie sie sorgfältig mit Ihrer Software-Wallet.","このアドレスはカスタムHDパスを使用しています。ソフトウェアウォレットで詳細に確認してください。"
+,20,passphrase_enabled_title,Passphrase Enabled,Пароль включен,패스프레이즈 활성화됨,密码短语已启用,Frase de contraseña habilitada,Passphrase aktiviert,パスフレーズが有効
+,20,passphrase_warning_text,"Passphrase Enabled. Both Seed Phrase and Passphrase required. Forget one, assets lost.","Пароль включен. Требуется как семенная фраза, так и ключевые слова. Забудь об одном, активы потеряны.","패스프레이즈 활성화됨. 시드 구문과 패스프레이즈 모두 필요. 하나를 잊으면 자산이 손실됩니다.","密码短语已启用。需要种子短语和密码短语。忘记一个,资产丢失。","Frase de contraseña habilitada. Se requiere tanto la frase semilla como la frase de contraseña. Olvida una, los activos se pierden.","Passphrase aktiviert. Sowohl Seed-Phrase als auch Passphrase erforderlich. Vergiss eine, Vermögen verloren.","パスフレーズが有効です。シードフレーズとパスフレーズの両方が必要です。一つを忘れると、資産が失われます。"
+,24,enable_passphrase,Enable Passphrase,Включить пароль,패스프레이즈 활성화,启用密码短语,Habilitar frase de contraseña,Passphrase aktivieren,パスフレーズを有効にする
+,24,disable_passphrase,Disable Passphrase,Отключить пароль,패스프레이즈 비활성화,禁用密码短语,Deshabilitar frase de contraseña,Passphrase deaktivieren,パスフレーズを無効にする,
diff --git a/src/ui/lv_i18n/lv_i18n.c b/src/ui/lv_i18n/lv_i18n.c
index 9afc68d..2251bf2 100644
--- a/src/ui/lv_i18n/lv_i18n.c
+++ b/src/ui/lv_i18n/lv_i18n.c
@@ -363,9 +363,11 @@ const static lv_i18n_phrase_t en_singulars[] = {
{"dice_roll_hint_label", "At least 50 times"},
{"dice_roll_max_limit_label", "You've reached the max limits"},
{"dice_rolls_entropy_hint", "Dice rolls as entropy"},
+ {"disable_passphrase", "Disable Passphrase"},
{"enable_blind_signing_hintbox_check", "Do not remind again"},
{"enable_blind_signing_hintbox_context", "The hash data hides transaction details, which may be risky. Please double-check the hash details before signing."},
{"enable_blind_signing_hintbox_title", "Notice"},
+ {"enable_passphrase", "Enable Passphrase"},
{"enter_passcode", "Enter Passcode"},
{"enter_system", "Enter System"},
{"error_box_duplicated_seed_phrase", "Duplicate Seed Phrase"},
@@ -574,6 +576,7 @@ const static lv_i18n_phrase_t en_singulars[] = {
{"passphrase_access_switch_desc", "Create a passphrase shortcut for device boot-up"},
{"passphrase_access_switch_title", "Passphrase Quick Access"},
{"passphrase_add_password", "Now we need you to enter your passcode to setup passphrase wallet."},
+ {"passphrase_enabled_title", "Passphrase Enabled"},
{"passphrase_enter_input", "Input passphrase"},
{"passphrase_enter_repeat", "Confirm passphrase"},
{"passphrase_error_not_match", "Passphrase mismatch"},
@@ -583,6 +586,7 @@ const static lv_i18n_phrase_t en_singulars[] = {
{"passphrase_learn_more_desc3", "To recover your wallet, both the passphrase and seed phrase are required."},
{"passphrase_learn_more_desc4", "Forgetting the passphrase can result in the loss of access to your digital assets."},
{"passphrase_learn_more_title", "What is a Passphrase?"},
+ {"passphrase_warning_text", "Passphrase Enabled. Both Seed Phrase and Passphrase required. Forget one, assets lost."},
{"password_error_cannot_verify_fingerprint", "Couldn’t verify fingerprint"},
{"password_error_duplicated_pincode", "Duplicate PIN code detected. Please use a different one."},
{"password_error_fingerprint_attempts_exceed", "Too many attempts. Please enter your passcode to unlock the device."},
@@ -1308,9 +1312,11 @@ const static lv_i18n_phrase_t de_singulars[] = {
{"dice_roll_hint_label", "Mindestens 50 Mal"},
{"dice_roll_max_limit_label", "Du hast die maximalen Grenzen erreicht."},
{"dice_rolls_entropy_hint", "Würfelrollen als Entropie"},
+ {"disable_passphrase", "Passphrase deaktivieren"},
{"enable_blind_signing_hintbox_check", "Nicht noch einmal anzeigen"},
{"enable_blind_signing_hintbox_context", "Die Hash-Daten verbergen Transaktionsdetails, die riskant sein können. Bitte überprüfen Sie die Hash-Details sorgfältig, bevor Sie unterschreiben."},
{"enable_blind_signing_hintbox_title", "Hinweis"},
+ {"enable_passphrase", "Passphrase aktivieren"},
{"enter_passcode", "Zugangscode eingeben"},
{"enter_system", "Systeme eingeben"},
{"error_box_duplicated_seed_phrase", "Doppelte Wiederherstellungsphrase"},
@@ -1519,6 +1525,7 @@ const static lv_i18n_phrase_t de_singulars[] = {
{"passphrase_access_switch_desc", "Erstellen Sie eine Passwort-Verknüpfung für das Hochfahren des Geräts."},
{"passphrase_access_switch_title", "Schneller Zugriff auf Passwort"},
{"passphrase_add_password", "Jetzt benötigen wir von Ihnen die Eingabe Ihres Passcodes, um Ihre Passphrase-Brieftasche einzurichten."},
+ {"passphrase_enabled_title", "Passphrase aktiviert"},
{"passphrase_enter_input", "Eingabe der Passphrase"},
{"passphrase_enter_repeat", "Bestätige das Passwort"},
{"passphrase_error_not_match", "Passphrase stimmt nicht überein"},
@@ -1528,6 +1535,7 @@ const static lv_i18n_phrase_t de_singulars[] = {
{"passphrase_learn_more_desc3", "Um Ihre Brieftasche wiederherzustellen, sind sowohl die Passphrase als auch der Seed-Ausdruck erforderlich."},
{"passphrase_learn_more_desc4", "Das Vergessen der Passphrase kann dazu führen, dass der Zugang zu Ihren digitalen Vermögenswerten verloren geht."},
{"passphrase_learn_more_title", "Was ist eine Passphrase?"},
+ {"passphrase_warning_text", "Passphrase aktiviert. Sowohl Seed-Phrase als auch Passphrase erforderlich. Vergiss eine, Vermögen verloren."},
{"password_error_cannot_verify_fingerprint", "Konnte Fingerabdruck nicht bestätigen."},
{"password_error_duplicated_pincode", "Doppelter PIN-Code erkannt. Bitte verwenden Sie einen anderen."},
{"password_error_fingerprint_attempts_exceed", "Zu viele Versuche. Bitte geben Sie Ihren Zugangscode ein, um das Gerät zu entsperren."},
@@ -2253,9 +2261,11 @@ const static lv_i18n_phrase_t es_singulars[] = {
{"dice_roll_hint_label", "Al menos 50 veces"},
{"dice_roll_max_limit_label", "Has alcanzado los límites máximos"},
{"dice_rolls_entropy_hint", "Los lanzamientos de dados como entropía"},
+ {"disable_passphrase", "Deshabilitar frase de contraseña"},
{"enable_blind_signing_hintbox_check", "No mostrar esto de nuevo"},
{"enable_blind_signing_hintbox_context", "Los datos hash ocultan detalles de la transacción, lo cual puede ser peligroso. Por favor, revise cuidadosamente los detalles del hash antes de firmar."},
{"enable_blind_signing_hintbox_title", "通知"},
+ {"enable_passphrase", "Habilitar frase de contraseña"},
{"enter_passcode", "Ingresar código de acceso"},
{"enter_system", "Entrar al sistema"},
{"error_box_duplicated_seed_phrase", "Frase de Semilla Duplicada"},
@@ -2464,6 +2474,7 @@ const static lv_i18n_phrase_t es_singulars[] = {
{"passphrase_access_switch_desc", "Crear un atajo de contraseña para el arranque del dispositivo"},
{"passphrase_access_switch_title", "Acceso rápido mediante frase de contraseña"},
{"passphrase_add_password", "Ahora necesitamos que ingreses tu código de acceso para configurar la billetera con frase de contraseña"},
+ {"passphrase_enabled_title", "Frase de contraseña habilitada"},
{"passphrase_enter_input", "Ingresa la frase de contraseña"},
{"passphrase_enter_repeat", "Confirmar frase de contraseña"},
{"passphrase_error_not_match", "No coinciden las frases de contraseña"},
@@ -2473,6 +2484,7 @@ const static lv_i18n_phrase_t es_singulars[] = {
{"passphrase_learn_more_desc3", "Para recuperar tu billetera, se requieren tanto frase de contraseña como la frase semilla."},
{"passphrase_learn_more_desc4", "Olvidar la frase de contraseña puede resultar en la pérdida de acceso a tus activos digitales"},
{"passphrase_learn_more_title", "¿Qué es una frase de contraseña?"},
+ {"passphrase_warning_text", "Frase de contraseña habilitada. Se requiere tanto la frase semilla como la frase de contraseña. Olvida una, los activos se pierden."},
{"password_error_cannot_verify_fingerprint", "No se pudo verificar la huella dactilar"},
{"password_error_duplicated_pincode", "Código PIN duplicado detectado. Por favor, utiliza uno distinto."},
{"password_error_fingerprint_attempts_exceed", "Demasiados intentos. Por favor, introduce tu código de acceso para desbloquear el dispositivo."},
@@ -3195,9 +3207,11 @@ const static lv_i18n_phrase_t ja_singulars[] = {
{"dice_roll_hint_label", "最低50回"},
{"dice_roll_max_limit_label", "最大限度に到達しました."},
{"dice_rolls_entropy_hint", "ダイスがエントロピーとして転がる."},
+ {"disable_passphrase", "パスフレーズを無効にする"},
{"enable_blind_signing_hintbox_check", "これ以上表示しない"},
{"enable_blind_signing_hintbox_context", "ハッシュデータはトランザクションの詳細を隠しています。これは危険である可能性があります。署名する前にハッシュの詳細をよく確認してください。"},
{"enable_blind_signing_hintbox_title", "通知"},
+ {"enable_passphrase", "パスフレーズを有効にする"},
{"enter_passcode", "パスコード入力"},
{"enter_system", "システムに入る"},
{"error_box_duplicated_seed_phrase", "重複したシードフレーズ"},
@@ -3406,6 +3420,7 @@ const static lv_i18n_phrase_t ja_singulars[] = {
{"passphrase_access_switch_desc", "デバイスの起動時にパスフレーズショートカットを作成する"},
{"passphrase_access_switch_title", "フレーズ クイックアクセス"},
{"passphrase_add_password", "今、パスフレーズウォレットの設定のためにパスコードを入力していただく必要があります."},
+ {"passphrase_enabled_title", "パスフレーズが有効"},
{"passphrase_enter_input", "パスフレーズを入力してください."},
{"passphrase_enter_repeat", "「パスフレーズを確認してください.」"},
{"passphrase_error_not_match", "パスフレーズが一致しません."},
@@ -3415,6 +3430,7 @@ const static lv_i18n_phrase_t ja_singulars[] = {
{"passphrase_learn_more_desc3", "ウォレットを回復するには、パスフレーズとシードフレーズの両方が必要です."},
{"passphrase_learn_more_desc4", "パスフレーズを忘れると、デジタルアセットへのアクセス権の喪失に繋がる可能性があります."},
{"passphrase_learn_more_title", "パスフレーズとは何ですか?"},
+ {"passphrase_warning_text", "パスフレーズが有効です。シードフレーズとパスフレーズの両方が必要です。一つを忘れると、資産が失われます。"},
{"password_error_cannot_verify_fingerprint", "指紋を確認できませんでした."},
{"password_error_duplicated_pincode", "重複したPINコードが検出されました.別のコードを使用してください."},
{"password_error_fingerprint_attempts_exceed", "試行回数が多すぎます.デバイスをロック解除するためにパスコードを入力してください."},
@@ -4135,9 +4151,11 @@ const static lv_i18n_phrase_t ko_singulars[] = {
{"dice_roll_hint_label", "최소 50회"},
{"dice_roll_max_limit_label", "최대 제한에 도달했습니다"},
{"dice_rolls_entropy_hint", "주사위를 엔트로피로 사용"},
+ {"disable_passphrase", "패스프레이즈 비활성화"},
{"enable_blind_signing_hintbox_check", "다시 보지 않기"},
{"enable_blind_signing_hintbox_context", "해시 데이터는 거래 세부 정보를 숨깁니다. 서명하기 전에 해시 세부 정보를 다시 확인하세요."},
{"enable_blind_signing_hintbox_title", "알림"},
+ {"enable_passphrase", "패스프레이즈 활성화"},
{"enter_passcode", "비밀번호 입력"},
{"enter_system", "시스템 진입"},
{"error_box_duplicated_seed_phrase", "중복된 시드 구문"},
@@ -4346,6 +4364,7 @@ const static lv_i18n_phrase_t ko_singulars[] = {
{"passphrase_access_switch_desc", "장치 부팅을 위한 암호 바로 가기 만들기"},
{"passphrase_access_switch_title", "암호 빠른 액세스"},
{"passphrase_add_password", "장치 비밀번호를 입력하여 암호화폐 지갑을 설정하십시오."},
+ {"passphrase_enabled_title", "패스프레이즈 활성화됨"},
{"passphrase_enter_input", "입력 암호"},
{"passphrase_enter_repeat", "암호 확인"},
{"passphrase_error_not_match", "암호 불일치"},
@@ -4355,6 +4374,7 @@ const static lv_i18n_phrase_t ko_singulars[] = {
{"passphrase_learn_more_desc3", "지갑을 복구하려면 암호와 시드 문구가 모두 필요합니다."},
{"passphrase_learn_more_desc4", "암호를 잊어버리면 디지털 자산에 대한 액세스가 손실될 수 있습니다."},
{"passphrase_learn_more_title", "패스프레이즈란?"},
+ {"passphrase_warning_text", "패스프레이즈 활성화됨. 시드 구문과 패스프레이즈 모두 필요. 하나를 잊으면 자산이 손실됩니다."},
{"password_error_cannot_verify_fingerprint", "지문을 확인할 수 없습니다"},
{"password_error_duplicated_pincode", "중복된 PIN 코드가 감지되었습니다. 다른 PIN 코드를 사용하십시오."},
{"password_error_fingerprint_attempts_exceed", "시도 횟수가 너무 많습니다. 장치 잠금을 해제하려면 암호를 입력하십시오."},
@@ -5075,9 +5095,11 @@ const static lv_i18n_phrase_t ru_singulars[] = {
{"dice_roll_hint_label", "Не менее 50 бросков"},
{"dice_roll_max_limit_label", "Вы исчерпали лимит"},
{"dice_rolls_entropy_hint", "Кубики выпадают прозвольным образом"},
+ {"disable_passphrase", "Отключить пароль"},
{"enable_blind_signing_hintbox_check", "Не показывать это снова"},
{"enable_blind_signing_hintbox_context", "Хэш-данные скрывают детали транзакции, что может быть опасным. Пожалуйста, дважды проверьте детали хэша перед подписанием."},
{"enable_blind_signing_hintbox_title", "Уведомление"},
+ {"enable_passphrase", "Включить пароль"},
{"enter_passcode", "Введите код-пароль"},
{"enter_system", "Вход в систему"},
{"error_box_duplicated_seed_phrase", "Дубликат сид фразы"},
@@ -5286,6 +5308,7 @@ const static lv_i18n_phrase_t ru_singulars[] = {
{"passphrase_access_switch_desc", "Включить ввод кодовой фразы после включения устройства"},
{"passphrase_access_switch_title", "Быстрый доступ"},
{"passphrase_add_password", "Введите код-пароль для настройки кошелька с кодовой фразой."},
+ {"passphrase_enabled_title", "Пароль включен"},
{"passphrase_enter_input", "Введите фразу"},
{"passphrase_enter_repeat", "Подтвердите фразу"},
{"passphrase_error_not_match", "Фразы не совпадают"},
@@ -5295,6 +5318,7 @@ const static lv_i18n_phrase_t ru_singulars[] = {
{"passphrase_learn_more_desc3", "Для восстановления кошелька потребуется кодовая фраза и сид фраза."},
{"passphrase_learn_more_desc4", "Если вы забудете кодовую фразу, то потеряете доступ к своим цифровым активам."},
{"passphrase_learn_more_title", "Что такое Кодовая фраза?"},
+ {"passphrase_warning_text", "Пароль включен. Требуется как семенная фраза, так и ключевые слова. Забудь об одном, активы потеряны."},
{"password_error_cannot_verify_fingerprint", "Не удалось проверить отпечаток пальца"},
{"password_error_duplicated_pincode", "Этот PIN-код уже используется. Используйте другой."},
{"password_error_fingerprint_attempts_exceed", "Слишком много попыток. Введите код-пароль, чтобы разблокировать устройство."},
@@ -6023,9 +6047,11 @@ const static lv_i18n_phrase_t zh_cn_singulars[] = {
{"dice_roll_hint_label", "至少50次"},
{"dice_roll_max_limit_label", "您达到了最大限制"},
{"dice_rolls_entropy_hint", "骰子作为熵"},
+ {"disable_passphrase", "禁用密码短语"},
{"enable_blind_signing_hintbox_check", "不再显示"},
{"enable_blind_signing_hintbox_context", "哈希数据隐藏了交易细节,这可能是危险的。请在签名前仔细检查哈希细节。"},
{"enable_blind_signing_hintbox_title", "通知"},
+ {"enable_passphrase", "启用密码短语"},
{"enter_passcode", "输入密码"},
{"enter_system", "进入系统"},
{"error_box_duplicated_seed_phrase", "重复的助记词"},
@@ -6234,6 +6260,7 @@ const static lv_i18n_phrase_t zh_cn_singulars[] = {
{"passphrase_access_switch_desc", "开启后将会在设备重启后展示密语钱包快捷入口"},
{"passphrase_access_switch_title", "密语钱包快捷访问"},
{"passphrase_add_password", "现在,请输入设备密码来设置密语钱包."},
+ {"passphrase_enabled_title", "密码短语已启用"},
{"passphrase_enter_input", "输入密语"},
{"passphrase_enter_repeat", "确认密语"},
{"passphrase_error_not_match", "密语不匹配"},
@@ -6243,6 +6270,7 @@ const static lv_i18n_phrase_t zh_cn_singulars[] = {
{"passphrase_learn_more_desc3", "想要进入同一密语钱包,请确保您的助记词和密语都是正确的."},
{"passphrase_learn_more_desc4", "如果您将资产存储在密语钱包内,忘记密语会让您无法找回资产."},
{"passphrase_learn_more_title", "什么是密语钱包?"},
+ {"passphrase_warning_text", "密码短语已启用。需要种子短语和密码短语。忘记一个,资产丢失。"},
{"password_error_cannot_verify_fingerprint", "无法验证指纹"},
{"password_error_duplicated_pincode", "检测到重复的PIN码.请设置新PIN码."},
{"password_error_fingerprint_attempts_exceed", "尝试次数过多.请输入您的密码以解锁设备."},
Why this scored 33/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.