147 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			147 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
#include "bt_keys_storage.h"
 | 
						|
 | 
						|
#include <furi.h>
 | 
						|
#include <furi_hal_bt.h>
 | 
						|
#include <lib/toolbox/saved_struct.h>
 | 
						|
#include <storage/storage.h>
 | 
						|
 | 
						|
#define BT_KEYS_STORAGE_VERSION (0)
 | 
						|
#define BT_KEYS_STORAGE_MAGIC (0x18)
 | 
						|
 | 
						|
#define TAG "BtKeyStorage"
 | 
						|
 | 
						|
struct BtKeysStorage {
 | 
						|
    uint8_t* nvm_sram_buff;
 | 
						|
    uint16_t nvm_sram_buff_size;
 | 
						|
    FuriString* file_path;
 | 
						|
};
 | 
						|
 | 
						|
bool bt_keys_storage_delete(BtKeysStorage* instance) {
 | 
						|
    furi_assert(instance);
 | 
						|
 | 
						|
    bool delete_succeed = false;
 | 
						|
    bool bt_is_active = furi_hal_bt_is_active();
 | 
						|
 | 
						|
    furi_hal_bt_stop_advertising();
 | 
						|
    delete_succeed = furi_hal_bt_clear_white_list();
 | 
						|
    if(bt_is_active) {
 | 
						|
        furi_hal_bt_start_advertising();
 | 
						|
    }
 | 
						|
 | 
						|
    return delete_succeed;
 | 
						|
}
 | 
						|
 | 
						|
BtKeysStorage* bt_keys_storage_alloc(const char* keys_storage_path) {
 | 
						|
    furi_assert(keys_storage_path);
 | 
						|
 | 
						|
    BtKeysStorage* instance = malloc(sizeof(BtKeysStorage));
 | 
						|
    // Set default nvm ram parameters
 | 
						|
    furi_hal_bt_get_key_storage_buff(&instance->nvm_sram_buff, &instance->nvm_sram_buff_size);
 | 
						|
    // Set key storage file
 | 
						|
    instance->file_path = furi_string_alloc();
 | 
						|
    furi_string_set_str(instance->file_path, keys_storage_path);
 | 
						|
 | 
						|
    return instance;
 | 
						|
}
 | 
						|
 | 
						|
void bt_keys_storage_free(BtKeysStorage* instance) {
 | 
						|
    furi_assert(instance);
 | 
						|
 | 
						|
    furi_string_free(instance->file_path);
 | 
						|
    free(instance);
 | 
						|
}
 | 
						|
 | 
						|
void bt_keys_storage_set_file_path(BtKeysStorage* instance, const char* path) {
 | 
						|
    furi_assert(instance);
 | 
						|
    furi_assert(path);
 | 
						|
 | 
						|
    furi_string_set_str(instance->file_path, path);
 | 
						|
}
 | 
						|
 | 
						|
void bt_keys_storage_set_ram_params(BtKeysStorage* instance, uint8_t* buff, uint16_t size) {
 | 
						|
    furi_assert(instance);
 | 
						|
    furi_assert(buff);
 | 
						|
 | 
						|
    instance->nvm_sram_buff = buff;
 | 
						|
    instance->nvm_sram_buff_size = size;
 | 
						|
}
 | 
						|
 | 
						|
bool bt_keys_storage_load(BtKeysStorage* instance) {
 | 
						|
    furi_assert(instance);
 | 
						|
 | 
						|
    bool loaded = false;
 | 
						|
    do {
 | 
						|
        // Get payload size
 | 
						|
        size_t payload_size = 0;
 | 
						|
        if(!saved_struct_get_payload_size(
 | 
						|
               furi_string_get_cstr(instance->file_path),
 | 
						|
               BT_KEYS_STORAGE_MAGIC,
 | 
						|
               BT_KEYS_STORAGE_VERSION,
 | 
						|
               &payload_size)) {
 | 
						|
            FURI_LOG_E(TAG, "Failed to read payload size");
 | 
						|
            break;
 | 
						|
        }
 | 
						|
 | 
						|
        if(payload_size > instance->nvm_sram_buff_size) {
 | 
						|
            FURI_LOG_E(TAG, "Saved data doesn't fit ram buffer");
 | 
						|
            break;
 | 
						|
        }
 | 
						|
 | 
						|
        // Load saved data to ram
 | 
						|
        furi_hal_bt_nvm_sram_sem_acquire();
 | 
						|
        bool data_loaded = saved_struct_load(
 | 
						|
            furi_string_get_cstr(instance->file_path),
 | 
						|
            instance->nvm_sram_buff,
 | 
						|
            payload_size,
 | 
						|
            BT_KEYS_STORAGE_MAGIC,
 | 
						|
            BT_KEYS_STORAGE_VERSION);
 | 
						|
        furi_hal_bt_nvm_sram_sem_release();
 | 
						|
        if(!data_loaded) {
 | 
						|
            FURI_LOG_E(TAG, "Failed to load struct");
 | 
						|
            break;
 | 
						|
        }
 | 
						|
 | 
						|
        loaded = true;
 | 
						|
    } while(false);
 | 
						|
 | 
						|
    return loaded;
 | 
						|
}
 | 
						|
 | 
						|
bool bt_keys_storage_update(BtKeysStorage* instance, uint8_t* start_addr, uint32_t size) {
 | 
						|
    furi_assert(instance);
 | 
						|
    furi_assert(start_addr);
 | 
						|
 | 
						|
    bool updated = false;
 | 
						|
 | 
						|
    FURI_LOG_I(
 | 
						|
        TAG,
 | 
						|
        "Base address: %p. Start update address: %p. Size changed: %lu",
 | 
						|
        (void*)instance->nvm_sram_buff,
 | 
						|
        start_addr,
 | 
						|
        size);
 | 
						|
 | 
						|
    do {
 | 
						|
        size_t new_size = start_addr - instance->nvm_sram_buff + size;
 | 
						|
        if(new_size > instance->nvm_sram_buff_size) {
 | 
						|
            FURI_LOG_E(TAG, "NVM RAM buffer overflow");
 | 
						|
            break;
 | 
						|
        }
 | 
						|
 | 
						|
        furi_hal_bt_nvm_sram_sem_acquire();
 | 
						|
        bool data_updated = saved_struct_save(
 | 
						|
            furi_string_get_cstr(instance->file_path),
 | 
						|
            instance->nvm_sram_buff,
 | 
						|
            new_size,
 | 
						|
            BT_KEYS_STORAGE_MAGIC,
 | 
						|
            BT_KEYS_STORAGE_VERSION);
 | 
						|
        furi_hal_bt_nvm_sram_sem_release();
 | 
						|
        if(!data_updated) {
 | 
						|
            FURI_LOG_E(TAG, "Failed to update key storage");
 | 
						|
            break;
 | 
						|
        }
 | 
						|
        updated = true;
 | 
						|
    } while(false);
 | 
						|
 | 
						|
    return updated;
 | 
						|
}
 |