From 10a7c8f84aae6255d79980aee8aa88b17b3fbf86 Mon Sep 17 00:00:00 2001 From: Willy-JL <49810075+Willy-JL@users.noreply.github.com> Date: Tue, 25 Apr 2023 17:18:14 +0100 Subject: [PATCH] Backup+restore internal U2F keys on factory reset --- .../services/storage/storages/storage_int.c | 55 +++++++++++++++---- 1 file changed, 45 insertions(+), 10 deletions(-) diff --git a/applications/services/storage/storages/storage_int.c b/applications/services/storage/storages/storage_int.c index 2534d47a1..adf016f4e 100644 --- a/applications/services/storage/storages/storage_int.c +++ b/applications/services/storage/storages/storage_int.c @@ -193,22 +193,57 @@ static void storage_int_lfs_mount(LFSData* lfs_data, StorageData* storage) { was_fingerprint_outdated; if(need_format) { - // Format storage - err = lfs_format(lfs, &lfs_data->config); + err = lfs_mount(lfs, &lfs_data->config); if(err == 0) { - FURI_LOG_I(TAG, "Factory reset: Format successful, trying to mount"); - furi_hal_rtc_reset_flag(FuriHalRtcFlagFactoryReset); - err = lfs_mount(lfs, &lfs_data->config); + 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_I(TAG, "Factory reset: Mounted"); - storage->status = StorageStatusOK; + FURI_LOG_E(TAG, "Factory reset: Unmounted after backup"); + // Format storage + err = lfs_format(lfs, &lfs_data->config); + if(err == 0) { + FURI_LOG_I(TAG, "Factory reset: Format successful, trying to mount"); + furi_hal_rtc_reset_flag(FuriHalRtcFlagFactoryReset); + err = lfs_mount(lfs, &lfs_data->config); + if(err == 0) { + 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; + } else { + FURI_LOG_E(TAG, "Factory reset: Mount after format failed"); + storage->status = StorageStatusNotMounted; + } + } else { + FURI_LOG_E(TAG, "Factory reset: Format failed"); + storage->status = StorageStatusNoFS; + } } else { - FURI_LOG_E(TAG, "Factory reset: Mount after format failed"); + FURI_LOG_E(TAG, "Factory reset: Unmount after backup failed"); storage->status = StorageStatusNotMounted; } } else { - FURI_LOG_E(TAG, "Factory reset: Format failed"); - storage->status = StorageStatusNoFS; + FURI_LOG_E(TAG, "Factory reset: Mount for backup failed"); + storage->status = StorageStatusNotMounted; } } else { // Normal