xref: /optee_os/core/kernel/secstor_ta.c (revision ef44161f847bb1f17e6c803e70047d749e7b394e)
1eea7974aSMarouene Boubakri // SPDX-License-Identifier: BSD-2-Clause
2eea7974aSMarouene Boubakri /*
3eea7974aSMarouene Boubakri  * Copyright (c) 2017, Linaro Limited
4eea7974aSMarouene Boubakri  */
5eea7974aSMarouene Boubakri 
6eea7974aSMarouene Boubakri #include <tee/tadb.h>
7eea7974aSMarouene Boubakri #include <kernel/ts_store.h>
8eea7974aSMarouene Boubakri #include <kernel/user_ta.h>
9eea7974aSMarouene Boubakri #include <initcall.h>
10eea7974aSMarouene Boubakri 
secstor_ta_open(const TEE_UUID * uuid,struct ts_store_handle ** handle)11eea7974aSMarouene Boubakri static TEE_Result secstor_ta_open(const TEE_UUID *uuid,
12eea7974aSMarouene Boubakri 				  struct ts_store_handle **handle)
13eea7974aSMarouene Boubakri {
14eea7974aSMarouene Boubakri 	TEE_Result res;
15eea7974aSMarouene Boubakri 	struct tee_tadb_ta_read *ta;
16eea7974aSMarouene Boubakri 	size_t l;
17eea7974aSMarouene Boubakri 	const struct tee_tadb_property *prop;
18eea7974aSMarouene Boubakri 
19eea7974aSMarouene Boubakri 	res = tee_tadb_ta_open(uuid, &ta);
20eea7974aSMarouene Boubakri 	if (res)
21eea7974aSMarouene Boubakri 		return res;
22eea7974aSMarouene Boubakri 	prop = tee_tadb_ta_get_property(ta);
23eea7974aSMarouene Boubakri 
24eea7974aSMarouene Boubakri 	l = prop->custom_size;
25*ef44161fSJens Wiklander 	res = tee_tadb_ta_read(ta, NULL, NULL, &l);
26eea7974aSMarouene Boubakri 	if (res)
27eea7974aSMarouene Boubakri 		goto err;
28eea7974aSMarouene Boubakri 	if (l != prop->custom_size) {
29eea7974aSMarouene Boubakri 		res = TEE_ERROR_CORRUPT_OBJECT;
30eea7974aSMarouene Boubakri 		goto err;
31eea7974aSMarouene Boubakri 	}
32eea7974aSMarouene Boubakri 
33eea7974aSMarouene Boubakri 	*handle = (struct ts_store_handle *)ta;
34eea7974aSMarouene Boubakri 
35eea7974aSMarouene Boubakri 	return TEE_SUCCESS;
36eea7974aSMarouene Boubakri err:
37eea7974aSMarouene Boubakri 	tee_tadb_ta_close(ta);
38eea7974aSMarouene Boubakri 	return res;
39eea7974aSMarouene Boubakri }
40eea7974aSMarouene Boubakri 
secstor_ta_get_size(const struct ts_store_handle * h,size_t * size)41eea7974aSMarouene Boubakri static TEE_Result secstor_ta_get_size(const struct ts_store_handle *h,
42eea7974aSMarouene Boubakri 				      size_t *size)
43eea7974aSMarouene Boubakri {
44eea7974aSMarouene Boubakri 	struct tee_tadb_ta_read *ta = (struct tee_tadb_ta_read *)h;
45eea7974aSMarouene Boubakri 	const struct tee_tadb_property *prop = tee_tadb_ta_get_property(ta);
46eea7974aSMarouene Boubakri 
47eea7974aSMarouene Boubakri 	*size = prop->bin_size;
48eea7974aSMarouene Boubakri 
49eea7974aSMarouene Boubakri 	return TEE_SUCCESS;
50eea7974aSMarouene Boubakri }
51eea7974aSMarouene Boubakri 
secstor_ta_get_tag(const struct ts_store_handle * h,uint8_t * tag,unsigned int * tag_len)52eea7974aSMarouene Boubakri static TEE_Result secstor_ta_get_tag(const struct ts_store_handle *h,
53eea7974aSMarouene Boubakri 				     uint8_t *tag, unsigned int *tag_len)
54eea7974aSMarouene Boubakri {
55eea7974aSMarouene Boubakri 	return tee_tadb_get_tag((struct tee_tadb_ta_read *)h, tag, tag_len);
56eea7974aSMarouene Boubakri }
57eea7974aSMarouene Boubakri 
secstor_ta_read(struct ts_store_handle * h,void * data_core,void * data_user,size_t len)58*ef44161fSJens Wiklander static TEE_Result secstor_ta_read(struct ts_store_handle *h, void *data_core,
59*ef44161fSJens Wiklander 				  void *data_user, size_t len)
60eea7974aSMarouene Boubakri {
61eea7974aSMarouene Boubakri 	struct tee_tadb_ta_read *ta = (struct tee_tadb_ta_read *)h;
62eea7974aSMarouene Boubakri 	size_t l = len;
63*ef44161fSJens Wiklander 	TEE_Result res = tee_tadb_ta_read(ta, data_core, data_user, &l);
64eea7974aSMarouene Boubakri 
65eea7974aSMarouene Boubakri 	if (res)
66eea7974aSMarouene Boubakri 		return res;
67eea7974aSMarouene Boubakri 	if (l != len)
68eea7974aSMarouene Boubakri 		return TEE_ERROR_BAD_PARAMETERS;
69eea7974aSMarouene Boubakri 
70eea7974aSMarouene Boubakri 	return TEE_SUCCESS;
71eea7974aSMarouene Boubakri }
72eea7974aSMarouene Boubakri 
secstor_ta_close(struct ts_store_handle * h)73eea7974aSMarouene Boubakri static void secstor_ta_close(struct ts_store_handle *h)
74eea7974aSMarouene Boubakri {
75eea7974aSMarouene Boubakri 	struct tee_tadb_ta_read *ta = (struct tee_tadb_ta_read *)h;
76eea7974aSMarouene Boubakri 
77eea7974aSMarouene Boubakri 	tee_tadb_ta_close(ta);
78eea7974aSMarouene Boubakri }
79eea7974aSMarouene Boubakri 
80eea7974aSMarouene Boubakri REGISTER_TA_STORE(4) = {
81eea7974aSMarouene Boubakri 	.description = "Secure Storage TA",
82eea7974aSMarouene Boubakri 	.open = secstor_ta_open,
83eea7974aSMarouene Boubakri 	.get_size = secstor_ta_get_size,
84eea7974aSMarouene Boubakri 	.get_tag = secstor_ta_get_tag,
85eea7974aSMarouene Boubakri 	.read = secstor_ta_read,
86eea7974aSMarouene Boubakri 	.close = secstor_ta_close,
87eea7974aSMarouene Boubakri };
88