blob: fdec12f9aaa161bf16303d22216bfab2084addab [file] [log] [blame]
/*
* Copyright (c) 2019,2020 Linaro Limited
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <string.h>
#include <zephyr/logging/log.h>
#include "psa/error.h"
#include "psa/protected_storage.h"
#include "util_app_cfg.h"
#include "util_app_log.h"
/** The 64-bit UID associated with the config record in secure storage. */
static psa_storage_uid_t cfg_data_uid = 0x0000000055CFDA7A;
LOG_MODULE_DECLARE(app, CONFIG_LOG_DEFAULT_LEVEL);
/**
* @brief Default config settings. These settings will be used when a new
* config record is created, or when the config record is reset.
*/
static struct cfg_data cfg_data_dflt = {
.magic = 0x55CFDA7A,
.version = 1,
.scratch = { 0 }
};
psa_status_t cfg_create_data(void)
{
psa_status_t status;
LOG_INF("app_cfg: Creating new config file with UID 0x%llX",
(uint64_t)cfg_data_uid);
/*
* psa_ps_create can also be used here, which enables to the use of
* the psa_ps_set_extended function, but this requires us to set a
* maximum file size for resource allocation. Since the upper limit
* isn't known at present, we opt here for the simpler psa_ps_set
* call which also creates the secure storage record if necessary,
* but precludes the use of psa_ps_set_extended.
*/
status = psa_ps_set(cfg_data_uid, sizeof(cfg_data_dflt),
(void *)&cfg_data_dflt, 0);
if (status) {
goto err;
}
err:
return (status ? al_psa_status(status, __func__) : status);
}
psa_status_t cfg_load_data(struct cfg_data *p_cfg_data)
{
psa_status_t status;
struct psa_storage_info_t p_info;
memset(&p_info, 0, sizeof(p_info));
/* Check if the config record exists, if not create it. */
status = psa_ps_get_info(cfg_data_uid, &p_info);
if (status == PSA_ERROR_DOES_NOT_EXIST) {
/* Create a new config file. */
status = cfg_create_data();
/* Copy default values to the cfg_data placeholder. */
memcpy(p_cfg_data, &cfg_data_dflt, sizeof(cfg_data_dflt));
}
if (status) {
goto err;
}
err:
return (status ? al_psa_status(status, __func__) : status);
}