Files

175 lines
3.3 KiB
C

// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
/*
* Copyright (c) 2019 Amlogic, Inc. All rights reserved.
*/
#include <stdio.h>
#include <vsprintf.h>
#ifdef CONFIG_KEY_STORE_USE_FDB
#include "flashdb.h"
#else
#include <amlogic/storage.h>
#endif
#include <amlogic/key_store.h>
struct unifykey_store_ops {
int32_t (*read)(uint8_t *buf, uint32_t len, uint32_t *actual_len);
int32_t (*write)(uint8_t *buf, uint32_t len, uint32_t *actual_len);
} keystore_ops;
#ifdef CONFIG_KEY_STORE_USE_FDB
#define KEY_STORE_KEY_SLICE_SIZE 1024
static struct fdb_kvdb key_db;
static int32_t amlfdb_key_read(uint8_t *buf, uint32_t len, uint32_t *actual_length)
{
int32_t i, ret, size;
struct fdb_blob blob;
char key[8];
int slice_cnt = len / KEY_STORE_KEY_SLICE_SIZE;
uint8_t *p_buf = buf;
if (actual_length)
*actual_length = 0;
if (!buf || !slice_cnt) {
printf("error param, len = %d\n", len);
return -1;
}
for (i = 0, size = 0; i < slice_cnt; i++) {
snprintf(key, sizeof(key), "key%d", i);
ret = fdb_kv_get_blob(&key_db, key,
fdb_blob_make(&blob, p_buf, KEY_STORE_KEY_SLICE_SIZE));
if (ret == 0)
break;
size += ret;
p_buf += ret;
}
if (actual_length)
*actual_length = size;
return size >= 0 ? 0 : -1;
}
static int32_t amlfdb_key_write(uint8_t *buf, uint32_t len, uint32_t *actual_length)
{
int32_t ret;
struct fdb_blob blob;
char key[8];
int slice_cnt = len / KEY_STORE_KEY_SLICE_SIZE;
uint8_t *p_buf = buf;
if (actual_length)
*actual_length = 0;
if (!p_buf || slice_cnt == 0 || len > CONFIG_KEY_STORE_DATA_SIZE
|| len % KEY_STORE_KEY_SLICE_SIZE) {
printf("error param, len = %d\n", len);
return -1;
}
for (int i = 0; i < slice_cnt; i++) {
snprintf(key, sizeof(key), "key%d", i);
ret = fdb_kv_set_blob(&key_db, key,
fdb_blob_make(&blob, p_buf, KEY_STORE_KEY_SLICE_SIZE));
if (ret != FDB_NO_ERR) {
printf("write %s fail = %d\n", key, ret);
return -1;
}
p_buf += KEY_STORE_KEY_SLICE_SIZE;
}
if (actual_length)
*actual_length = len;
return 0;
}
#else
static int32_t amlsf_key_read(uint8_t *buf, uint32_t len, uint32_t *actual_length)
{
int ret;
ret = store_read("env", CONFIG_KEY_STORE_PART_OFFSET, len, buf);
if (actual_length)
*actual_length = ret ? 0 : len;
return ret;
}
static int32_t amlsf_key_write(uint8_t *buf, uint32_t len, uint32_t *actual_length)
{
int ret;
ret = store_erase("env", CONFIG_KEY_STORE_PART_OFFSET, len, 0);
ret |= store_write("env", CONFIG_KEY_STORE_PART_OFFSET, len, buf);
if (actual_length)
*actual_length = ret ? 0 : len;
return ret;
}
#endif
int32_t aml_key_read(uint8_t *buf, uint32_t len, uint32_t *actual_length)
{
return keystore_ops.read ? keystore_ops.read(buf, len, actual_length) : -1;
}
int32_t aml_key_write(uint8_t *buf, uint32_t len, uint32_t *actual_length)
{
return keystore_ops.write ? keystore_ops.write(buf, len, actual_length) : -1;
}
int32_t aml_key_store_init(void)
{
static int init_flag;
if (init_flag)
return 0;
#ifdef CONFIG_KEY_STORE_USE_FDB
int result = fdb_kvdb_init(&key_db, "env", FLASHDB_KEYSTORE_DB_NAME, NULL, NULL);
if (result != FDB_NO_ERR) {
printf("key_db init err=%d\n", result);
return -1;
}
keystore_ops.read = amlfdb_key_read;
keystore_ops.write = amlfdb_key_write;
#else
keystore_ops.read = amlsf_key_read;
keystore_ops.write = amlsf_key_write;
#endif
init_flag = 1;
return 0;
}