Backup+restore internal U2F keys on factory reset

This commit is contained in:
Willy-JL
2023-04-25 17:18:14 +01:00
parent e2c3e8e53d
commit 10a7c8f84a

View File

@@ -193,6 +193,24 @@ static void storage_int_lfs_mount(LFSData* lfs_data, StorageData* storage) {
was_fingerprint_outdated; was_fingerprint_outdated;
if(need_format) { if(need_format) {
err = lfs_mount(lfs, &lfs_data->config);
if(err == 0) {
FURI_LOG_I(TAG, "Factory reset: Mounted for backup");
// Backup U2F keys
lfs_file_t file;
lfs_file_open(lfs, &file, ".cnt.u2f", LFS_O_RDWR | LFS_O_CREAT);
uint8_t cnt[file.ctz.size];
lfs_file_read(lfs, &file, cnt, sizeof(cnt));
lfs_file_close(lfs, &file);
lfs_file_open(lfs, &file, ".key.u2f", LFS_O_RDWR | LFS_O_CREAT);
uint8_t key[file.ctz.size];
lfs_file_read(lfs, &file, key, sizeof(key));
lfs_file_close(lfs, &file);
err = lfs_unmount(lfs);
if(err == 0) {
FURI_LOG_E(TAG, "Factory reset: Unmounted after backup");
// Format storage // Format storage
err = lfs_format(lfs, &lfs_data->config); err = lfs_format(lfs, &lfs_data->config);
if(err == 0) { if(err == 0) {
@@ -201,6 +219,15 @@ static void storage_int_lfs_mount(LFSData* lfs_data, StorageData* storage) {
err = lfs_mount(lfs, &lfs_data->config); err = lfs_mount(lfs, &lfs_data->config);
if(err == 0) { if(err == 0) {
FURI_LOG_I(TAG, "Factory reset: Mounted"); FURI_LOG_I(TAG, "Factory reset: Mounted");
// Restore U2F keys
lfs_file_open(lfs, &file, ".cnt.u2f", LFS_O_RDWR | LFS_O_CREAT);
lfs_file_write(lfs, &file, cnt, sizeof(cnt));
lfs_file_close(lfs, &file);
lfs_file_open(lfs, &file, ".key.u2f", LFS_O_RDWR | LFS_O_CREAT);
lfs_file_write(lfs, &file, key, sizeof(key));
lfs_file_close(lfs, &file);
storage->status = StorageStatusOK; storage->status = StorageStatusOK;
} else { } else {
FURI_LOG_E(TAG, "Factory reset: Mount after format failed"); FURI_LOG_E(TAG, "Factory reset: Mount after format failed");
@@ -210,6 +237,14 @@ static void storage_int_lfs_mount(LFSData* lfs_data, StorageData* storage) {
FURI_LOG_E(TAG, "Factory reset: Format failed"); FURI_LOG_E(TAG, "Factory reset: Format failed");
storage->status = StorageStatusNoFS; storage->status = StorageStatusNoFS;
} }
} else {
FURI_LOG_E(TAG, "Factory reset: Unmount after backup failed");
storage->status = StorageStatusNotMounted;
}
} else {
FURI_LOG_E(TAG, "Factory reset: Mount for backup failed");
storage->status = StorageStatusNotMounted;
}
} else { } else {
// Normal // Normal
err = lfs_mount(lfs, &lfs_data->config); err = lfs_mount(lfs, &lfs_data->config);