blob: d59fa48d216a211172bc32230420c3fdd72b92a7 [file] [log] [blame]
// SPDX-License-Identifier: BSD-2-Clause
/*
* Copyright (c) 2017, Linaro Limited
*/
#include <tee/tadb.h>
#include <kernel/user_ta.h>
#include <kernel/user_ta_store.h>
#include <initcall.h>
static TEE_Result secstor_ta_open(const TEE_UUID *uuid,
struct user_ta_store_handle **handle)
{
TEE_Result res;
struct tee_tadb_ta_read *ta;
size_t l;
const struct tee_tadb_property *prop;
res = tee_tadb_ta_open(uuid, &ta);
if (res)
return res;
prop = tee_tadb_ta_get_property(ta);
l = prop->custom_size;
res = tee_tadb_ta_read(ta, NULL, &l);
if (res)
goto err;
if (l != prop->custom_size) {
res = TEE_ERROR_CORRUPT_OBJECT;
goto err;
}
*handle = (struct user_ta_store_handle *)ta;
return TEE_SUCCESS;
err:
tee_tadb_ta_close(ta);
return res;
}
static TEE_Result secstor_ta_get_size(const struct user_ta_store_handle *h,
size_t *size)
{
struct tee_tadb_ta_read *ta = (struct tee_tadb_ta_read *)h;
const struct tee_tadb_property *prop = tee_tadb_ta_get_property(ta);
*size = prop->bin_size;
return TEE_SUCCESS;
}
static TEE_Result secstor_ta_get_tag(const struct user_ta_store_handle *h,
uint8_t *tag, unsigned int *tag_len)
{
return tee_tadb_get_tag((struct tee_tadb_ta_read *)h, tag, tag_len);
}
static TEE_Result secstor_ta_read(struct user_ta_store_handle *h, void *data,
size_t len)
{
struct tee_tadb_ta_read *ta = (struct tee_tadb_ta_read *)h;
size_t l = len;
TEE_Result res = tee_tadb_ta_read(ta, data, &l);
if (res)
return res;
if (l != len)
return TEE_ERROR_BAD_PARAMETERS;
return TEE_SUCCESS;
}
static void secstor_ta_close(struct user_ta_store_handle *h)
{
struct tee_tadb_ta_read *ta = (struct tee_tadb_ta_read *)h;
tee_tadb_ta_close(ta);
}
TEE_TA_REGISTER_TA_STORE(4) = {
.description = "Secure Storage TA",
.open = secstor_ta_open,
.get_size = secstor_ta_get_size,
.get_tag = secstor_ta_get_tag,
.read = secstor_ta_read,
.close = secstor_ta_close,
};