Skip to content

Commit 410fe78

Browse files
committed
securing storage
1 parent ce8afc6 commit 410fe78

File tree

3 files changed

+94
-56
lines changed

3 files changed

+94
-56
lines changed

helpers/flipbip_file.c

Lines changed: 88 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,16 @@
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

1423
bool 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

5461
bool 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

7697
bool 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

108136
bool 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

helpers/flipbip_string.c

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -117,18 +117,20 @@ flipbip_xtob(const char *str, unsigned char *out, int out_len)
117117
}
118118

119119
void
120-
flipbip_cipher(const unsigned char* key_in, const char* in, char* out)
120+
flipbip_cipher(const unsigned char* key_in, const char* in, char* out, const unsigned int io_len)
121121
{
122+
if (io_len > 512) return;
123+
122124
RC4_CTX ctx;
123125
uint8_t buf[256];
124126

125127
memzero(buf, 256);
126-
flipbip_xtob(in, buf, 256);
128+
flipbip_xtob(in, buf, io_len / 2);
127129

128130
rc4_init(&ctx, key_in, 64);
129131
rc4_encrypt(&ctx, buf, 256);
130132

131-
for (size_t i = 0; i < 256; i++) {
133+
for (size_t i = 0; i < (io_len / 2); i++) {
132134
flipbip_btox(buf[i], out + i * 2);
133135
}
134136

helpers/flipbip_string.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,4 @@ char * flipbip_strtok_r(char *s, const char *delim, char **last);
44
void flipbip_btox(const unsigned char i, char *str);
55
void flipbip_xtob(const char *str, unsigned char *out, int out_len);
66

7-
void flipbip_cipher(const unsigned char* key_in, const char* in, char* out);
7+
void flipbip_cipher(const unsigned char* key_in, const char* in, char* out, const unsigned int io_len);

0 commit comments

Comments
 (0)