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