Skip to content

Commit 90d001a

Browse files
committed
importing of mnemonics
1 parent b149ebc commit 90d001a

File tree

4 files changed

+99
-20
lines changed

4 files changed

+99
-20
lines changed

flipbip.c

Lines changed: 46 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
#include "flipbip.h"
22
#include "crypto/memzero.h"
3+
#include "crypto/bip39.h"
4+
#include "helpers/flipbip_file.h"
5+
#include "helpers/flipbip_haptic.h"
36

47
bool flipbip_custom_event_callback(void* context, uint32_t event) {
58
furi_assert(context);
@@ -23,21 +26,54 @@ bool flipbip_navigation_event_callback(void* context) {
2326
static void text_input_callback(void* context) {
2427
furi_assert(context);
2528
FlipBip* app = context;
29+
bool handled = false;
2630

2731
// check that there is text in the input
2832
if(strlen(app->input_text) > 0) {
2933
if(app->input_state == FlipBipTextInputPassphrase) {
3034
if(app->passphrase == FlipBipPassphraseOn) {
3135
strcpy(app->passphrase_text, app->input_text);
3236
}
37+
// clear input text
38+
memzero(app->input_text, TEXT_BUFFER_SIZE);
39+
// reset input state
40+
app->input_state = FlipBipTextInputDefault;
41+
handled = true;
3342
view_dispatcher_switch_to_view(app->view_dispatcher, FlipBipViewIdSettings);
43+
} else if(app->input_state == FlipBipTextInputMnemonic) {
44+
if(app->import_from_mnemonic == 1) {
45+
strcpy(app->import_mnemonic_text, app->input_text);
46+
47+
int status = FlipBipStatusSuccess;
48+
// Check if the mnemonic is valid
49+
if(mnemonic_check(app->import_mnemonic_text) == 0) status = FlipBipStatusMnemonicCheckError; // 13 = mnemonic check error
50+
// Save the mnemonic to persistent storage
51+
else if(!flipbip_save_settings_secure(app->import_mnemonic_text)) status = FlipBipStatusSaveError; // 12 = save error
52+
53+
if (status == FlipBipStatusSuccess) {
54+
flipbip_play_happy_bump(app);
55+
} else {
56+
flipbip_play_long_bump(app);
57+
}
58+
59+
memzero(app->import_mnemonic_text, TEXT_BUFFER_SIZE);
60+
}
61+
// clear input text
62+
memzero(app->input_text, TEXT_BUFFER_SIZE);
63+
// reset input state
64+
app->input_state = FlipBipTextInputDefault;
65+
handled = true;
66+
view_dispatcher_switch_to_view(app->view_dispatcher, FlipBipViewIdMenu);
3467
}
3568
}
3669

37-
// clear input text
38-
memzero(app->input_text, TEXT_BUFFER_SIZE);
39-
// reset input state
40-
app->input_state = FlipBipTextInputDefault;
70+
if(!handled) {
71+
// clear input text
72+
memzero(app->input_text, TEXT_BUFFER_SIZE);
73+
// reset input state
74+
app->input_state = FlipBipTextInputDefault;
75+
view_dispatcher_switch_to_view(app->view_dispatcher, FlipBipViewIdMenu);
76+
}
4177
}
4278

4379
FlipBip* flipbip_app_alloc() {
@@ -64,10 +100,15 @@ FlipBip* flipbip_app_alloc() {
64100
// Settings
65101
app->haptic = FlipBipHapticOn;
66102
app->led = FlipBipLedOn;
67-
app->passphrase = FlipBipPassphraseOff;
68103
app->bip39_strength = FlipBipStrength256; // 256 bits (24 words)
104+
app->passphrase = FlipBipPassphraseOff;
105+
106+
// Main menu
69107
app->bip44_coin = FlipBipCoinBTC0; // 0 (BTC)
70108
app->overwrite_saved_seed = 0;
109+
app->import_from_mnemonic = 0;
110+
111+
// Text input
71112
app->input_state = FlipBipTextInputDefault;
72113

73114
view_dispatcher_add_view(

flipbip.h

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,14 +33,19 @@ typedef struct {
3333
TextInput* text_input;
3434
FlipBipStartscreen* flipbip_startscreen;
3535
FlipBipScene1* flipbip_scene_1;
36+
// Settings options
3637
int haptic;
3738
int led;
38-
int passphrase;
3939
int bip39_strength;
40+
int passphrase;
41+
// Main menu options
4042
int bip44_coin;
4143
int overwrite_saved_seed;
44+
int import_from_mnemonic;
45+
// Text input
4246
int input_state;
4347
char passphrase_text[TEXT_BUFFER_SIZE];
48+
char import_mnemonic_text[TEXT_BUFFER_SIZE];
4449
char input_text[TEXT_BUFFER_SIZE];
4550
} FlipBip;
4651

@@ -83,4 +88,12 @@ typedef enum {
8388
FlipBipTextInputDefault,
8489
FlipBipTextInputPassphrase,
8590
FlipBipTextInputMnemonic
86-
} FlipBipTextInputState;
91+
} FlipBipTextInputState;
92+
93+
typedef enum {
94+
FlipBipStatusSuccess = 0,
95+
FlipBipStatusReturn = 10,
96+
FlipBipStatusLoadError = 11,
97+
FlipBipStatusSaveError = 12,
98+
FlipBipStatusMnemonicCheckError = 13,
99+
} FlipBipStatus;

scenes/flipbip_scene_menu.c

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ enum SubmenuIndex {
66
SubmenuIndexScene1ETH,
77
SubmenuIndexScene1DOGE,
88
SubmenuIndexScene1New,
9+
SubmenuIndexScene1Import,
910
SubmenuIndexSettings,
1011
};
1112

@@ -50,6 +51,12 @@ void flipbip_scene_menu_on_enter(void* context) {
5051
flipbip_scene_menu_submenu_callback,
5152
app);
5253
}
54+
submenu_add_item(
55+
app->submenu,
56+
"Import from mnemonic",
57+
SubmenuIndexScene1Import,
58+
flipbip_scene_menu_submenu_callback,
59+
app);
5360

5461
submenu_add_item(
5562
app->submenu, "Settings", SubmenuIndexSettings, flipbip_scene_menu_submenu_callback, app);
@@ -71,31 +78,40 @@ bool flipbip_scene_menu_on_event(void* context, SceneManagerEvent event) {
7178
} else if(event.type == SceneManagerEventTypeCustom) {
7279
if(event.event == SubmenuIndexScene1BTC) {
7380
app->overwrite_saved_seed = 0;
81+
app->import_from_mnemonic = 0;
7482
app->bip44_coin = FlipBipCoinBTC0;
7583
scene_manager_set_scene_state(
7684
app->scene_manager, FlipBipSceneMenu, SubmenuIndexScene1BTC);
7785
scene_manager_next_scene(app->scene_manager, FlipBipSceneScene_1);
7886
return true;
7987
} else if(event.event == SubmenuIndexScene1ETH) {
8088
app->overwrite_saved_seed = 0;
89+
app->import_from_mnemonic = 0;
8190
app->bip44_coin = FlipBipCoinETH60;
8291
scene_manager_set_scene_state(
8392
app->scene_manager, FlipBipSceneMenu, SubmenuIndexScene1ETH);
8493
scene_manager_next_scene(app->scene_manager, FlipBipSceneScene_1);
8594
return true;
8695
} else if(event.event == SubmenuIndexScene1DOGE) {
8796
app->overwrite_saved_seed = 0;
97+
app->import_from_mnemonic = 0;
8898
app->bip44_coin = FlipBipCoinDOGE3;
8999
scene_manager_set_scene_state(
90100
app->scene_manager, FlipBipSceneMenu, SubmenuIndexScene1DOGE);
91101
scene_manager_next_scene(app->scene_manager, FlipBipSceneScene_1);
92102
return true;
93103
} else if(event.event == SubmenuIndexScene1New) {
94104
app->overwrite_saved_seed = 1;
105+
app->import_from_mnemonic = 0;
95106
scene_manager_set_scene_state(
96107
app->scene_manager, FlipBipSceneMenu, SubmenuIndexScene1New);
97108
scene_manager_next_scene(app->scene_manager, FlipBipSceneScene_1);
98109
return true;
110+
} else if(event.event == SubmenuIndexScene1Import) {
111+
app->import_from_mnemonic = 1;
112+
app->input_state = FlipBipTextInputMnemonic;
113+
view_dispatcher_switch_to_view(app->view_dispatcher, FlipBipViewIdTextInput);
114+
return true;
99115
} else if(event.event == SubmenuIndexSettings) {
100116
scene_manager_set_scene_state(
101117
app->scene_manager, FlipBipSceneMenu, SubmenuIndexSettings);

views/flipbip_scene_1.c

Lines changed: 22 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -314,22 +314,24 @@ static int flipbip_scene_1_model_init(
314314
if(overwrite || (!flipbip_has_settings(true) && !flipbip_has_settings(false))) {
315315
// Generate a random mnemonic using trezor-crypto
316316
const char* mnemonic_gen = mnemonic_generate(strength);
317+
// Check if the mnemonic is valid
318+
if(mnemonic_check(mnemonic_gen) == 0) return FlipBipStatusMnemonicCheckError; // 13 = mnemonic check error
317319
// Save the mnemonic to persistent storage
318-
if(!flipbip_save_settings_secure(mnemonic_gen)) return 1; // 1 = save error
320+
else if(!flipbip_save_settings_secure(mnemonic_gen)) return FlipBipStatusSaveError; // 12 = save error
319321
// Clear the generated mnemonic from memory
320322
mnemonic_clear();
321323
model->mnemonic_only = true;
322324
}
323325

324326
// Load the mnemonic from persistent storage
325-
if(!flipbip_load_settings_secure(mnemonic)) return 2; // 2 = load error
327+
if(!flipbip_load_settings_secure(mnemonic)) return FlipBipStatusLoadError; // 11 = load error
326328
model->mnemonic = mnemonic;
327329
// Check if the mnemonic is valid
328-
if(mnemonic_check(model->mnemonic) == 0) return 3; // 3 = mnemonic check error
330+
if(mnemonic_check(model->mnemonic) == 0) return FlipBipStatusMnemonicCheckError; // 13 = mnemonic check error
329331

330332
// if we are only generating the mnemonic, return
331333
if(model->mnemonic_only) {
332-
return -1; // -1 = mnemonic only, return from parent
334+
return FlipBipStatusReturn; // 10 = mnemonic only, return from parent
333335
}
334336

335337
// test mnemonic
@@ -408,7 +410,7 @@ static int flipbip_scene_1_model_init(
408410
#endif
409411

410412
// 0 = success
411-
return 0;
413+
return FlipBipStatusSuccess;
412414
}
413415

414416
bool flipbip_scene_1_input(InputEvent* event, void* context) {
@@ -524,7 +526,7 @@ void flipbip_scene_1_enter(void* context) {
524526
}
525527

526528
// BIP44 Coin setting
527-
uint32_t coin = app->bip44_coin;
529+
const uint32_t coin = app->bip44_coin;
528530
// coin_name, derivation_path
529531
s_derivation_text = COIN_TEXT_ARRAY[coin][1];
530532

@@ -543,31 +545,38 @@ void flipbip_scene_1_enter(void* context) {
543545
{
544546
// s_busy = true;
545547

546-
const int status =
547-
flipbip_scene_1_model_init(model, strength, coin, overwrite, passphrase_text);
548+
const int status = flipbip_scene_1_model_init(
549+
model,
550+
strength,
551+
coin,
552+
overwrite,
553+
passphrase_text);
548554

549555
// nonzero status, free the mnemonic
550-
if(status != 0) {
556+
if(status != FlipBipStatusSuccess) {
551557
memzero((void*)model->mnemonic, strlen(model->mnemonic));
552558
free((void*)model->mnemonic);
553559
}
554560

555561
// if error, set the error message
556-
if(status == 1) {
562+
if(status == FlipBipStatusSaveError) {
557563
model->mnemonic = "ERROR:,Save error";
558564
model->page = 2;
559-
} else if(status == 2) {
565+
flipbip_play_long_bump(app);
566+
} else if(status == FlipBipStatusLoadError) {
560567
model->mnemonic = "ERROR:,Load error";
561568
model->page = 2;
562-
} else if(status == 3) {
569+
flipbip_play_long_bump(app);
570+
} else if(status == FlipBipStatusMnemonicCheckError) {
563571
model->mnemonic = "ERROR:,Mnemonic check failed";
564572
model->page = 2;
573+
flipbip_play_long_bump(app);
565574
}
566575

567576
// s_busy = false;
568577

569578
// if overwrite is set and mnemonic generated, return from scene immediately
570-
if(status == -1) {
579+
if(status == FlipBipStatusReturn) {
571580
instance->callback(FlipBipCustomEventScene1Back, instance->context);
572581
}
573582
},

0 commit comments

Comments
 (0)