xref: /optee_os/lib/libutee/tee_api_objects.c (revision 91c842489f0995fe21336f9fca53b94dcb43d6ee)
11bb92983SJerome Forissier // SPDX-License-Identifier: BSD-2-Clause
2b0104773SPascal Brand /*
3b0104773SPascal Brand  * Copyright (c) 2014, STMicroelectronics International N.V.
4b0104773SPascal Brand  */
5b0104773SPascal Brand #include <stdlib.h>
6b0104773SPascal Brand #include <string.h>
7b0104773SPascal Brand 
8b0104773SPascal Brand #include <tee_api.h>
9b0104773SPascal Brand #include <utee_syscalls.h>
10e86f1266SJens Wiklander #include "tee_api_private.h"
11b0104773SPascal Brand 
12b0104773SPascal Brand #define TEE_USAGE_DEFAULT   0xffffffff
13b0104773SPascal Brand 
14e86f1266SJens Wiklander void __utee_from_attr(struct utee_attribute *ua, const TEE_Attribute *attrs,
15e86f1266SJens Wiklander 			uint32_t attr_count)
16e86f1266SJens Wiklander {
17e86f1266SJens Wiklander 	size_t n;
18e86f1266SJens Wiklander 
19e86f1266SJens Wiklander 	for (n = 0; n < attr_count; n++) {
20e86f1266SJens Wiklander 		ua[n].attribute_id = attrs[n].attributeID;
21b9416909SJens Wiklander 		if (attrs[n].attributeID & TEE_ATTR_FLAG_VALUE) {
22e86f1266SJens Wiklander 			ua[n].a = attrs[n].content.value.a;
23e86f1266SJens Wiklander 			ua[n].b = attrs[n].content.value.b;
24e86f1266SJens Wiklander 		} else {
25e86f1266SJens Wiklander 			ua[n].a = (uintptr_t)attrs[n].content.ref.buffer;
26e86f1266SJens Wiklander 			ua[n].b = attrs[n].content.ref.length;
27e86f1266SJens Wiklander 		}
28e86f1266SJens Wiklander 	}
29e86f1266SJens Wiklander }
30e86f1266SJens Wiklander 
314f4374c8SJens Wiklander void __utee_from_gp11_attr(struct utee_attribute *ua,
324f4374c8SJens Wiklander 			   const __GP11_TEE_Attribute *attrs,
334f4374c8SJens Wiklander 			   uint32_t attr_count)
344f4374c8SJens Wiklander {
354f4374c8SJens Wiklander 	size_t n = 0;
364f4374c8SJens Wiklander 
374f4374c8SJens Wiklander 	for (n = 0; n < attr_count; n++) {
384f4374c8SJens Wiklander 		ua[n].attribute_id = attrs[n].attributeID;
394f4374c8SJens Wiklander 		if (attrs[n].attributeID & TEE_ATTR_FLAG_VALUE) {
404f4374c8SJens Wiklander 			ua[n].a = attrs[n].content.value.a;
414f4374c8SJens Wiklander 			ua[n].b = attrs[n].content.value.b;
424f4374c8SJens Wiklander 		} else {
434f4374c8SJens Wiklander 			ua[n].a = (uintptr_t)attrs[n].content.ref.buffer;
444f4374c8SJens Wiklander 			ua[n].b = attrs[n].content.ref.length;
454f4374c8SJens Wiklander 		}
464f4374c8SJens Wiklander 	}
474f4374c8SJens Wiklander }
484f4374c8SJens Wiklander 
49b0104773SPascal Brand /* Data and Key Storage API  - Generic Object Functions */
507583c59eSCedric Chaumont /*
517583c59eSCedric Chaumont  * Use of this function is deprecated
527583c59eSCedric Chaumont  * new code SHOULD use the TEE_GetObjectInfo1 function instead
537583c59eSCedric Chaumont  * These functions will be removed at some future major revision of
547583c59eSCedric Chaumont  * this specification
557583c59eSCedric Chaumont  */
56b0104773SPascal Brand void TEE_GetObjectInfo(TEE_ObjectHandle object, TEE_ObjectInfo *objectInfo)
57b0104773SPascal Brand {
5875d6a373SJens Wiklander 	struct utee_object_info info = { };
5975d6a373SJens Wiklander 	TEE_Result res = TEE_SUCCESS;
60b0104773SPascal Brand 
6175d6a373SJens Wiklander 	res = _utee_cryp_obj_get_info((unsigned long)object, &info);
627583c59eSCedric Chaumont 
63b0104773SPascal Brand 	if (res != TEE_SUCCESS)
64b0104773SPascal Brand 		TEE_Panic(res);
657583c59eSCedric Chaumont 
6675d6a373SJens Wiklander 	if (info.obj_type == TEE_TYPE_CORRUPTED_OBJECT) {
67d372a47cSJens Wiklander 		objectInfo->objectSize = 0;
68d372a47cSJens Wiklander 		objectInfo->maxObjectSize = 0;
69d372a47cSJens Wiklander 		objectInfo->objectUsage = 0;
70d372a47cSJens Wiklander 		objectInfo->dataSize = 0;
71d372a47cSJens Wiklander 		objectInfo->dataPosition = 0;
72d372a47cSJens Wiklander 		objectInfo->handleFlags = 0;
73d372a47cSJens Wiklander 	} else {
74d372a47cSJens Wiklander 		objectInfo->objectType = info.obj_type;
75d372a47cSJens Wiklander 		objectInfo->objectSize = info.obj_size;
76d372a47cSJens Wiklander 		objectInfo->maxObjectSize = info.max_obj_size;
77d372a47cSJens Wiklander 		objectInfo->objectUsage = info.obj_usage;
78d372a47cSJens Wiklander 		objectInfo->dataSize = info.data_size;
79d372a47cSJens Wiklander 		objectInfo->dataPosition = info.data_pos;
80d372a47cSJens Wiklander 		objectInfo->handleFlags = info.handle_flags;
81d372a47cSJens Wiklander 	}
82d372a47cSJens Wiklander }
83d372a47cSJens Wiklander 
84d372a47cSJens Wiklander void __GP11_TEE_GetObjectInfo(TEE_ObjectHandle object,
85d372a47cSJens Wiklander 			      __GP11_TEE_ObjectInfo *objectInfo)
86d372a47cSJens Wiklander {
87d372a47cSJens Wiklander 	struct utee_object_info info = { };
88d372a47cSJens Wiklander 	TEE_Result res = TEE_SUCCESS;
89d372a47cSJens Wiklander 
90d372a47cSJens Wiklander 	res = _utee_cryp_obj_get_info((unsigned long)object, &info);
91d372a47cSJens Wiklander 
92d372a47cSJens Wiklander 	if (res != TEE_SUCCESS)
93d372a47cSJens Wiklander 		TEE_Panic(res);
94d372a47cSJens Wiklander 
95d372a47cSJens Wiklander 	if (info.obj_type == TEE_TYPE_CORRUPTED_OBJECT) {
967583c59eSCedric Chaumont 		objectInfo->keySize = 0;
977583c59eSCedric Chaumont 		objectInfo->maxKeySize = 0;
987583c59eSCedric Chaumont 		objectInfo->objectUsage = 0;
997583c59eSCedric Chaumont 		objectInfo->dataSize = 0;
1007583c59eSCedric Chaumont 		objectInfo->dataPosition = 0;
1017583c59eSCedric Chaumont 		objectInfo->handleFlags = 0;
10275d6a373SJens Wiklander 	} else {
10375d6a373SJens Wiklander 		objectInfo->objectType = info.obj_type;
10475d6a373SJens Wiklander 		objectInfo->keySize = info.obj_size;
10575d6a373SJens Wiklander 		objectInfo->maxKeySize = info.max_obj_size;
10675d6a373SJens Wiklander 		objectInfo->objectUsage = info.obj_usage;
10775d6a373SJens Wiklander 		objectInfo->dataSize = info.data_size;
10875d6a373SJens Wiklander 		objectInfo->dataPosition = info.data_pos;
10975d6a373SJens Wiklander 		objectInfo->handleFlags = info.handle_flags;
1107583c59eSCedric Chaumont 	}
111b0104773SPascal Brand }
112b0104773SPascal Brand 
113d372a47cSJens Wiklander TEE_Result TEE_GetObjectInfo1(TEE_ObjectHandle object,
114d372a47cSJens Wiklander 			      TEE_ObjectInfo *objectInfo)
115d372a47cSJens Wiklander {
116d372a47cSJens Wiklander 	struct utee_object_info info = { };
117d372a47cSJens Wiklander 	TEE_Result res = TEE_SUCCESS;
118d372a47cSJens Wiklander 
119d372a47cSJens Wiklander 	res = _utee_cryp_obj_get_info((unsigned long)object, &info);
120d372a47cSJens Wiklander 
121d372a47cSJens Wiklander 	if (res != TEE_SUCCESS &&
122d372a47cSJens Wiklander 	    res != TEE_ERROR_CORRUPT_OBJECT &&
123d372a47cSJens Wiklander 	    res != TEE_ERROR_STORAGE_NOT_AVAILABLE)
124d372a47cSJens Wiklander 		TEE_Panic(res);
125d372a47cSJens Wiklander 
126d372a47cSJens Wiklander 	objectInfo->objectType = info.obj_type;
127d372a47cSJens Wiklander 	objectInfo->objectSize = info.obj_size;
128d372a47cSJens Wiklander 	objectInfo->maxObjectSize = info.max_obj_size;
129d372a47cSJens Wiklander 	objectInfo->objectUsage = info.obj_usage;
130d372a47cSJens Wiklander 	objectInfo->dataSize = info.data_size;
131d372a47cSJens Wiklander 	objectInfo->dataPosition = info.data_pos;
132d372a47cSJens Wiklander 	objectInfo->handleFlags = info.handle_flags;
133d372a47cSJens Wiklander 
134d372a47cSJens Wiklander 	return res;
135d372a47cSJens Wiklander }
136d372a47cSJens Wiklander 
137d372a47cSJens Wiklander TEE_Result __GP11_TEE_GetObjectInfo1(TEE_ObjectHandle object,
138d372a47cSJens Wiklander 				     __GP11_TEE_ObjectInfo *objectInfo)
1397583c59eSCedric Chaumont {
14075d6a373SJens Wiklander 	struct utee_object_info info = { };
14175d6a373SJens Wiklander 	TEE_Result res = TEE_SUCCESS;
1427583c59eSCedric Chaumont 
14375d6a373SJens Wiklander 	res = _utee_cryp_obj_get_info((unsigned long)object, &info);
1447583c59eSCedric Chaumont 
145a2e9a830SCedric Chaumont 	if (res != TEE_SUCCESS &&
146a2e9a830SCedric Chaumont 	    res != TEE_ERROR_CORRUPT_OBJECT &&
147a2e9a830SCedric Chaumont 	    res != TEE_ERROR_STORAGE_NOT_AVAILABLE)
1487583c59eSCedric Chaumont 		TEE_Panic(res);
1497583c59eSCedric Chaumont 
15075d6a373SJens Wiklander 	objectInfo->objectType = info.obj_type;
15175d6a373SJens Wiklander 	objectInfo->keySize = info.obj_size;
15275d6a373SJens Wiklander 	objectInfo->maxKeySize = info.max_obj_size;
15375d6a373SJens Wiklander 	objectInfo->objectUsage = info.obj_usage;
15475d6a373SJens Wiklander 	objectInfo->dataSize = info.data_size;
15575d6a373SJens Wiklander 	objectInfo->dataPosition = info.data_pos;
15675d6a373SJens Wiklander 	objectInfo->handleFlags = info.handle_flags;
15775d6a373SJens Wiklander 
1587583c59eSCedric Chaumont 	return res;
1597583c59eSCedric Chaumont }
1607583c59eSCedric Chaumont 
1617583c59eSCedric Chaumont /*
1627583c59eSCedric Chaumont  * Use of this function is deprecated
1637583c59eSCedric Chaumont  * new code SHOULD use the TEE_RestrictObjectUsage1 function instead
1647583c59eSCedric Chaumont  * These functions will be removed at some future major revision of
1657583c59eSCedric Chaumont  * this specification
1667583c59eSCedric Chaumont  */
167b0104773SPascal Brand void TEE_RestrictObjectUsage(TEE_ObjectHandle object, uint32_t objectUsage)
168b0104773SPascal Brand {
16975d6a373SJens Wiklander 	struct utee_object_info info = { };
17075d6a373SJens Wiklander 	TEE_Result res = TEE_SUCCESS;
1717583c59eSCedric Chaumont 
17275d6a373SJens Wiklander 	res = _utee_cryp_obj_get_info((unsigned long)object, &info);
17375d6a373SJens Wiklander 	if (info.obj_type == TEE_TYPE_CORRUPTED_OBJECT)
1747583c59eSCedric Chaumont 		return;
1757583c59eSCedric Chaumont 
1767583c59eSCedric Chaumont 	res = TEE_RestrictObjectUsage1(object, objectUsage);
177b0104773SPascal Brand 
178b0104773SPascal Brand 	if (res != TEE_SUCCESS)
179b36311adSJerome Forissier 		TEE_Panic(res);
180b0104773SPascal Brand }
181b0104773SPascal Brand 
1827583c59eSCedric Chaumont TEE_Result TEE_RestrictObjectUsage1(TEE_ObjectHandle object, uint32_t objectUsage)
1837583c59eSCedric Chaumont {
1847583c59eSCedric Chaumont 	TEE_Result res;
1857583c59eSCedric Chaumont 
1862c028fdeSJerome Forissier 	res = _utee_cryp_obj_restrict_usage((unsigned long)object,
1872c028fdeSJerome Forissier 					    objectUsage);
1887583c59eSCedric Chaumont 
189a2e9a830SCedric Chaumont 	if (res != TEE_SUCCESS &&
190a2e9a830SCedric Chaumont 	    res != TEE_ERROR_CORRUPT_OBJECT &&
191a2e9a830SCedric Chaumont 	    res != TEE_ERROR_STORAGE_NOT_AVAILABLE)
192a2e9a830SCedric Chaumont 		TEE_Panic(res);
1937583c59eSCedric Chaumont 
1947583c59eSCedric Chaumont 	return res;
1957583c59eSCedric Chaumont }
1967583c59eSCedric Chaumont 
197b0104773SPascal Brand TEE_Result TEE_GetObjectBufferAttribute(TEE_ObjectHandle object,
198b0104773SPascal Brand 					uint32_t attributeID, void *buffer,
199*91c84248SJens Wiklander 					size_t *size)
200b0104773SPascal Brand {
20175d6a373SJens Wiklander 	struct utee_object_info info = { };
20275d6a373SJens Wiklander 	TEE_Result res = TEE_SUCCESS;
20375d6a373SJens Wiklander 	uint64_t sz = 0;
204b0104773SPascal Brand 
2056915bbbbSJens Wiklander 	__utee_check_inout_annotation(size, sizeof(*size));
2066915bbbbSJens Wiklander 
2072c028fdeSJerome Forissier 	res = _utee_cryp_obj_get_info((unsigned long)object, &info);
208b0104773SPascal Brand 	if (res != TEE_SUCCESS)
209a2e9a830SCedric Chaumont 		goto exit;
210b0104773SPascal Brand 
211b0104773SPascal Brand 	/* This function only supports reference attributes */
212b9416909SJens Wiklander 	if ((attributeID & TEE_ATTR_FLAG_VALUE)) {
213a2e9a830SCedric Chaumont 		res = TEE_ERROR_BAD_PARAMETERS;
214a2e9a830SCedric Chaumont 		goto exit;
215a2e9a830SCedric Chaumont 	}
216b0104773SPascal Brand 
217e86f1266SJens Wiklander 	sz = *size;
2182c028fdeSJerome Forissier 	res = _utee_cryp_obj_get_attr((unsigned long)object, attributeID,
219e86f1266SJens Wiklander 				      buffer, &sz);
220e86f1266SJens Wiklander 	*size = sz;
221b0104773SPascal Brand 
222a2e9a830SCedric Chaumont exit:
2230ed6a6caSCedric Chaumont 	if (res != TEE_SUCCESS &&
2240ed6a6caSCedric Chaumont 	    res != TEE_ERROR_ITEM_NOT_FOUND &&
2250ed6a6caSCedric Chaumont 	    res != TEE_ERROR_SHORT_BUFFER &&
2260ed6a6caSCedric Chaumont 	    res != TEE_ERROR_CORRUPT_OBJECT &&
2270ed6a6caSCedric Chaumont 	    res != TEE_ERROR_STORAGE_NOT_AVAILABLE)
228b36311adSJerome Forissier 		TEE_Panic(res);
229b0104773SPascal Brand 
230b0104773SPascal Brand 	return res;
231b0104773SPascal Brand }
232b0104773SPascal Brand 
233*91c84248SJens Wiklander TEE_Result __GP11_TEE_GetObjectBufferAttribute(TEE_ObjectHandle object,
234*91c84248SJens Wiklander 					       uint32_t attributeID,
235*91c84248SJens Wiklander 					       void *buffer, uint32_t *size)
236*91c84248SJens Wiklander {
237*91c84248SJens Wiklander 	TEE_Result res = TEE_SUCCESS;
238*91c84248SJens Wiklander 	size_t l = 0;
239*91c84248SJens Wiklander 
240*91c84248SJens Wiklander 	__utee_check_inout_annotation(size, sizeof(*size));
241*91c84248SJens Wiklander 	l = *size;
242*91c84248SJens Wiklander 	res = TEE_GetObjectBufferAttribute(object, attributeID, buffer, &l);
243*91c84248SJens Wiklander 	*size = l;
244*91c84248SJens Wiklander 	return res;
245*91c84248SJens Wiklander }
246*91c84248SJens Wiklander 
247b0104773SPascal Brand TEE_Result TEE_GetObjectValueAttribute(TEE_ObjectHandle object,
248b0104773SPascal Brand 				       uint32_t attributeID, uint32_t *a,
249b0104773SPascal Brand 				       uint32_t *b)
250b0104773SPascal Brand {
25175d6a373SJens Wiklander 	struct utee_object_info info = { };
25275d6a373SJens Wiklander 	TEE_Result res = TEE_SUCCESS;
253b0104773SPascal Brand 	uint32_t buf[2];
254e86f1266SJens Wiklander 	uint64_t size = sizeof(buf);
255b0104773SPascal Brand 
2566915bbbbSJens Wiklander 	if (a)
2576915bbbbSJens Wiklander 		__utee_check_out_annotation(a, sizeof(*a));
2586915bbbbSJens Wiklander 	if (b)
2596915bbbbSJens Wiklander 		__utee_check_out_annotation(b, sizeof(*b));
2606915bbbbSJens Wiklander 
2612c028fdeSJerome Forissier 	res = _utee_cryp_obj_get_info((unsigned long)object, &info);
262b0104773SPascal Brand 	if (res != TEE_SUCCESS)
263a2e9a830SCedric Chaumont 		goto exit;
264b0104773SPascal Brand 
265b0104773SPascal Brand 	/* This function only supports value attributes */
266b9416909SJens Wiklander 	if (!(attributeID & TEE_ATTR_FLAG_VALUE)) {
267a2e9a830SCedric Chaumont 		res = TEE_ERROR_BAD_PARAMETERS;
268a2e9a830SCedric Chaumont 		goto exit;
269a2e9a830SCedric Chaumont 	}
270b0104773SPascal Brand 
2712c028fdeSJerome Forissier 	res = _utee_cryp_obj_get_attr((unsigned long)object, attributeID, buf,
272e86f1266SJens Wiklander 				      &size);
273b0104773SPascal Brand 
274a2e9a830SCedric Chaumont exit:
2750ed6a6caSCedric Chaumont 	if (res != TEE_SUCCESS &&
2760ed6a6caSCedric Chaumont 	    res != TEE_ERROR_ITEM_NOT_FOUND &&
2770ed6a6caSCedric Chaumont 	    res != TEE_ERROR_CORRUPT_OBJECT &&
2780ed6a6caSCedric Chaumont 	    res != TEE_ERROR_STORAGE_NOT_AVAILABLE)
279b36311adSJerome Forissier 		TEE_Panic(res);
280b0104773SPascal Brand 
281b0104773SPascal Brand 	if (size != sizeof(buf))
282b0104773SPascal Brand 		TEE_Panic(0);
283b0104773SPascal Brand 
284be96c837SJerome Forissier 	if (res == TEE_SUCCESS) {
285b9d8f134SJerome Forissier 		if (a)
286b0104773SPascal Brand 			*a = buf[0];
287b9d8f134SJerome Forissier 		if (b)
288b0104773SPascal Brand 			*b = buf[1];
289be96c837SJerome Forissier 	}
290b0104773SPascal Brand 
291b0104773SPascal Brand 	return res;
292b0104773SPascal Brand }
293b0104773SPascal Brand 
294b0104773SPascal Brand void TEE_CloseObject(TEE_ObjectHandle object)
295b0104773SPascal Brand {
296b0104773SPascal Brand 	TEE_Result res;
297b0104773SPascal Brand 
298b0104773SPascal Brand 	if (object == TEE_HANDLE_NULL)
299b0104773SPascal Brand 		return;
300b0104773SPascal Brand 
3012c028fdeSJerome Forissier 	res = _utee_cryp_obj_close((unsigned long)object);
302b0104773SPascal Brand 	if (res != TEE_SUCCESS)
303b36311adSJerome Forissier 		TEE_Panic(res);
304b0104773SPascal Brand }
305b0104773SPascal Brand 
306b0104773SPascal Brand /* Data and Key Storage API  - Transient Object Functions */
307b0104773SPascal Brand 
308b0104773SPascal Brand TEE_Result TEE_AllocateTransientObject(TEE_ObjectType objectType,
30979a3c601SCedric Chaumont 				       uint32_t maxKeySize,
310b0104773SPascal Brand 				       TEE_ObjectHandle *object)
311b0104773SPascal Brand {
312b0104773SPascal Brand 	TEE_Result res;
313b0104773SPascal Brand 	uint32_t obj;
314b0104773SPascal Brand 
3156915bbbbSJens Wiklander 	__utee_check_out_annotation(object, sizeof(*object));
3166915bbbbSJens Wiklander 
3172c028fdeSJerome Forissier 	res = _utee_cryp_obj_alloc(objectType, maxKeySize, &obj);
318aeb0d927SCedric Chaumont 
319aeb0d927SCedric Chaumont 	if (res != TEE_SUCCESS &&
320aeb0d927SCedric Chaumont 	    res != TEE_ERROR_OUT_OF_MEMORY &&
321aeb0d927SCedric Chaumont 	    res != TEE_ERROR_NOT_SUPPORTED)
322b36311adSJerome Forissier 		TEE_Panic(res);
323aeb0d927SCedric Chaumont 
324b0104773SPascal Brand 	if (res == TEE_SUCCESS)
325e86f1266SJens Wiklander 		*object = (TEE_ObjectHandle)(uintptr_t)obj;
3260ed6a6caSCedric Chaumont 
327b0104773SPascal Brand 	return res;
328b0104773SPascal Brand }
329b0104773SPascal Brand 
330b0104773SPascal Brand void TEE_FreeTransientObject(TEE_ObjectHandle object)
331b0104773SPascal Brand {
33275d6a373SJens Wiklander 	struct utee_object_info info = { };
33375d6a373SJens Wiklander 	TEE_Result res = TEE_SUCCESS;
334b0104773SPascal Brand 
335b0104773SPascal Brand 	if (object == TEE_HANDLE_NULL)
336b0104773SPascal Brand 		return;
337b0104773SPascal Brand 
3382c028fdeSJerome Forissier 	res = _utee_cryp_obj_get_info((unsigned long)object, &info);
339b0104773SPascal Brand 	if (res != TEE_SUCCESS)
340b36311adSJerome Forissier 		TEE_Panic(res);
341b0104773SPascal Brand 
34275d6a373SJens Wiklander 	if ((info.handle_flags & TEE_HANDLE_FLAG_PERSISTENT) != 0)
343b0104773SPascal Brand 		TEE_Panic(0);
344b0104773SPascal Brand 
3452c028fdeSJerome Forissier 	res = _utee_cryp_obj_close((unsigned long)object);
346b0104773SPascal Brand 	if (res != TEE_SUCCESS)
347b36311adSJerome Forissier 		TEE_Panic(res);
348b0104773SPascal Brand }
349b0104773SPascal Brand 
350b0104773SPascal Brand void TEE_ResetTransientObject(TEE_ObjectHandle object)
351b0104773SPascal Brand {
35275d6a373SJens Wiklander 	struct utee_object_info info = { };
35375d6a373SJens Wiklander 	TEE_Result res = TEE_SUCCESS;
354b0104773SPascal Brand 
355b0104773SPascal Brand 	if (object == TEE_HANDLE_NULL)
356b0104773SPascal Brand 		return;
357b0104773SPascal Brand 
3582c028fdeSJerome Forissier 	res = _utee_cryp_obj_get_info((unsigned long)object, &info);
359b0104773SPascal Brand 	if (res != TEE_SUCCESS)
360b36311adSJerome Forissier 		TEE_Panic(res);
361b0104773SPascal Brand 
36275d6a373SJens Wiklander 	if ((info.handle_flags & TEE_HANDLE_FLAG_PERSISTENT) != 0)
363b0104773SPascal Brand 		TEE_Panic(0);
364b0104773SPascal Brand 
3652c028fdeSJerome Forissier 	res = _utee_cryp_obj_reset((unsigned long)object);
366b0104773SPascal Brand 	if (res != TEE_SUCCESS)
367b36311adSJerome Forissier 		TEE_Panic(res);
368b0104773SPascal Brand }
369b0104773SPascal Brand 
370b0104773SPascal Brand TEE_Result TEE_PopulateTransientObject(TEE_ObjectHandle object,
3718f07fe6fSJerome Forissier 				       const TEE_Attribute *attrs,
372b0104773SPascal Brand 				       uint32_t attrCount)
373b0104773SPascal Brand {
374e86f1266SJens Wiklander 	struct utee_attribute ua[attrCount];
37575d6a373SJens Wiklander 	struct utee_object_info info = { };
37675d6a373SJens Wiklander 	TEE_Result res = TEE_SUCCESS;
377b0104773SPascal Brand 
3786915bbbbSJens Wiklander 	__utee_check_attr_in_annotation(attrs, attrCount);
3796915bbbbSJens Wiklander 
3802c028fdeSJerome Forissier 	res = _utee_cryp_obj_get_info((unsigned long)object, &info);
381b0104773SPascal Brand 	if (res != TEE_SUCCESS)
382b36311adSJerome Forissier 		TEE_Panic(res);
383b0104773SPascal Brand 
384b0104773SPascal Brand 	/* Must be a transient object */
38575d6a373SJens Wiklander 	if ((info.handle_flags & TEE_HANDLE_FLAG_PERSISTENT) != 0)
386b0104773SPascal Brand 		TEE_Panic(0);
387b0104773SPascal Brand 
388b0104773SPascal Brand 	/* Must not be initialized already */
38975d6a373SJens Wiklander 	if ((info.handle_flags & TEE_HANDLE_FLAG_INITIALIZED) != 0)
390b0104773SPascal Brand 		TEE_Panic(0);
391b0104773SPascal Brand 
392e86f1266SJens Wiklander 	__utee_from_attr(ua, attrs, attrCount);
3932c028fdeSJerome Forissier 	res = _utee_cryp_obj_populate((unsigned long)object, ua, attrCount);
394b0104773SPascal Brand 	if (res != TEE_SUCCESS && res != TEE_ERROR_BAD_PARAMETERS)
395b0104773SPascal Brand 		TEE_Panic(res);
396b0104773SPascal Brand 	return res;
397b0104773SPascal Brand }
398b0104773SPascal Brand 
3994f4374c8SJens Wiklander TEE_Result __GP11_TEE_PopulateTransientObject(TEE_ObjectHandle object,
4004f4374c8SJens Wiklander 					      const __GP11_TEE_Attribute *attrs,
4014f4374c8SJens Wiklander 					      uint32_t attrCount)
4024f4374c8SJens Wiklander {
4034f4374c8SJens Wiklander 	struct utee_attribute ua[attrCount];
4044f4374c8SJens Wiklander 	struct utee_object_info info = { };
4054f4374c8SJens Wiklander 	TEE_Result res = TEE_SUCCESS;
4064f4374c8SJens Wiklander 
4074f4374c8SJens Wiklander 	__utee_check_gp11_attr_in_annotation(attrs, attrCount);
4084f4374c8SJens Wiklander 
4094f4374c8SJens Wiklander 	res = _utee_cryp_obj_get_info((unsigned long)object, &info);
4104f4374c8SJens Wiklander 	if (res != TEE_SUCCESS)
4114f4374c8SJens Wiklander 		TEE_Panic(res);
4124f4374c8SJens Wiklander 
4134f4374c8SJens Wiklander 	/* Must be a transient object */
4144f4374c8SJens Wiklander 	if ((info.handle_flags & TEE_HANDLE_FLAG_PERSISTENT) != 0)
4154f4374c8SJens Wiklander 		TEE_Panic(0);
4164f4374c8SJens Wiklander 
4174f4374c8SJens Wiklander 	/* Must not be initialized already */
4184f4374c8SJens Wiklander 	if ((info.handle_flags & TEE_HANDLE_FLAG_INITIALIZED) != 0)
4194f4374c8SJens Wiklander 		TEE_Panic(0);
4204f4374c8SJens Wiklander 
4214f4374c8SJens Wiklander 	__utee_from_gp11_attr(ua, attrs, attrCount);
4224f4374c8SJens Wiklander 	res = _utee_cryp_obj_populate((unsigned long)object, ua, attrCount);
4234f4374c8SJens Wiklander 	if (res != TEE_SUCCESS && res != TEE_ERROR_BAD_PARAMETERS)
4244f4374c8SJens Wiklander 		TEE_Panic(res);
4254f4374c8SJens Wiklander 	return res;
4264f4374c8SJens Wiklander }
4274f4374c8SJens Wiklander 
428b0104773SPascal Brand void TEE_InitRefAttribute(TEE_Attribute *attr, uint32_t attributeID,
4298f07fe6fSJerome Forissier 			  const void *buffer, uint32_t length)
430b0104773SPascal Brand {
4316915bbbbSJens Wiklander 	__utee_check_out_annotation(attr, sizeof(*attr));
4326915bbbbSJens Wiklander 
433b9416909SJens Wiklander 	if ((attributeID & TEE_ATTR_FLAG_VALUE) != 0)
434b0104773SPascal Brand 		TEE_Panic(0);
435b0104773SPascal Brand 	attr->attributeID = attributeID;
4368f07fe6fSJerome Forissier 	attr->content.ref.buffer = (void *)buffer;
437b0104773SPascal Brand 	attr->content.ref.length = length;
438b0104773SPascal Brand }
439b0104773SPascal Brand 
4404f4374c8SJens Wiklander void __GP11_TEE_InitRefAttribute(__GP11_TEE_Attribute *attr,
4414f4374c8SJens Wiklander 				 uint32_t attributeID,
4424f4374c8SJens Wiklander 				 const void *buffer, uint32_t length)
4434f4374c8SJens Wiklander {
4444f4374c8SJens Wiklander 	__utee_check_out_annotation(attr, sizeof(*attr));
4454f4374c8SJens Wiklander 
4464f4374c8SJens Wiklander 	if ((attributeID & TEE_ATTR_FLAG_VALUE) != 0)
4474f4374c8SJens Wiklander 		TEE_Panic(0);
4484f4374c8SJens Wiklander 	attr->attributeID = attributeID;
4494f4374c8SJens Wiklander 	attr->content.ref.buffer = (void *)buffer;
4504f4374c8SJens Wiklander 	attr->content.ref.length = length;
4514f4374c8SJens Wiklander }
4524f4374c8SJens Wiklander 
453b0104773SPascal Brand void TEE_InitValueAttribute(TEE_Attribute *attr, uint32_t attributeID,
454b0104773SPascal Brand 			    uint32_t a, uint32_t b)
455b0104773SPascal Brand {
4566915bbbbSJens Wiklander 	__utee_check_out_annotation(attr, sizeof(*attr));
4576915bbbbSJens Wiklander 
458b9416909SJens Wiklander 	if ((attributeID & TEE_ATTR_FLAG_VALUE) == 0)
459b0104773SPascal Brand 		TEE_Panic(0);
460b0104773SPascal Brand 	attr->attributeID = attributeID;
461b0104773SPascal Brand 	attr->content.value.a = a;
462b0104773SPascal Brand 	attr->content.value.b = b;
463b0104773SPascal Brand }
464b0104773SPascal Brand 
4654f4374c8SJens Wiklander void __GP11_TEE_InitValueAttribute(__GP11_TEE_Attribute *attr,
4664f4374c8SJens Wiklander 				   uint32_t attributeID,
4674f4374c8SJens Wiklander 				   uint32_t a, uint32_t b)
4684f4374c8SJens Wiklander {
4694f4374c8SJens Wiklander 	__utee_check_out_annotation(attr, sizeof(*attr));
4704f4374c8SJens Wiklander 
4714f4374c8SJens Wiklander 	if ((attributeID & TEE_ATTR_FLAG_VALUE) == 0)
4724f4374c8SJens Wiklander 		TEE_Panic(0);
4734f4374c8SJens Wiklander 	attr->attributeID = attributeID;
4744f4374c8SJens Wiklander 	attr->content.value.a = a;
4754f4374c8SJens Wiklander 	attr->content.value.b = b;
4764f4374c8SJens Wiklander }
4774f4374c8SJens Wiklander 
4787583c59eSCedric Chaumont /*
4797583c59eSCedric Chaumont  * Use of this function is deprecated
4807583c59eSCedric Chaumont  * new code SHOULD use the TEE_CopyObjectAttributes1 function instead
4817583c59eSCedric Chaumont  * These functions will be removed at some future major revision of
4827583c59eSCedric Chaumont  * this specification
4837583c59eSCedric Chaumont  */
484b0104773SPascal Brand void TEE_CopyObjectAttributes(TEE_ObjectHandle destObject,
485b0104773SPascal Brand 			      TEE_ObjectHandle srcObject)
486b0104773SPascal Brand {
48775d6a373SJens Wiklander 	struct utee_object_info src_info = { };
48875d6a373SJens Wiklander 	TEE_Result res = TEE_SUCCESS;
4897583c59eSCedric Chaumont 
4902c028fdeSJerome Forissier 	res = _utee_cryp_obj_get_info((unsigned long)srcObject, &src_info);
49175d6a373SJens Wiklander 	if (src_info.obj_type == TEE_TYPE_CORRUPTED_OBJECT)
4927583c59eSCedric Chaumont 		return;
4937583c59eSCedric Chaumont 
4947583c59eSCedric Chaumont 	res = TEE_CopyObjectAttributes1(destObject, srcObject);
4957583c59eSCedric Chaumont 	if (res != TEE_SUCCESS)
496b36311adSJerome Forissier 		TEE_Panic(res);
4977583c59eSCedric Chaumont }
4987583c59eSCedric Chaumont 
4997583c59eSCedric Chaumont TEE_Result TEE_CopyObjectAttributes1(TEE_ObjectHandle destObject,
5007583c59eSCedric Chaumont 			      TEE_ObjectHandle srcObject)
5017583c59eSCedric Chaumont {
50275d6a373SJens Wiklander 	struct utee_object_info dst_info = { };
50375d6a373SJens Wiklander 	struct utee_object_info src_info = { };
50475d6a373SJens Wiklander 	TEE_Result res = TEE_SUCCESS;
505b0104773SPascal Brand 
5062c028fdeSJerome Forissier 	res = _utee_cryp_obj_get_info((unsigned long)destObject, &dst_info);
507b0104773SPascal Brand 	if (res != TEE_SUCCESS)
508a2e9a830SCedric Chaumont 		goto exit;
509b0104773SPascal Brand 
5102c028fdeSJerome Forissier 	res = _utee_cryp_obj_get_info((unsigned long)srcObject, &src_info);
511b0104773SPascal Brand 	if (res != TEE_SUCCESS)
512a2e9a830SCedric Chaumont 		goto exit;
513b0104773SPascal Brand 
51475d6a373SJens Wiklander 	if (!(src_info.handle_flags & TEE_HANDLE_FLAG_INITIALIZED))
515b0104773SPascal Brand 		TEE_Panic(0);
516a2e9a830SCedric Chaumont 
51775d6a373SJens Wiklander 	if ((dst_info.handle_flags & TEE_HANDLE_FLAG_PERSISTENT))
518b0104773SPascal Brand 		TEE_Panic(0);
519a2e9a830SCedric Chaumont 
52075d6a373SJens Wiklander 	if ((dst_info.handle_flags & TEE_HANDLE_FLAG_INITIALIZED))
521b0104773SPascal Brand 		TEE_Panic(0);
522b0104773SPascal Brand 
5232c028fdeSJerome Forissier 	res = _utee_cryp_obj_copy((unsigned long)destObject,
524e86f1266SJens Wiklander 				  (unsigned long)srcObject);
5257583c59eSCedric Chaumont 
526a2e9a830SCedric Chaumont exit:
527a2e9a830SCedric Chaumont 	if (res != TEE_SUCCESS &&
528a2e9a830SCedric Chaumont 	    res != TEE_ERROR_CORRUPT_OBJECT &&
529a2e9a830SCedric Chaumont 	    res != TEE_ERROR_STORAGE_NOT_AVAILABLE)
530a2e9a830SCedric Chaumont 		TEE_Panic(res);
5317583c59eSCedric Chaumont 
5327583c59eSCedric Chaumont 	return res;
533b0104773SPascal Brand }
534b0104773SPascal Brand 
535b0104773SPascal Brand TEE_Result TEE_GenerateKey(TEE_ObjectHandle object, uint32_t keySize,
5368f07fe6fSJerome Forissier 			   const TEE_Attribute *params, uint32_t paramCount)
537b0104773SPascal Brand {
538b0104773SPascal Brand 	TEE_Result res;
539e86f1266SJens Wiklander 	struct utee_attribute ua[paramCount];
540b0104773SPascal Brand 
5416915bbbbSJens Wiklander 	__utee_check_attr_in_annotation(params, paramCount);
5426915bbbbSJens Wiklander 
543e86f1266SJens Wiklander 	__utee_from_attr(ua, params, paramCount);
5442c028fdeSJerome Forissier 	res = _utee_cryp_obj_generate_key((unsigned long)object, keySize,
545e86f1266SJens Wiklander 					  ua, paramCount);
546b0104773SPascal Brand 
547aeb0d927SCedric Chaumont 	if (res != TEE_SUCCESS && res != TEE_ERROR_BAD_PARAMETERS)
548b36311adSJerome Forissier 		TEE_Panic(res);
549b0104773SPascal Brand 
550b0104773SPascal Brand 	return res;
551b0104773SPascal Brand }
552b0104773SPascal Brand 
5534f4374c8SJens Wiklander TEE_Result __GP11_TEE_GenerateKey(TEE_ObjectHandle object, uint32_t keySize,
5544f4374c8SJens Wiklander 				  const __GP11_TEE_Attribute *params,
5554f4374c8SJens Wiklander 				  uint32_t paramCount)
5564f4374c8SJens Wiklander {
5574f4374c8SJens Wiklander 	TEE_Result res = TEE_SUCCESS;
5584f4374c8SJens Wiklander 	struct utee_attribute ua[paramCount];
5594f4374c8SJens Wiklander 
5604f4374c8SJens Wiklander 	__utee_check_gp11_attr_in_annotation(params, paramCount);
5614f4374c8SJens Wiklander 
5624f4374c8SJens Wiklander 	__utee_from_gp11_attr(ua, params, paramCount);
5634f4374c8SJens Wiklander 	res = _utee_cryp_obj_generate_key((unsigned long)object, keySize,
5644f4374c8SJens Wiklander 					  ua, paramCount);
5654f4374c8SJens Wiklander 
5664f4374c8SJens Wiklander 	if (res != TEE_SUCCESS && res != TEE_ERROR_BAD_PARAMETERS)
5674f4374c8SJens Wiklander 		TEE_Panic(res);
5684f4374c8SJens Wiklander 
5694f4374c8SJens Wiklander 	return res;
5704f4374c8SJens Wiklander }
5714f4374c8SJens Wiklander 
572b0104773SPascal Brand /* Data and Key Storage API  - Persistent Object Functions */
573b0104773SPascal Brand 
5748f07fe6fSJerome Forissier TEE_Result TEE_OpenPersistentObject(uint32_t storageID, const void *objectID,
57579a3c601SCedric Chaumont 				    uint32_t objectIDLen, uint32_t flags,
576b0104773SPascal Brand 				    TEE_ObjectHandle *object)
577b0104773SPascal Brand {
5789b520646SCedric Chaumont 	TEE_Result res;
579e86f1266SJens Wiklander 	uint32_t obj;
580b0104773SPascal Brand 
5812138a6f8SStefan Schmidt 	__utee_check_out_annotation(object, sizeof(*object));
5822138a6f8SStefan Schmidt 
5832c028fdeSJerome Forissier 	res = _utee_storage_obj_open(storageID, objectID, objectIDLen, flags,
584e86f1266SJens Wiklander 				     &obj);
585e86f1266SJens Wiklander 	if (res == TEE_SUCCESS)
586e86f1266SJens Wiklander 		*object = (TEE_ObjectHandle)(uintptr_t)obj;
5879b520646SCedric Chaumont 
5889b520646SCedric Chaumont 	if (res != TEE_SUCCESS &&
5899b520646SCedric Chaumont 	    res != TEE_ERROR_ITEM_NOT_FOUND &&
5909b520646SCedric Chaumont 	    res != TEE_ERROR_ACCESS_CONFLICT &&
5919b520646SCedric Chaumont 	    res != TEE_ERROR_OUT_OF_MEMORY &&
5929b520646SCedric Chaumont 	    res != TEE_ERROR_CORRUPT_OBJECT &&
5939b520646SCedric Chaumont 	    res != TEE_ERROR_STORAGE_NOT_AVAILABLE)
594b36311adSJerome Forissier 		TEE_Panic(res);
595b0104773SPascal Brand 
596172d637bSCedric Auger 	if (res != TEE_SUCCESS)
59769a3d6beSDaniel Glöckner 		*object = TEE_HANDLE_NULL;
59869a3d6beSDaniel Glöckner 
5999b520646SCedric Chaumont 	return res;
600b0104773SPascal Brand }
601b0104773SPascal Brand 
6028f07fe6fSJerome Forissier TEE_Result TEE_CreatePersistentObject(uint32_t storageID, const void *objectID,
60379a3c601SCedric Chaumont 				      uint32_t objectIDLen, uint32_t flags,
604b0104773SPascal Brand 				      TEE_ObjectHandle attributes,
605b0104773SPascal Brand 				      const void *initialData,
60679a3c601SCedric Chaumont 				      uint32_t initialDataLen,
607b0104773SPascal Brand 				      TEE_ObjectHandle *object)
608b0104773SPascal Brand {
60984431ae3SCedric Chaumont 	TEE_Result res;
610e86f1266SJens Wiklander 	uint32_t obj;
611b0104773SPascal Brand 
6126915bbbbSJens Wiklander 	__utee_check_out_annotation(object, sizeof(*object));
613b0104773SPascal Brand 
6142c028fdeSJerome Forissier 	res = _utee_storage_obj_create(storageID, objectID, objectIDLen, flags,
615e86f1266SJens Wiklander 				       (unsigned long)attributes, initialData,
616e86f1266SJens Wiklander 				       initialDataLen, &obj);
617172d637bSCedric Auger 
6181c96fa7fSPascal Brand 	if (res == TEE_SUCCESS)
619172d637bSCedric Auger 		*object = (TEE_ObjectHandle)(uintptr_t)obj;
620172d637bSCedric Auger 
621172d637bSCedric Auger 	if (res != TEE_SUCCESS &&
622172d637bSCedric Auger 	    res != TEE_ERROR_ITEM_NOT_FOUND &&
623172d637bSCedric Auger 	    res != TEE_ERROR_ACCESS_CONFLICT &&
624172d637bSCedric Auger 	    res != TEE_ERROR_OUT_OF_MEMORY &&
625172d637bSCedric Auger 	    res != TEE_ERROR_STORAGE_NO_SPACE &&
626172d637bSCedric Auger 	    res != TEE_ERROR_CORRUPT_OBJECT &&
627172d637bSCedric Auger 	    res != TEE_ERROR_STORAGE_NOT_AVAILABLE)
628b36311adSJerome Forissier 		TEE_Panic(res);
629172d637bSCedric Auger 
630172d637bSCedric Auger 	if (res != TEE_SUCCESS)
631172d637bSCedric Auger 		*object = TEE_HANDLE_NULL;
632172d637bSCedric Auger 
633172d637bSCedric Auger 	return res;
634b0104773SPascal Brand }
635b0104773SPascal Brand 
6367583c59eSCedric Chaumont /*
6377583c59eSCedric Chaumont  * Use of this function is deprecated
6387583c59eSCedric Chaumont  * new code SHOULD use the TEE_CloseAndDeletePersistentObject1 function instead
6397583c59eSCedric Chaumont  * These functions will be removed at some future major revision of
6407583c59eSCedric Chaumont  * this specification
6417583c59eSCedric Chaumont  */
642b0104773SPascal Brand void TEE_CloseAndDeletePersistentObject(TEE_ObjectHandle object)
643b0104773SPascal Brand {
644b0104773SPascal Brand 	TEE_Result res;
645b0104773SPascal Brand 
646b0104773SPascal Brand 	if (object == TEE_HANDLE_NULL)
647b0104773SPascal Brand 		return;
648b0104773SPascal Brand 
6497583c59eSCedric Chaumont 	res = TEE_CloseAndDeletePersistentObject1(object);
650b0104773SPascal Brand 
651b0104773SPascal Brand 	if (res != TEE_SUCCESS)
652b0104773SPascal Brand 		TEE_Panic(0);
653b0104773SPascal Brand }
654b0104773SPascal Brand 
6557583c59eSCedric Chaumont TEE_Result TEE_CloseAndDeletePersistentObject1(TEE_ObjectHandle object)
6567583c59eSCedric Chaumont {
6577583c59eSCedric Chaumont 	TEE_Result res;
6587583c59eSCedric Chaumont 
6597583c59eSCedric Chaumont 	if (object == TEE_HANDLE_NULL)
66046cfd17cSJens Wiklander 		return TEE_SUCCESS;
6617583c59eSCedric Chaumont 
6622c028fdeSJerome Forissier 	res = _utee_storage_obj_del((unsigned long)object);
6637583c59eSCedric Chaumont 
6647583c59eSCedric Chaumont 	if (res != TEE_SUCCESS && res != TEE_ERROR_STORAGE_NOT_AVAILABLE)
665b36311adSJerome Forissier 		TEE_Panic(res);
6667583c59eSCedric Chaumont 
6677583c59eSCedric Chaumont 	return res;
6687583c59eSCedric Chaumont }
6697583c59eSCedric Chaumont 
6707583c59eSCedric Chaumont 
671b0104773SPascal Brand TEE_Result TEE_RenamePersistentObject(TEE_ObjectHandle object,
672b0104773SPascal Brand 				      const void *newObjectID,
67379a3c601SCedric Chaumont 				      uint32_t newObjectIDLen)
674b0104773SPascal Brand {
675b0104773SPascal Brand 	TEE_Result res;
676b0104773SPascal Brand 
677a76bf53fSCedric Chaumont 	if (object == TEE_HANDLE_NULL) {
678a76bf53fSCedric Chaumont 		res = TEE_ERROR_ITEM_NOT_FOUND;
679a76bf53fSCedric Chaumont 		goto out;
680a76bf53fSCedric Chaumont 	}
681b0104773SPascal Brand 
6822c028fdeSJerome Forissier 	res = _utee_storage_obj_rename((unsigned long)object, newObjectID,
683e86f1266SJens Wiklander 				       newObjectIDLen);
684b0104773SPascal Brand 
685a76bf53fSCedric Chaumont out:
686a76bf53fSCedric Chaumont 	if (res != TEE_SUCCESS &&
687a76bf53fSCedric Chaumont 	    res != TEE_ERROR_ACCESS_CONFLICT &&
688a76bf53fSCedric Chaumont 	    res != TEE_ERROR_CORRUPT_OBJECT &&
689a76bf53fSCedric Chaumont 	    res != TEE_ERROR_STORAGE_NOT_AVAILABLE)
690b36311adSJerome Forissier 		TEE_Panic(res);
691b0104773SPascal Brand 
692b0104773SPascal Brand 	return res;
693b0104773SPascal Brand }
694b0104773SPascal Brand 
695b0104773SPascal Brand TEE_Result TEE_AllocatePersistentObjectEnumerator(TEE_ObjectEnumHandle *
696b0104773SPascal Brand 						  objectEnumerator)
697b0104773SPascal Brand {
698b0104773SPascal Brand 	TEE_Result res;
699e86f1266SJens Wiklander 	uint32_t oe;
700b0104773SPascal Brand 
7016915bbbbSJens Wiklander 	__utee_check_out_annotation(objectEnumerator,
7026915bbbbSJens Wiklander 				    sizeof(*objectEnumerator));
703b0104773SPascal Brand 
7042c028fdeSJerome Forissier 	res = _utee_storage_alloc_enum(&oe);
705b0104773SPascal Brand 
706b0104773SPascal Brand 	if (res != TEE_SUCCESS)
707e86f1266SJens Wiklander 		oe = TEE_HANDLE_NULL;
708e86f1266SJens Wiklander 
709e86f1266SJens Wiklander 	*objectEnumerator = (TEE_ObjectEnumHandle)(uintptr_t)oe;
710b0104773SPascal Brand 
71115cd3c30SCedric Chaumont 	if (res != TEE_SUCCESS &&
71215cd3c30SCedric Chaumont 	    res != TEE_ERROR_ACCESS_CONFLICT)
713b36311adSJerome Forissier 		TEE_Panic(res);
71415cd3c30SCedric Chaumont 
715b0104773SPascal Brand 	return res;
716b0104773SPascal Brand }
717b0104773SPascal Brand 
718b0104773SPascal Brand void TEE_FreePersistentObjectEnumerator(TEE_ObjectEnumHandle objectEnumerator)
719b0104773SPascal Brand {
720b0104773SPascal Brand 	TEE_Result res;
721b0104773SPascal Brand 
722b0104773SPascal Brand 	if (objectEnumerator == TEE_HANDLE_NULL)
723b0104773SPascal Brand 		return;
724b0104773SPascal Brand 
7252c028fdeSJerome Forissier 	res = _utee_storage_free_enum((unsigned long)objectEnumerator);
726b0104773SPascal Brand 
727b0104773SPascal Brand 	if (res != TEE_SUCCESS)
728b36311adSJerome Forissier 		TEE_Panic(res);
729b0104773SPascal Brand }
730b0104773SPascal Brand 
731b0104773SPascal Brand void TEE_ResetPersistentObjectEnumerator(TEE_ObjectEnumHandle objectEnumerator)
732b0104773SPascal Brand {
733b0104773SPascal Brand 	TEE_Result res;
734b0104773SPascal Brand 
735b0104773SPascal Brand 	if (objectEnumerator == TEE_HANDLE_NULL)
736b0104773SPascal Brand 		return;
737b0104773SPascal Brand 
7382c028fdeSJerome Forissier 	res = _utee_storage_reset_enum((unsigned long)objectEnumerator);
739b0104773SPascal Brand 
740b0104773SPascal Brand 	if (res != TEE_SUCCESS)
741b36311adSJerome Forissier 		TEE_Panic(res);
742b0104773SPascal Brand }
743b0104773SPascal Brand 
744b0104773SPascal Brand TEE_Result TEE_StartPersistentObjectEnumerator(TEE_ObjectEnumHandle
745b0104773SPascal Brand 					       objectEnumerator,
746b0104773SPascal Brand 					       uint32_t storageID)
747b0104773SPascal Brand {
748b0104773SPascal Brand 	TEE_Result res;
749b0104773SPascal Brand 
7502c028fdeSJerome Forissier 	res = _utee_storage_start_enum((unsigned long)objectEnumerator,
751e86f1266SJens Wiklander 				       storageID);
752b0104773SPascal Brand 
75315cd3c30SCedric Chaumont 	if (res != TEE_SUCCESS &&
75415cd3c30SCedric Chaumont 	    res != TEE_ERROR_ITEM_NOT_FOUND &&
75515cd3c30SCedric Chaumont 	    res != TEE_ERROR_CORRUPT_OBJECT &&
75615cd3c30SCedric Chaumont 	    res != TEE_ERROR_STORAGE_NOT_AVAILABLE)
757b36311adSJerome Forissier 		TEE_Panic(res);
758b0104773SPascal Brand 
759b0104773SPascal Brand 	return res;
760b0104773SPascal Brand }
761b0104773SPascal Brand 
762b0104773SPascal Brand TEE_Result TEE_GetNextPersistentObject(TEE_ObjectEnumHandle objectEnumerator,
763b0104773SPascal Brand 				       TEE_ObjectInfo *objectInfo,
76479a3c601SCedric Chaumont 				       void *objectID, uint32_t *objectIDLen)
765b0104773SPascal Brand {
76675d6a373SJens Wiklander 	struct utee_object_info info = { };
76775d6a373SJens Wiklander 	TEE_Result res = TEE_SUCCESS;
76875d6a373SJens Wiklander 	uint64_t len = 0;
769b0104773SPascal Brand 
7706915bbbbSJens Wiklander 	if (objectInfo)
7716915bbbbSJens Wiklander 		__utee_check_out_annotation(objectInfo, sizeof(*objectInfo));
7726915bbbbSJens Wiklander 	__utee_check_out_annotation(objectIDLen, sizeof(*objectIDLen));
77315cd3c30SCedric Chaumont 
7746915bbbbSJens Wiklander 	if (!objectID) {
77515cd3c30SCedric Chaumont 		res = TEE_ERROR_BAD_PARAMETERS;
77615cd3c30SCedric Chaumont 		goto out;
77715cd3c30SCedric Chaumont 	}
77815cd3c30SCedric Chaumont 
779e86f1266SJens Wiklander 	len = *objectIDLen;
7802c028fdeSJerome Forissier 	res = _utee_storage_next_enum((unsigned long)objectEnumerator,
78175d6a373SJens Wiklander 				      &info, objectID, &len);
78275d6a373SJens Wiklander 	if (objectInfo) {
78375d6a373SJens Wiklander 		objectInfo->objectType = info.obj_type;
784d372a47cSJens Wiklander 		objectInfo->objectSize = info.obj_size;
785d372a47cSJens Wiklander 		objectInfo->maxObjectSize = info.max_obj_size;
786d372a47cSJens Wiklander 		objectInfo->objectUsage = info.obj_usage;
787d372a47cSJens Wiklander 		objectInfo->dataSize = info.data_size;
788d372a47cSJens Wiklander 		objectInfo->dataPosition = info.data_pos;
789d372a47cSJens Wiklander 		objectInfo->handleFlags = info.handle_flags;
790d372a47cSJens Wiklander 	}
791d372a47cSJens Wiklander 	*objectIDLen = len;
792d372a47cSJens Wiklander 
793d372a47cSJens Wiklander out:
794d372a47cSJens Wiklander 	if (res != TEE_SUCCESS &&
795d372a47cSJens Wiklander 	    res != TEE_ERROR_ITEM_NOT_FOUND &&
796d372a47cSJens Wiklander 	    res != TEE_ERROR_CORRUPT_OBJECT &&
797d372a47cSJens Wiklander 	    res != TEE_ERROR_STORAGE_NOT_AVAILABLE)
798d372a47cSJens Wiklander 		TEE_Panic(res);
799d372a47cSJens Wiklander 
800d372a47cSJens Wiklander 	return res;
801d372a47cSJens Wiklander }
802d372a47cSJens Wiklander 
803d372a47cSJens Wiklander TEE_Result
804d372a47cSJens Wiklander __GP11_TEE_GetNextPersistentObject(TEE_ObjectEnumHandle objectEnumerator,
805d372a47cSJens Wiklander 				   __GP11_TEE_ObjectInfo *objectInfo,
806d372a47cSJens Wiklander 				   void *objectID, uint32_t *objectIDLen)
807d372a47cSJens Wiklander {
808d372a47cSJens Wiklander 	struct utee_object_info info = { };
809d372a47cSJens Wiklander 	TEE_Result res = TEE_SUCCESS;
810d372a47cSJens Wiklander 	uint64_t len = 0;
811d372a47cSJens Wiklander 
812d372a47cSJens Wiklander 	if (objectInfo)
813d372a47cSJens Wiklander 		__utee_check_out_annotation(objectInfo, sizeof(*objectInfo));
814d372a47cSJens Wiklander 	__utee_check_out_annotation(objectIDLen, sizeof(*objectIDLen));
815d372a47cSJens Wiklander 
816d372a47cSJens Wiklander 	if (!objectID) {
817d372a47cSJens Wiklander 		res = TEE_ERROR_BAD_PARAMETERS;
818d372a47cSJens Wiklander 		goto out;
819d372a47cSJens Wiklander 	}
820d372a47cSJens Wiklander 
821d372a47cSJens Wiklander 	len = *objectIDLen;
822d372a47cSJens Wiklander 	res = _utee_storage_next_enum((unsigned long)objectEnumerator,
823d372a47cSJens Wiklander 				      &info, objectID, &len);
824d372a47cSJens Wiklander 	if (objectInfo) {
825d372a47cSJens Wiklander 		objectInfo->objectType = info.obj_type;
82675d6a373SJens Wiklander 		objectInfo->keySize = info.obj_size;
82775d6a373SJens Wiklander 		objectInfo->maxKeySize = info.max_obj_size;
82875d6a373SJens Wiklander 		objectInfo->objectUsage = info.obj_usage;
82975d6a373SJens Wiklander 		objectInfo->dataSize = info.data_size;
83075d6a373SJens Wiklander 		objectInfo->dataPosition = info.data_pos;
83175d6a373SJens Wiklander 		objectInfo->handleFlags = info.handle_flags;
83275d6a373SJens Wiklander 	}
833e86f1266SJens Wiklander 	*objectIDLen = len;
834b0104773SPascal Brand 
83515cd3c30SCedric Chaumont out:
83615cd3c30SCedric Chaumont 	if (res != TEE_SUCCESS &&
83715cd3c30SCedric Chaumont 	    res != TEE_ERROR_ITEM_NOT_FOUND &&
83815cd3c30SCedric Chaumont 	    res != TEE_ERROR_CORRUPT_OBJECT &&
83915cd3c30SCedric Chaumont 	    res != TEE_ERROR_STORAGE_NOT_AVAILABLE)
840b36311adSJerome Forissier 		TEE_Panic(res);
841b0104773SPascal Brand 
842b0104773SPascal Brand 	return res;
843b0104773SPascal Brand }
844b0104773SPascal Brand 
845b0104773SPascal Brand /* Data and Key Storage API  - Data Stream Access Functions */
846b0104773SPascal Brand 
847b0104773SPascal Brand TEE_Result TEE_ReadObjectData(TEE_ObjectHandle object, void *buffer,
84879a3c601SCedric Chaumont 			      uint32_t size, uint32_t *count)
849b0104773SPascal Brand {
850b0104773SPascal Brand 	TEE_Result res;
851e86f1266SJens Wiklander 	uint64_t cnt64;
852b0104773SPascal Brand 
853ae1289baSCedric Chaumont 	if (object == TEE_HANDLE_NULL) {
854ae1289baSCedric Chaumont 		res = TEE_ERROR_BAD_PARAMETERS;
855ae1289baSCedric Chaumont 		goto out;
856ae1289baSCedric Chaumont 	}
8576915bbbbSJens Wiklander 	__utee_check_out_annotation(count, sizeof(*count));
858b0104773SPascal Brand 
859e86f1266SJens Wiklander 	cnt64 = *count;
8602c028fdeSJerome Forissier 	res = _utee_storage_obj_read((unsigned long)object, buffer, size,
861e86f1266SJens Wiklander 				     &cnt64);
862e86f1266SJens Wiklander 	*count = cnt64;
863b0104773SPascal Brand 
864ae1289baSCedric Chaumont out:
865ae1289baSCedric Chaumont 	if (res != TEE_SUCCESS &&
866ae1289baSCedric Chaumont 	    res != TEE_ERROR_CORRUPT_OBJECT &&
867ae1289baSCedric Chaumont 	    res != TEE_ERROR_STORAGE_NOT_AVAILABLE)
868b36311adSJerome Forissier 		TEE_Panic(res);
869b0104773SPascal Brand 
870b0104773SPascal Brand 	return res;
871b0104773SPascal Brand }
872b0104773SPascal Brand 
8738f07fe6fSJerome Forissier TEE_Result TEE_WriteObjectData(TEE_ObjectHandle object, const void *buffer,
87479a3c601SCedric Chaumont 			       uint32_t size)
875b0104773SPascal Brand {
876b0104773SPascal Brand 	TEE_Result res;
877b0104773SPascal Brand 
878ae1289baSCedric Chaumont 	if (object == TEE_HANDLE_NULL) {
879ae1289baSCedric Chaumont 		res = TEE_ERROR_BAD_PARAMETERS;
880ae1289baSCedric Chaumont 		goto out;
881ae1289baSCedric Chaumont 	}
882ae1289baSCedric Chaumont 
883ae1289baSCedric Chaumont 	if (size > TEE_DATA_MAX_POSITION) {
884ae1289baSCedric Chaumont 		res = TEE_ERROR_OVERFLOW;
885ae1289baSCedric Chaumont 		goto out;
886ae1289baSCedric Chaumont 	}
887b0104773SPascal Brand 
8882c028fdeSJerome Forissier 	res = _utee_storage_obj_write((unsigned long)object, buffer, size);
889b0104773SPascal Brand 
890ae1289baSCedric Chaumont out:
891ae1289baSCedric Chaumont 	if (res != TEE_SUCCESS &&
892ae1289baSCedric Chaumont 	    res != TEE_ERROR_STORAGE_NO_SPACE &&
893ae1289baSCedric Chaumont 	    res != TEE_ERROR_OVERFLOW &&
894ae1289baSCedric Chaumont 	    res != TEE_ERROR_CORRUPT_OBJECT &&
895ae1289baSCedric Chaumont 	    res != TEE_ERROR_STORAGE_NOT_AVAILABLE)
896b36311adSJerome Forissier 		TEE_Panic(res);
897b0104773SPascal Brand 
898b0104773SPascal Brand 	return res;
899b0104773SPascal Brand }
900b0104773SPascal Brand 
901b0104773SPascal Brand TEE_Result TEE_TruncateObjectData(TEE_ObjectHandle object, uint32_t size)
902b0104773SPascal Brand {
903b0104773SPascal Brand 	TEE_Result res;
904b0104773SPascal Brand 
905ae1289baSCedric Chaumont 	if (object == TEE_HANDLE_NULL) {
906ae1289baSCedric Chaumont 		res = TEE_ERROR_BAD_PARAMETERS;
907ae1289baSCedric Chaumont 		goto out;
908ae1289baSCedric Chaumont 	}
909b0104773SPascal Brand 
9102c028fdeSJerome Forissier 	res = _utee_storage_obj_trunc((unsigned long)object, size);
911b0104773SPascal Brand 
912ae1289baSCedric Chaumont out:
913ae1289baSCedric Chaumont 	if (res != TEE_SUCCESS &&
914ae1289baSCedric Chaumont 	    res != TEE_ERROR_STORAGE_NO_SPACE &&
915ae1289baSCedric Chaumont 	    res != TEE_ERROR_CORRUPT_OBJECT &&
916ae1289baSCedric Chaumont 	    res != TEE_ERROR_STORAGE_NOT_AVAILABLE)
917b36311adSJerome Forissier 		TEE_Panic(res);
918b0104773SPascal Brand 
919b0104773SPascal Brand 	return res;
920b0104773SPascal Brand }
921b0104773SPascal Brand 
922b0104773SPascal Brand TEE_Result TEE_SeekObjectData(TEE_ObjectHandle object, int32_t offset,
923b0104773SPascal Brand 			      TEE_Whence whence)
924b0104773SPascal Brand {
92575d6a373SJens Wiklander 	struct utee_object_info info = { };
92675d6a373SJens Wiklander 	TEE_Result res = TEE_SUCCESS;
927b0104773SPascal Brand 
928ae1289baSCedric Chaumont 	if (object == TEE_HANDLE_NULL) {
929ae1289baSCedric Chaumont 		res = TEE_ERROR_BAD_PARAMETERS;
930ae1289baSCedric Chaumont 		goto out;
931ae1289baSCedric Chaumont 	}
932b0104773SPascal Brand 
9332c028fdeSJerome Forissier 	res = _utee_cryp_obj_get_info((unsigned long)object, &info);
934b0104773SPascal Brand 	if (res != TEE_SUCCESS)
935ae1289baSCedric Chaumont 		goto out;
936b0104773SPascal Brand 
937b0104773SPascal Brand 	switch (whence) {
938b0104773SPascal Brand 	case TEE_DATA_SEEK_SET:
939ae1289baSCedric Chaumont 		if (offset > 0 && (uint32_t)offset > TEE_DATA_MAX_POSITION) {
940ae1289baSCedric Chaumont 			res = TEE_ERROR_OVERFLOW;
941ae1289baSCedric Chaumont 			goto out;
942ae1289baSCedric Chaumont 		}
943b0104773SPascal Brand 		break;
944b0104773SPascal Brand 	case TEE_DATA_SEEK_CUR:
945b0104773SPascal Brand 		if (offset > 0 &&
94675d6a373SJens Wiklander 		    ((uint32_t)offset + info.data_pos > TEE_DATA_MAX_POSITION ||
94775d6a373SJens Wiklander 		     (uint32_t)offset + info.data_pos < info.data_pos)) {
948ae1289baSCedric Chaumont 			res = TEE_ERROR_OVERFLOW;
949ae1289baSCedric Chaumont 			goto out;
950ae1289baSCedric Chaumont 		}
951b0104773SPascal Brand 		break;
952b0104773SPascal Brand 	case TEE_DATA_SEEK_END:
953b0104773SPascal Brand 		if (offset > 0 &&
95475d6a373SJens Wiklander 		    ((uint32_t)offset + info.data_size >
95575d6a373SJens Wiklander 		     TEE_DATA_MAX_POSITION ||
95675d6a373SJens Wiklander 		     (uint32_t)offset + info.data_size < info.data_size)) {
957ae1289baSCedric Chaumont 			res = TEE_ERROR_OVERFLOW;
958ae1289baSCedric Chaumont 			goto out;
959ae1289baSCedric Chaumont 		}
960b0104773SPascal Brand 		break;
961b0104773SPascal Brand 	default:
962ae1289baSCedric Chaumont 		res = TEE_ERROR_ITEM_NOT_FOUND;
963ae1289baSCedric Chaumont 		goto out;
964b0104773SPascal Brand 	}
965b0104773SPascal Brand 
9662c028fdeSJerome Forissier 	res = _utee_storage_obj_seek((unsigned long)object, offset, whence);
967b0104773SPascal Brand 
968ae1289baSCedric Chaumont out:
969ae1289baSCedric Chaumont 	if (res != TEE_SUCCESS &&
970ae1289baSCedric Chaumont 	    res != TEE_ERROR_OVERFLOW &&
971ae1289baSCedric Chaumont 	    res != TEE_ERROR_CORRUPT_OBJECT &&
972ae1289baSCedric Chaumont 	    res != TEE_ERROR_STORAGE_NOT_AVAILABLE)
973b36311adSJerome Forissier 		TEE_Panic(res);
974b0104773SPascal Brand 
975b0104773SPascal Brand 	return res;
976b0104773SPascal Brand }
977