99#define FLIPBIP_APP_BASE_FOLDER EXT_PATH("apps_data/flipbip")
1010// #define FLIPBIP_SETTINGS_FILE_NAME ".flipbip.dat"
1111#define FLIPBIP_SETTINGS_FILE_NAME ".flipbip.txt"
12+ #define FLIPBIP_SETTINGS_FILE_NAME_BAK ".flipbip.bak"
1213#define FLIPBIP_SETTINGS_PATH FLIPBIP_APP_BASE_FOLDER "/" FLIPBIP_SETTINGS_FILE_NAME
14+ #define FLIPBIP_SETTINGS_PATH_BAK FLIPBIP_APP_BASE_FOLDER "/" FLIPBIP_SETTINGS_FILE_NAME_BAK
15+
16+ const size_t FILE_HLEN = 4 ;
17+ const size_t FILE_KLEN = 128 ;
18+ const size_t FILE_SLEN = 512 ;
19+ const char * FILE_HSTR = "fb01" ;
20+ const char * FILE_K1 = "fb0131d5cf688221c109163908ebe51debb46227c6cc8b37641910833222772a"
21+ "baefe6d9ceb651842260e0d1e05e3b90d15e7d5ffaaabc0207bf200a117793a2" ;
1322
1423bool flipbip_load_settings (char * settings ) {
1524 Storage * fs_api = furi_record_open (RECORD_STORAGE );
@@ -23,42 +32,42 @@ bool flipbip_load_settings(char* settings) {
2332 i ++ ;
2433 }
2534 } else {
26- strcpy (settings , "uhoh" );
27- //memzero(settings, strlen(settings));
28- //settings[0] = '\0';
35+ memzero (settings , strlen (settings ));
2936 }
3037 storage_file_close (settings_file );
3138 storage_file_free (settings_file );
3239 furi_record_close (RECORD_STORAGE );
3340
34- // if(!strlen(settings) == 0) {
35- // Storage* fs_api = furi_record_open(RECORD_STORAGE);
36- // FileInfo layout_file_info;
37- // FS_Error file_check_err = storage_common_stat(
38- // fs_api, FLIPBIP_SETTINGS_PATH, &layout_file_info);
39- // furi_record_close(RECORD_STORAGE);
40- // if(file_check_err != FSE_OK) {
41- // memzero(settings, strlen(settings));
42- // settings[0] = '\0';
43- // return;
44- // }
45- // if(layout_file_info.size != 256) {
46- // memzero(settings, strlen(settings));
47- // settings[0] = '\0';
48- // }
49- // }
41+ if (!strlen (settings ) == 0 ) {
42+ Storage * fs_api = furi_record_open (RECORD_STORAGE );
43+ FileInfo layout_file_info ;
44+ FS_Error file_check_err = storage_common_stat (
45+ fs_api , FLIPBIP_SETTINGS_PATH , & layout_file_info );
46+ furi_record_close (RECORD_STORAGE );
47+ if (file_check_err != FSE_OK ) {
48+ memzero (settings , strlen (settings ));
49+ settings [0 ] = '\0' ;
50+ return false ;
51+ }
52+ // if(layout_file_info.size != 256) {
53+ // memzero(settings, strlen(settings));
54+ // settings[0] = '\0';
55+ // }
56+ }
5057
5158 return true;
5259}
5360
5461bool flipbip_save_settings (const char * settings , bool append ) {
5562 Storage * fs_api = furi_record_open (RECORD_STORAGE );
56- File * settings_file = storage_file_alloc ( fs_api );
63+
5764 storage_common_mkdir (fs_api , FLIPBIP_APP_BASE_FOLDER );
5865 int open_mode = FSOM_OPEN_ALWAYS ;
5966 if (append ) {
6067 open_mode = FSOM_OPEN_APPEND ;
6168 }
69+
70+ File * settings_file = storage_file_alloc (fs_api );
6271 if (storage_file_open (settings_file , FLIPBIP_SETTINGS_PATH , FSAM_WRITE , open_mode )) {
6372 storage_file_write (
6473 settings_file ,
@@ -68,75 +77,102 @@ bool flipbip_save_settings(const char* settings, bool append) {
6877 }
6978 storage_file_close (settings_file );
7079 storage_file_free (settings_file );
80+
81+ File * settings_file_bak = storage_file_alloc (fs_api );
82+ if (storage_file_open (settings_file_bak , FLIPBIP_SETTINGS_PATH_BAK , FSAM_WRITE , open_mode )) {
83+ storage_file_write (
84+ settings_file_bak ,
85+ settings ,
86+ strlen (settings ));
87+ storage_file_write (settings_file_bak , "\n" , 1 );
88+ }
89+ storage_file_close (settings_file_bak );
90+ storage_file_free (settings_file_bak );
91+
7192 furi_record_close (RECORD_STORAGE );
7293
7394 return true;
7495}
7596
7697bool flipbip_load_settings_secure (char * settings ) {
77- const size_t hlen = 4 ;
78- const size_t klen = 128 ;
79- const size_t slen = 512 ;
80- const size_t dlen = hlen + klen + slen ;
98+ const size_t dlen = FILE_HLEN + FILE_KLEN + FILE_SLEN + 1 ;
8199
82- char * data = malloc (dlen + 1 );
83- memzero (data , dlen + 1 );
100+ // allocate memory for data
101+ char * data = malloc (dlen );
102+ memzero (data , dlen );
84103
104+ // load data from file
85105 if (!flipbip_load_settings (data )) return false;
86106
87- // if (strncmp(data, "fb01", hlen) != 0) {
88- // memzero(data, dlen);
89- // free(data);
90- // return true;
91- // }
92- data += hlen ;
93-
94- uint8_t key [64 ];
95- flipbip_xtob (data , key , 64 );
96- data += klen ;
97-
98- flipbip_cipher (key , data , data );
107+ // check header
108+ if (data [0 ] != FILE_HSTR [0 ] || data [1 ] != FILE_HSTR [1 ] || data [2 ] != FILE_HSTR [2 ] || data [3 ] != FILE_HSTR [3 ]) {
109+ memzero (data , dlen );
110+ free (data );
111+ return false;
112+ }
113+ data += FILE_HLEN ;
114+
115+ // load k2 from file using k1
116+ //uint8_t k1[64];
117+ //flipbip_xtob(FILE_K1, k1, 64);
118+ uint8_t k2 [64 ];
119+ //flipbip_cipher(k1, data, data, FILE_KLEN);
120+ flipbip_xtob (data , k2 , 64 );
121+ data += FILE_KLEN ;
122+
123+ // load settings from file using k2
124+ flipbip_cipher (k2 , data , data , FILE_SLEN );
99125 flipbip_xtob (data , (unsigned char * )settings , 256 );
100126
101- data = data - klen - hlen ;
127+ data = data - FILE_KLEN - FILE_HLEN ;
128+
129+ // clear memory
102130 memzero (data , dlen );
103131 free (data );
104132
105133 return true;
106134}
107135
108136bool flipbip_save_settings_secure (const char * settings ) {
109- const size_t hlen = 4 ;
110- const size_t klen = 128 ;
111- const size_t slen = 512 ;
112- const size_t dlen = hlen + klen + slen ;
137+ const size_t dlen = FILE_HLEN + FILE_KLEN + FILE_SLEN + 1 ;
113138
139+ // cap settings to 256 bytes
114140 size_t len = strlen (settings );
115141 if (len > 256 ) len = 256 ;
116142
143+ // allocate memory for data
117144 char * data = malloc (dlen + 1 );
118145 memzero (data , dlen + 1 );
119146
120- memcpy (data , "fb01" , hlen );
121- data += hlen - 1 ;
147+ // write header
148+ strncpy (data , FILE_HSTR , FILE_HLEN );
149+ data += FILE_HLEN ;
150+
151+ // generate key
152+ //uint8_t k1[64];
153+ //flipbip_xtob(FILE_K1, k1, 64);
154+ uint8_t k2 [64 ];
155+ random_buffer (k2 , 64 );
122156
123- uint8_t key [64 ];
124- random_buffer (key , 64 );
157+ // write k2 to file (secured by k1)
125158 for (size_t i = 0 ; i < 64 ; i ++ ) {
126- flipbip_btox (key [i ], data + (i * 2 ));
159+ flipbip_btox (k2 [i ], data + (i * 2 ));
127160 }
128- data += klen ;
161+ //flipbip_cipher(k1, data, data, FILE_KLEN);
162+ data += FILE_KLEN ;
129163
164+ // write settings to file (secured by k2)
130165 for (size_t i = 0 ; i < len ; i ++ ) {
131166 flipbip_btox (settings [i ], data + (i * 2 ));
132167 }
133- flipbip_cipher (key , data , data );
168+ flipbip_cipher (k2 , data , data , FILE_SLEN );
134169
135- data = data - klen - hlen ;
136- data [dlen ] = '\0' ;
170+ data = data - FILE_KLEN - FILE_HLEN ;
137171
172+ // save data
138173 flipbip_save_settings (data , false);
139174
175+ // clear memory
140176 memzero (data , dlen );
141177 free (data );
142178
0 commit comments