xref: /optee_os/lib/libutee/tee_api_objects.c (revision 41af5286e515d36d8b2852c73cbe6b2881b0d34e)
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,
19991c84248SJens 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 
23391c84248SJens Wiklander TEE_Result __GP11_TEE_GetObjectBufferAttribute(TEE_ObjectHandle object,
23491c84248SJens Wiklander 					       uint32_t attributeID,
23591c84248SJens Wiklander 					       void *buffer, uint32_t *size)
23691c84248SJens Wiklander {
23791c84248SJens Wiklander 	TEE_Result res = TEE_SUCCESS;
23891c84248SJens Wiklander 	size_t l = 0;
23991c84248SJens Wiklander 
24091c84248SJens Wiklander 	__utee_check_inout_annotation(size, sizeof(*size));
24191c84248SJens Wiklander 	l = *size;
24291c84248SJens Wiklander 	res = TEE_GetObjectBufferAttribute(object, attributeID, buffer, &l);
24391c84248SJens Wiklander 	*size = l;
24491c84248SJens Wiklander 	return res;
24591c84248SJens Wiklander }
24691c84248SJens 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,
309edc817baSJens Wiklander 				       uint32_t maxObjectSize,
310edc817baSJens Wiklander 				       TEE_ObjectHandle *object)
311edc817baSJens Wiklander {
312edc817baSJens Wiklander 	if (objectType == TEE_TYPE_DATA)
313edc817baSJens Wiklander 		return TEE_ERROR_NOT_SUPPORTED;
314edc817baSJens Wiklander 
315edc817baSJens Wiklander 	return __GP11_TEE_AllocateTransientObject(objectType, maxObjectSize,
316edc817baSJens Wiklander 						  object);
317edc817baSJens Wiklander }
318edc817baSJens Wiklander 
319edc817baSJens Wiklander TEE_Result __GP11_TEE_AllocateTransientObject(TEE_ObjectType objectType,
32079a3c601SCedric Chaumont 					      uint32_t maxKeySize,
321b0104773SPascal Brand 					      TEE_ObjectHandle *object)
322b0104773SPascal Brand {
323b0104773SPascal Brand 	TEE_Result res;
324b0104773SPascal Brand 	uint32_t obj;
325b0104773SPascal Brand 
3266915bbbbSJens Wiklander 	__utee_check_out_annotation(object, sizeof(*object));
3276915bbbbSJens Wiklander 
3282c028fdeSJerome Forissier 	res = _utee_cryp_obj_alloc(objectType, maxKeySize, &obj);
329aeb0d927SCedric Chaumont 
330aeb0d927SCedric Chaumont 	if (res != TEE_SUCCESS &&
331aeb0d927SCedric Chaumont 	    res != TEE_ERROR_OUT_OF_MEMORY &&
332aeb0d927SCedric Chaumont 	    res != TEE_ERROR_NOT_SUPPORTED)
333b36311adSJerome Forissier 		TEE_Panic(res);
334aeb0d927SCedric Chaumont 
335b0104773SPascal Brand 	if (res == TEE_SUCCESS)
336e86f1266SJens Wiklander 		*object = (TEE_ObjectHandle)(uintptr_t)obj;
3370ed6a6caSCedric Chaumont 
338b0104773SPascal Brand 	return res;
339b0104773SPascal Brand }
340b0104773SPascal Brand 
341b0104773SPascal Brand void TEE_FreeTransientObject(TEE_ObjectHandle object)
342b0104773SPascal Brand {
34375d6a373SJens Wiklander 	struct utee_object_info info = { };
34475d6a373SJens Wiklander 	TEE_Result res = TEE_SUCCESS;
345b0104773SPascal Brand 
346b0104773SPascal Brand 	if (object == TEE_HANDLE_NULL)
347b0104773SPascal Brand 		return;
348b0104773SPascal Brand 
3492c028fdeSJerome Forissier 	res = _utee_cryp_obj_get_info((unsigned long)object, &info);
350b0104773SPascal Brand 	if (res != TEE_SUCCESS)
351b36311adSJerome Forissier 		TEE_Panic(res);
352b0104773SPascal Brand 
35375d6a373SJens Wiklander 	if ((info.handle_flags & TEE_HANDLE_FLAG_PERSISTENT) != 0)
354b0104773SPascal Brand 		TEE_Panic(0);
355b0104773SPascal Brand 
3562c028fdeSJerome Forissier 	res = _utee_cryp_obj_close((unsigned long)object);
357b0104773SPascal Brand 	if (res != TEE_SUCCESS)
358b36311adSJerome Forissier 		TEE_Panic(res);
359b0104773SPascal Brand }
360b0104773SPascal Brand 
361b0104773SPascal Brand void TEE_ResetTransientObject(TEE_ObjectHandle object)
362b0104773SPascal Brand {
36375d6a373SJens Wiklander 	struct utee_object_info info = { };
36475d6a373SJens Wiklander 	TEE_Result res = TEE_SUCCESS;
365b0104773SPascal Brand 
366b0104773SPascal Brand 	if (object == TEE_HANDLE_NULL)
367b0104773SPascal Brand 		return;
368b0104773SPascal Brand 
3692c028fdeSJerome Forissier 	res = _utee_cryp_obj_get_info((unsigned long)object, &info);
370b0104773SPascal Brand 	if (res != TEE_SUCCESS)
371b36311adSJerome Forissier 		TEE_Panic(res);
372b0104773SPascal Brand 
37375d6a373SJens Wiklander 	if ((info.handle_flags & TEE_HANDLE_FLAG_PERSISTENT) != 0)
374b0104773SPascal Brand 		TEE_Panic(0);
375b0104773SPascal Brand 
3762c028fdeSJerome Forissier 	res = _utee_cryp_obj_reset((unsigned long)object);
377b0104773SPascal Brand 	if (res != TEE_SUCCESS)
378b36311adSJerome Forissier 		TEE_Panic(res);
379b0104773SPascal Brand }
380b0104773SPascal Brand 
381b0104773SPascal Brand TEE_Result TEE_PopulateTransientObject(TEE_ObjectHandle object,
3828f07fe6fSJerome Forissier 				       const TEE_Attribute *attrs,
383b0104773SPascal Brand 				       uint32_t attrCount)
384b0104773SPascal Brand {
385e86f1266SJens Wiklander 	struct utee_attribute ua[attrCount];
38675d6a373SJens Wiklander 	struct utee_object_info info = { };
38775d6a373SJens Wiklander 	TEE_Result res = TEE_SUCCESS;
388b0104773SPascal Brand 
3896915bbbbSJens Wiklander 	__utee_check_attr_in_annotation(attrs, attrCount);
3906915bbbbSJens Wiklander 
3912c028fdeSJerome Forissier 	res = _utee_cryp_obj_get_info((unsigned long)object, &info);
392b0104773SPascal Brand 	if (res != TEE_SUCCESS)
393b36311adSJerome Forissier 		TEE_Panic(res);
394b0104773SPascal Brand 
395b0104773SPascal Brand 	/* Must be a transient object */
39675d6a373SJens Wiklander 	if ((info.handle_flags & TEE_HANDLE_FLAG_PERSISTENT) != 0)
397b0104773SPascal Brand 		TEE_Panic(0);
398b0104773SPascal Brand 
399b0104773SPascal Brand 	/* Must not be initialized already */
40075d6a373SJens Wiklander 	if ((info.handle_flags & TEE_HANDLE_FLAG_INITIALIZED) != 0)
401b0104773SPascal Brand 		TEE_Panic(0);
402b0104773SPascal Brand 
403e86f1266SJens Wiklander 	__utee_from_attr(ua, attrs, attrCount);
4042c028fdeSJerome Forissier 	res = _utee_cryp_obj_populate((unsigned long)object, ua, attrCount);
405b0104773SPascal Brand 	if (res != TEE_SUCCESS && res != TEE_ERROR_BAD_PARAMETERS)
406b0104773SPascal Brand 		TEE_Panic(res);
407b0104773SPascal Brand 	return res;
408b0104773SPascal Brand }
409b0104773SPascal Brand 
4104f4374c8SJens Wiklander TEE_Result __GP11_TEE_PopulateTransientObject(TEE_ObjectHandle object,
4114f4374c8SJens Wiklander 					      const __GP11_TEE_Attribute *attrs,
4124f4374c8SJens Wiklander 					      uint32_t attrCount)
4134f4374c8SJens Wiklander {
4144f4374c8SJens Wiklander 	struct utee_attribute ua[attrCount];
4154f4374c8SJens Wiklander 	struct utee_object_info info = { };
4164f4374c8SJens Wiklander 	TEE_Result res = TEE_SUCCESS;
4174f4374c8SJens Wiklander 
4184f4374c8SJens Wiklander 	__utee_check_gp11_attr_in_annotation(attrs, attrCount);
4194f4374c8SJens Wiklander 
4204f4374c8SJens Wiklander 	res = _utee_cryp_obj_get_info((unsigned long)object, &info);
4214f4374c8SJens Wiklander 	if (res != TEE_SUCCESS)
4224f4374c8SJens Wiklander 		TEE_Panic(res);
4234f4374c8SJens Wiklander 
4244f4374c8SJens Wiklander 	/* Must be a transient object */
4254f4374c8SJens Wiklander 	if ((info.handle_flags & TEE_HANDLE_FLAG_PERSISTENT) != 0)
4264f4374c8SJens Wiklander 		TEE_Panic(0);
4274f4374c8SJens Wiklander 
4284f4374c8SJens Wiklander 	/* Must not be initialized already */
4294f4374c8SJens Wiklander 	if ((info.handle_flags & TEE_HANDLE_FLAG_INITIALIZED) != 0)
4304f4374c8SJens Wiklander 		TEE_Panic(0);
4314f4374c8SJens Wiklander 
4324f4374c8SJens Wiklander 	__utee_from_gp11_attr(ua, attrs, attrCount);
4334f4374c8SJens Wiklander 	res = _utee_cryp_obj_populate((unsigned long)object, ua, attrCount);
4344f4374c8SJens Wiklander 	if (res != TEE_SUCCESS && res != TEE_ERROR_BAD_PARAMETERS)
4354f4374c8SJens Wiklander 		TEE_Panic(res);
4364f4374c8SJens Wiklander 	return res;
4374f4374c8SJens Wiklander }
4384f4374c8SJens Wiklander 
439b0104773SPascal Brand void TEE_InitRefAttribute(TEE_Attribute *attr, uint32_t attributeID,
440a62171f8SJens Wiklander 			  const void *buffer, size_t length)
441b0104773SPascal Brand {
4426915bbbbSJens Wiklander 	__utee_check_out_annotation(attr, sizeof(*attr));
4436915bbbbSJens Wiklander 
444b9416909SJens Wiklander 	if ((attributeID & TEE_ATTR_FLAG_VALUE) != 0)
445b0104773SPascal Brand 		TEE_Panic(0);
446b0104773SPascal Brand 	attr->attributeID = attributeID;
4478f07fe6fSJerome Forissier 	attr->content.ref.buffer = (void *)buffer;
448b0104773SPascal Brand 	attr->content.ref.length = length;
449b0104773SPascal Brand }
450b0104773SPascal Brand 
4514f4374c8SJens Wiklander void __GP11_TEE_InitRefAttribute(__GP11_TEE_Attribute *attr,
4524f4374c8SJens Wiklander 				 uint32_t attributeID,
4534f4374c8SJens Wiklander 				 const void *buffer, uint32_t length)
4544f4374c8SJens Wiklander {
4554f4374c8SJens Wiklander 	__utee_check_out_annotation(attr, sizeof(*attr));
4564f4374c8SJens Wiklander 
4574f4374c8SJens Wiklander 	if ((attributeID & TEE_ATTR_FLAG_VALUE) != 0)
4584f4374c8SJens Wiklander 		TEE_Panic(0);
4594f4374c8SJens Wiklander 	attr->attributeID = attributeID;
4604f4374c8SJens Wiklander 	attr->content.ref.buffer = (void *)buffer;
4614f4374c8SJens Wiklander 	attr->content.ref.length = length;
4624f4374c8SJens Wiklander }
4634f4374c8SJens Wiklander 
464b0104773SPascal Brand void TEE_InitValueAttribute(TEE_Attribute *attr, uint32_t attributeID,
465b0104773SPascal Brand 			    uint32_t a, uint32_t b)
466b0104773SPascal Brand {
4676915bbbbSJens Wiklander 	__utee_check_out_annotation(attr, sizeof(*attr));
4686915bbbbSJens Wiklander 
469b9416909SJens Wiklander 	if ((attributeID & TEE_ATTR_FLAG_VALUE) == 0)
470b0104773SPascal Brand 		TEE_Panic(0);
471b0104773SPascal Brand 	attr->attributeID = attributeID;
472b0104773SPascal Brand 	attr->content.value.a = a;
473b0104773SPascal Brand 	attr->content.value.b = b;
474b0104773SPascal Brand }
475b0104773SPascal Brand 
4764f4374c8SJens Wiklander void __GP11_TEE_InitValueAttribute(__GP11_TEE_Attribute *attr,
4774f4374c8SJens Wiklander 				   uint32_t attributeID,
4784f4374c8SJens Wiklander 				   uint32_t a, uint32_t b)
4794f4374c8SJens Wiklander {
4804f4374c8SJens Wiklander 	__utee_check_out_annotation(attr, sizeof(*attr));
4814f4374c8SJens Wiklander 
4824f4374c8SJens Wiklander 	if ((attributeID & TEE_ATTR_FLAG_VALUE) == 0)
4834f4374c8SJens Wiklander 		TEE_Panic(0);
4844f4374c8SJens Wiklander 	attr->attributeID = attributeID;
4854f4374c8SJens Wiklander 	attr->content.value.a = a;
4864f4374c8SJens Wiklander 	attr->content.value.b = b;
4874f4374c8SJens Wiklander }
4884f4374c8SJens Wiklander 
4897583c59eSCedric Chaumont /*
4907583c59eSCedric Chaumont  * Use of this function is deprecated
4917583c59eSCedric Chaumont  * new code SHOULD use the TEE_CopyObjectAttributes1 function instead
4927583c59eSCedric Chaumont  * These functions will be removed at some future major revision of
4937583c59eSCedric Chaumont  * this specification
4947583c59eSCedric Chaumont  */
495b0104773SPascal Brand void TEE_CopyObjectAttributes(TEE_ObjectHandle destObject,
496b0104773SPascal Brand 			      TEE_ObjectHandle srcObject)
497b0104773SPascal Brand {
49875d6a373SJens Wiklander 	struct utee_object_info src_info = { };
49975d6a373SJens Wiklander 	TEE_Result res = TEE_SUCCESS;
5007583c59eSCedric Chaumont 
5012c028fdeSJerome Forissier 	res = _utee_cryp_obj_get_info((unsigned long)srcObject, &src_info);
50275d6a373SJens Wiklander 	if (src_info.obj_type == TEE_TYPE_CORRUPTED_OBJECT)
5037583c59eSCedric Chaumont 		return;
5047583c59eSCedric Chaumont 
5057583c59eSCedric Chaumont 	res = TEE_CopyObjectAttributes1(destObject, srcObject);
5067583c59eSCedric Chaumont 	if (res != TEE_SUCCESS)
507b36311adSJerome Forissier 		TEE_Panic(res);
5087583c59eSCedric Chaumont }
5097583c59eSCedric Chaumont 
5107583c59eSCedric Chaumont TEE_Result TEE_CopyObjectAttributes1(TEE_ObjectHandle destObject,
5117583c59eSCedric Chaumont 			      TEE_ObjectHandle srcObject)
5127583c59eSCedric Chaumont {
51375d6a373SJens Wiklander 	struct utee_object_info dst_info = { };
51475d6a373SJens Wiklander 	struct utee_object_info src_info = { };
51575d6a373SJens Wiklander 	TEE_Result res = TEE_SUCCESS;
516b0104773SPascal Brand 
5172c028fdeSJerome Forissier 	res = _utee_cryp_obj_get_info((unsigned long)destObject, &dst_info);
518b0104773SPascal Brand 	if (res != TEE_SUCCESS)
519a2e9a830SCedric Chaumont 		goto exit;
520b0104773SPascal Brand 
5212c028fdeSJerome Forissier 	res = _utee_cryp_obj_get_info((unsigned long)srcObject, &src_info);
522b0104773SPascal Brand 	if (res != TEE_SUCCESS)
523a2e9a830SCedric Chaumont 		goto exit;
524b0104773SPascal Brand 
52575d6a373SJens Wiklander 	if (!(src_info.handle_flags & TEE_HANDLE_FLAG_INITIALIZED))
526b0104773SPascal Brand 		TEE_Panic(0);
527a2e9a830SCedric Chaumont 
52875d6a373SJens Wiklander 	if ((dst_info.handle_flags & TEE_HANDLE_FLAG_PERSISTENT))
529b0104773SPascal Brand 		TEE_Panic(0);
530a2e9a830SCedric Chaumont 
53175d6a373SJens Wiklander 	if ((dst_info.handle_flags & TEE_HANDLE_FLAG_INITIALIZED))
532b0104773SPascal Brand 		TEE_Panic(0);
533b0104773SPascal Brand 
5342c028fdeSJerome Forissier 	res = _utee_cryp_obj_copy((unsigned long)destObject,
535e86f1266SJens Wiklander 				  (unsigned long)srcObject);
5367583c59eSCedric Chaumont 
537a2e9a830SCedric Chaumont exit:
538a2e9a830SCedric Chaumont 	if (res != TEE_SUCCESS &&
539a2e9a830SCedric Chaumont 	    res != TEE_ERROR_CORRUPT_OBJECT &&
540a2e9a830SCedric Chaumont 	    res != TEE_ERROR_STORAGE_NOT_AVAILABLE)
541a2e9a830SCedric Chaumont 		TEE_Panic(res);
5427583c59eSCedric Chaumont 
5437583c59eSCedric Chaumont 	return res;
544b0104773SPascal Brand }
545b0104773SPascal Brand 
546b0104773SPascal Brand TEE_Result TEE_GenerateKey(TEE_ObjectHandle object, uint32_t keySize,
5478f07fe6fSJerome Forissier 			   const TEE_Attribute *params, uint32_t paramCount)
548b0104773SPascal Brand {
549b0104773SPascal Brand 	TEE_Result res;
550e86f1266SJens Wiklander 	struct utee_attribute ua[paramCount];
551b0104773SPascal Brand 
5526915bbbbSJens Wiklander 	__utee_check_attr_in_annotation(params, paramCount);
5536915bbbbSJens Wiklander 
554e86f1266SJens Wiklander 	__utee_from_attr(ua, params, paramCount);
5552c028fdeSJerome Forissier 	res = _utee_cryp_obj_generate_key((unsigned long)object, keySize,
556e86f1266SJens Wiklander 					  ua, paramCount);
557b0104773SPascal Brand 
558aeb0d927SCedric Chaumont 	if (res != TEE_SUCCESS && res != TEE_ERROR_BAD_PARAMETERS)
559b36311adSJerome Forissier 		TEE_Panic(res);
560b0104773SPascal Brand 
561b0104773SPascal Brand 	return res;
562b0104773SPascal Brand }
563b0104773SPascal Brand 
5644f4374c8SJens Wiklander TEE_Result __GP11_TEE_GenerateKey(TEE_ObjectHandle object, uint32_t keySize,
5654f4374c8SJens Wiklander 				  const __GP11_TEE_Attribute *params,
5664f4374c8SJens Wiklander 				  uint32_t paramCount)
5674f4374c8SJens Wiklander {
5684f4374c8SJens Wiklander 	TEE_Result res = TEE_SUCCESS;
5694f4374c8SJens Wiklander 	struct utee_attribute ua[paramCount];
5704f4374c8SJens Wiklander 
5714f4374c8SJens Wiklander 	__utee_check_gp11_attr_in_annotation(params, paramCount);
5724f4374c8SJens Wiklander 
5734f4374c8SJens Wiklander 	__utee_from_gp11_attr(ua, params, paramCount);
5744f4374c8SJens Wiklander 	res = _utee_cryp_obj_generate_key((unsigned long)object, keySize,
5754f4374c8SJens Wiklander 					  ua, paramCount);
5764f4374c8SJens Wiklander 
5774f4374c8SJens Wiklander 	if (res != TEE_SUCCESS && res != TEE_ERROR_BAD_PARAMETERS)
5784f4374c8SJens Wiklander 		TEE_Panic(res);
5794f4374c8SJens Wiklander 
5804f4374c8SJens Wiklander 	return res;
5814f4374c8SJens Wiklander }
5824f4374c8SJens Wiklander 
583b0104773SPascal Brand /* Data and Key Storage API  - Persistent Object Functions */
584b0104773SPascal Brand 
5858f07fe6fSJerome Forissier TEE_Result TEE_OpenPersistentObject(uint32_t storageID, const void *objectID,
58664a530f9SJens Wiklander 				    size_t objectIDLen, uint32_t flags,
587b0104773SPascal Brand 				    TEE_ObjectHandle *object)
588b0104773SPascal Brand {
5899b520646SCedric Chaumont 	TEE_Result res;
590e86f1266SJens Wiklander 	uint32_t obj;
591b0104773SPascal Brand 
5922138a6f8SStefan Schmidt 	__utee_check_out_annotation(object, sizeof(*object));
5932138a6f8SStefan Schmidt 
5942c028fdeSJerome Forissier 	res = _utee_storage_obj_open(storageID, objectID, objectIDLen, flags,
595e86f1266SJens Wiklander 				     &obj);
596e86f1266SJens Wiklander 	if (res == TEE_SUCCESS)
597e86f1266SJens Wiklander 		*object = (TEE_ObjectHandle)(uintptr_t)obj;
5989b520646SCedric Chaumont 
5999b520646SCedric Chaumont 	if (res != TEE_SUCCESS &&
6009b520646SCedric Chaumont 	    res != TEE_ERROR_ITEM_NOT_FOUND &&
6019b520646SCedric Chaumont 	    res != TEE_ERROR_ACCESS_CONFLICT &&
6029b520646SCedric Chaumont 	    res != TEE_ERROR_OUT_OF_MEMORY &&
6039b520646SCedric Chaumont 	    res != TEE_ERROR_CORRUPT_OBJECT &&
6049b520646SCedric Chaumont 	    res != TEE_ERROR_STORAGE_NOT_AVAILABLE)
605b36311adSJerome Forissier 		TEE_Panic(res);
606b0104773SPascal Brand 
607172d637bSCedric Auger 	if (res != TEE_SUCCESS)
60869a3d6beSDaniel Glöckner 		*object = TEE_HANDLE_NULL;
60969a3d6beSDaniel Glöckner 
6109b520646SCedric Chaumont 	return res;
611b0104773SPascal Brand }
612b0104773SPascal Brand 
61364a530f9SJens Wiklander TEE_Result __GP11_TEE_OpenPersistentObject(uint32_t storageID,
61464a530f9SJens Wiklander 					   const void *objectID,
61564a530f9SJens Wiklander 					   uint32_t objectIDLen, uint32_t flags,
61664a530f9SJens Wiklander 					   TEE_ObjectHandle *object)
61764a530f9SJens Wiklander {
61864a530f9SJens Wiklander 	return TEE_OpenPersistentObject(storageID, objectID, objectIDLen,
61964a530f9SJens Wiklander 					flags, object);
62064a530f9SJens Wiklander }
62164a530f9SJens Wiklander 
6228f07fe6fSJerome Forissier TEE_Result TEE_CreatePersistentObject(uint32_t storageID, const void *objectID,
623f22e1655SJens Wiklander 				      size_t objectIDLen, uint32_t flags,
624b0104773SPascal Brand 				      TEE_ObjectHandle attributes,
625b0104773SPascal Brand 				      const void *initialData,
626f22e1655SJens Wiklander 				      size_t initialDataLen,
627b0104773SPascal Brand 				      TEE_ObjectHandle *object)
628b0104773SPascal Brand {
629f22e1655SJens Wiklander 	TEE_Result res = TEE_SUCCESS;
630f22e1655SJens Wiklander 	uint32_t *obj_ptr = NULL;
631f22e1655SJens Wiklander 	uint32_t obj = 0;
632b0104773SPascal Brand 
633f22e1655SJens Wiklander 	if (object) {
6346915bbbbSJens Wiklander 		__utee_check_out_annotation(object, sizeof(*object));
635f22e1655SJens Wiklander 		obj_ptr = &obj;
636f22e1655SJens Wiklander 	}
637b0104773SPascal Brand 
6382c028fdeSJerome Forissier 	res = _utee_storage_obj_create(storageID, objectID, objectIDLen, flags,
639e86f1266SJens Wiklander 				       (unsigned long)attributes, initialData,
640f22e1655SJens Wiklander 				       initialDataLen, obj_ptr);
641172d637bSCedric Auger 
642f22e1655SJens Wiklander 	if (res == TEE_SUCCESS && object)
643172d637bSCedric Auger 		*object = (TEE_ObjectHandle)(uintptr_t)obj;
644172d637bSCedric Auger 
645172d637bSCedric Auger 	if (res != TEE_SUCCESS &&
646172d637bSCedric Auger 	    res != TEE_ERROR_ITEM_NOT_FOUND &&
647172d637bSCedric Auger 	    res != TEE_ERROR_ACCESS_CONFLICT &&
648172d637bSCedric Auger 	    res != TEE_ERROR_OUT_OF_MEMORY &&
649172d637bSCedric Auger 	    res != TEE_ERROR_STORAGE_NO_SPACE &&
650172d637bSCedric Auger 	    res != TEE_ERROR_CORRUPT_OBJECT &&
651172d637bSCedric Auger 	    res != TEE_ERROR_STORAGE_NOT_AVAILABLE)
652b36311adSJerome Forissier 		TEE_Panic(res);
653172d637bSCedric Auger 
654f22e1655SJens Wiklander 	if (res != TEE_SUCCESS && object)
655172d637bSCedric Auger 		*object = TEE_HANDLE_NULL;
656172d637bSCedric Auger 
657172d637bSCedric Auger 	return res;
658b0104773SPascal Brand }
659b0104773SPascal Brand 
660f22e1655SJens Wiklander TEE_Result __GP11_TEE_CreatePersistentObject(uint32_t storageID,
661f22e1655SJens Wiklander 					     const void *objectID,
662f22e1655SJens Wiklander 					     uint32_t objectIDLen,
663f22e1655SJens Wiklander 					     uint32_t flags,
664f22e1655SJens Wiklander 					     TEE_ObjectHandle attributes,
665f22e1655SJens Wiklander 					     const void *initialData,
666f22e1655SJens Wiklander 					     uint32_t initialDataLen,
667f22e1655SJens Wiklander 					     TEE_ObjectHandle *object)
668f22e1655SJens Wiklander {
669f22e1655SJens Wiklander 	__utee_check_out_annotation(object, sizeof(*object));
670f22e1655SJens Wiklander 
671f22e1655SJens Wiklander 	return TEE_CreatePersistentObject(storageID, objectID, objectIDLen,
672f22e1655SJens Wiklander 					  flags, attributes, initialData,
673f22e1655SJens Wiklander 					  initialDataLen, object);
674f22e1655SJens Wiklander }
675f22e1655SJens Wiklander 
6767583c59eSCedric Chaumont /*
6777583c59eSCedric Chaumont  * Use of this function is deprecated
6787583c59eSCedric Chaumont  * new code SHOULD use the TEE_CloseAndDeletePersistentObject1 function instead
6797583c59eSCedric Chaumont  * These functions will be removed at some future major revision of
6807583c59eSCedric Chaumont  * this specification
6817583c59eSCedric Chaumont  */
682b0104773SPascal Brand void TEE_CloseAndDeletePersistentObject(TEE_ObjectHandle object)
683b0104773SPascal Brand {
684b0104773SPascal Brand 	TEE_Result res;
685b0104773SPascal Brand 
686b0104773SPascal Brand 	if (object == TEE_HANDLE_NULL)
687b0104773SPascal Brand 		return;
688b0104773SPascal Brand 
6897583c59eSCedric Chaumont 	res = TEE_CloseAndDeletePersistentObject1(object);
690b0104773SPascal Brand 
691b0104773SPascal Brand 	if (res != TEE_SUCCESS)
692b0104773SPascal Brand 		TEE_Panic(0);
693b0104773SPascal Brand }
694b0104773SPascal Brand 
6957583c59eSCedric Chaumont TEE_Result TEE_CloseAndDeletePersistentObject1(TEE_ObjectHandle object)
6967583c59eSCedric Chaumont {
6977583c59eSCedric Chaumont 	TEE_Result res;
6987583c59eSCedric Chaumont 
6997583c59eSCedric Chaumont 	if (object == TEE_HANDLE_NULL)
70046cfd17cSJens Wiklander 		return TEE_SUCCESS;
7017583c59eSCedric Chaumont 
7022c028fdeSJerome Forissier 	res = _utee_storage_obj_del((unsigned long)object);
7037583c59eSCedric Chaumont 
7047583c59eSCedric Chaumont 	if (res != TEE_SUCCESS && res != TEE_ERROR_STORAGE_NOT_AVAILABLE)
705b36311adSJerome Forissier 		TEE_Panic(res);
7067583c59eSCedric Chaumont 
7077583c59eSCedric Chaumont 	return res;
7087583c59eSCedric Chaumont }
7097583c59eSCedric Chaumont 
7107583c59eSCedric Chaumont 
711b0104773SPascal Brand TEE_Result TEE_RenamePersistentObject(TEE_ObjectHandle object,
712b0104773SPascal Brand 				      const void *newObjectID,
7131c12923fSJens Wiklander 				      size_t newObjectIDLen)
714b0104773SPascal Brand {
715b0104773SPascal Brand 	TEE_Result res;
716b0104773SPascal Brand 
717a76bf53fSCedric Chaumont 	if (object == TEE_HANDLE_NULL) {
718a76bf53fSCedric Chaumont 		res = TEE_ERROR_ITEM_NOT_FOUND;
719a76bf53fSCedric Chaumont 		goto out;
720a76bf53fSCedric Chaumont 	}
721b0104773SPascal Brand 
7222c028fdeSJerome Forissier 	res = _utee_storage_obj_rename((unsigned long)object, newObjectID,
723e86f1266SJens Wiklander 				       newObjectIDLen);
724b0104773SPascal Brand 
725a76bf53fSCedric Chaumont out:
726a76bf53fSCedric Chaumont 	if (res != TEE_SUCCESS &&
727a76bf53fSCedric Chaumont 	    res != TEE_ERROR_ACCESS_CONFLICT &&
728a76bf53fSCedric Chaumont 	    res != TEE_ERROR_CORRUPT_OBJECT &&
729a76bf53fSCedric Chaumont 	    res != TEE_ERROR_STORAGE_NOT_AVAILABLE)
730b36311adSJerome Forissier 		TEE_Panic(res);
731b0104773SPascal Brand 
732b0104773SPascal Brand 	return res;
733b0104773SPascal Brand }
734b0104773SPascal Brand 
7351c12923fSJens Wiklander TEE_Result __GP11_TEE_RenamePersistentObject(TEE_ObjectHandle object,
7361c12923fSJens Wiklander 					     const void *newObjectID,
7371c12923fSJens Wiklander 					     uint32_t newObjectIDLen)
7381c12923fSJens Wiklander {
7391c12923fSJens Wiklander 	return TEE_RenamePersistentObject(object, newObjectID, newObjectIDLen);
7401c12923fSJens Wiklander }
7411c12923fSJens Wiklander 
742b0104773SPascal Brand TEE_Result TEE_AllocatePersistentObjectEnumerator(TEE_ObjectEnumHandle *
743b0104773SPascal Brand 						  objectEnumerator)
744b0104773SPascal Brand {
745b0104773SPascal Brand 	TEE_Result res;
746e86f1266SJens Wiklander 	uint32_t oe;
747b0104773SPascal Brand 
7486915bbbbSJens Wiklander 	__utee_check_out_annotation(objectEnumerator,
7496915bbbbSJens Wiklander 				    sizeof(*objectEnumerator));
750b0104773SPascal Brand 
7512c028fdeSJerome Forissier 	res = _utee_storage_alloc_enum(&oe);
752b0104773SPascal Brand 
753b0104773SPascal Brand 	if (res != TEE_SUCCESS)
754e86f1266SJens Wiklander 		oe = TEE_HANDLE_NULL;
755e86f1266SJens Wiklander 
756e86f1266SJens Wiklander 	*objectEnumerator = (TEE_ObjectEnumHandle)(uintptr_t)oe;
757b0104773SPascal Brand 
75815cd3c30SCedric Chaumont 	if (res != TEE_SUCCESS &&
75915cd3c30SCedric Chaumont 	    res != TEE_ERROR_ACCESS_CONFLICT)
760b36311adSJerome Forissier 		TEE_Panic(res);
76115cd3c30SCedric Chaumont 
762b0104773SPascal Brand 	return res;
763b0104773SPascal Brand }
764b0104773SPascal Brand 
765b0104773SPascal Brand void TEE_FreePersistentObjectEnumerator(TEE_ObjectEnumHandle objectEnumerator)
766b0104773SPascal Brand {
767b0104773SPascal Brand 	TEE_Result res;
768b0104773SPascal Brand 
769b0104773SPascal Brand 	if (objectEnumerator == TEE_HANDLE_NULL)
770b0104773SPascal Brand 		return;
771b0104773SPascal Brand 
7722c028fdeSJerome Forissier 	res = _utee_storage_free_enum((unsigned long)objectEnumerator);
773b0104773SPascal Brand 
774b0104773SPascal Brand 	if (res != TEE_SUCCESS)
775b36311adSJerome Forissier 		TEE_Panic(res);
776b0104773SPascal Brand }
777b0104773SPascal Brand 
778b0104773SPascal Brand void TEE_ResetPersistentObjectEnumerator(TEE_ObjectEnumHandle objectEnumerator)
779b0104773SPascal Brand {
780b0104773SPascal Brand 	TEE_Result res;
781b0104773SPascal Brand 
782b0104773SPascal Brand 	if (objectEnumerator == TEE_HANDLE_NULL)
783b0104773SPascal Brand 		return;
784b0104773SPascal Brand 
7852c028fdeSJerome Forissier 	res = _utee_storage_reset_enum((unsigned long)objectEnumerator);
786b0104773SPascal Brand 
787b0104773SPascal Brand 	if (res != TEE_SUCCESS)
788b36311adSJerome Forissier 		TEE_Panic(res);
789b0104773SPascal Brand }
790b0104773SPascal Brand 
791b0104773SPascal Brand TEE_Result TEE_StartPersistentObjectEnumerator(TEE_ObjectEnumHandle
792b0104773SPascal Brand 					       objectEnumerator,
793b0104773SPascal Brand 					       uint32_t storageID)
794b0104773SPascal Brand {
795b0104773SPascal Brand 	TEE_Result res;
796b0104773SPascal Brand 
7972c028fdeSJerome Forissier 	res = _utee_storage_start_enum((unsigned long)objectEnumerator,
798e86f1266SJens Wiklander 				       storageID);
799b0104773SPascal Brand 
80015cd3c30SCedric Chaumont 	if (res != TEE_SUCCESS &&
80115cd3c30SCedric Chaumont 	    res != TEE_ERROR_ITEM_NOT_FOUND &&
80215cd3c30SCedric Chaumont 	    res != TEE_ERROR_CORRUPT_OBJECT &&
80315cd3c30SCedric Chaumont 	    res != TEE_ERROR_STORAGE_NOT_AVAILABLE)
804b36311adSJerome Forissier 		TEE_Panic(res);
805b0104773SPascal Brand 
806b0104773SPascal Brand 	return res;
807b0104773SPascal Brand }
808b0104773SPascal Brand 
809b0104773SPascal Brand TEE_Result TEE_GetNextPersistentObject(TEE_ObjectEnumHandle objectEnumerator,
810b0104773SPascal Brand 				       TEE_ObjectInfo *objectInfo,
8111c12923fSJens Wiklander 				       void *objectID, size_t *objectIDLen)
812b0104773SPascal Brand {
81375d6a373SJens Wiklander 	struct utee_object_info info = { };
81475d6a373SJens Wiklander 	TEE_Result res = TEE_SUCCESS;
81575d6a373SJens Wiklander 	uint64_t len = 0;
816b0104773SPascal Brand 
8176915bbbbSJens Wiklander 	if (objectInfo)
8186915bbbbSJens Wiklander 		__utee_check_out_annotation(objectInfo, sizeof(*objectInfo));
8196915bbbbSJens Wiklander 	__utee_check_out_annotation(objectIDLen, sizeof(*objectIDLen));
82015cd3c30SCedric Chaumont 
8216915bbbbSJens Wiklander 	if (!objectID) {
82215cd3c30SCedric Chaumont 		res = TEE_ERROR_BAD_PARAMETERS;
82315cd3c30SCedric Chaumont 		goto out;
82415cd3c30SCedric Chaumont 	}
82515cd3c30SCedric Chaumont 
826e86f1266SJens Wiklander 	len = *objectIDLen;
8272c028fdeSJerome Forissier 	res = _utee_storage_next_enum((unsigned long)objectEnumerator,
82875d6a373SJens Wiklander 				      &info, objectID, &len);
82975d6a373SJens Wiklander 	if (objectInfo) {
83075d6a373SJens Wiklander 		objectInfo->objectType = info.obj_type;
831d372a47cSJens Wiklander 		objectInfo->objectSize = info.obj_size;
832d372a47cSJens Wiklander 		objectInfo->maxObjectSize = info.max_obj_size;
833d372a47cSJens Wiklander 		objectInfo->objectUsage = info.obj_usage;
834d372a47cSJens Wiklander 		objectInfo->dataSize = info.data_size;
835d372a47cSJens Wiklander 		objectInfo->dataPosition = info.data_pos;
836d372a47cSJens Wiklander 		objectInfo->handleFlags = info.handle_flags;
837d372a47cSJens Wiklander 	}
838d372a47cSJens Wiklander 	*objectIDLen = len;
839d372a47cSJens Wiklander 
840d372a47cSJens Wiklander out:
841d372a47cSJens Wiklander 	if (res != TEE_SUCCESS &&
842d372a47cSJens Wiklander 	    res != TEE_ERROR_ITEM_NOT_FOUND &&
843d372a47cSJens Wiklander 	    res != TEE_ERROR_CORRUPT_OBJECT &&
844d372a47cSJens Wiklander 	    res != TEE_ERROR_STORAGE_NOT_AVAILABLE)
845d372a47cSJens Wiklander 		TEE_Panic(res);
846d372a47cSJens Wiklander 
847d372a47cSJens Wiklander 	return res;
848d372a47cSJens Wiklander }
849d372a47cSJens Wiklander 
850d372a47cSJens Wiklander TEE_Result
851d372a47cSJens Wiklander __GP11_TEE_GetNextPersistentObject(TEE_ObjectEnumHandle objectEnumerator,
852d372a47cSJens Wiklander 				   __GP11_TEE_ObjectInfo *objectInfo,
853d372a47cSJens Wiklander 				   void *objectID, uint32_t *objectIDLen)
854d372a47cSJens Wiklander {
855d372a47cSJens Wiklander 	struct utee_object_info info = { };
856d372a47cSJens Wiklander 	TEE_Result res = TEE_SUCCESS;
857d372a47cSJens Wiklander 	uint64_t len = 0;
858d372a47cSJens Wiklander 
859d372a47cSJens Wiklander 	if (objectInfo)
860d372a47cSJens Wiklander 		__utee_check_out_annotation(objectInfo, sizeof(*objectInfo));
861d372a47cSJens Wiklander 	__utee_check_out_annotation(objectIDLen, sizeof(*objectIDLen));
862d372a47cSJens Wiklander 
863d372a47cSJens Wiklander 	if (!objectID) {
864d372a47cSJens Wiklander 		res = TEE_ERROR_BAD_PARAMETERS;
865d372a47cSJens Wiklander 		goto out;
866d372a47cSJens Wiklander 	}
867d372a47cSJens Wiklander 
868d372a47cSJens Wiklander 	len = *objectIDLen;
869d372a47cSJens Wiklander 	res = _utee_storage_next_enum((unsigned long)objectEnumerator,
870d372a47cSJens Wiklander 				      &info, objectID, &len);
871d372a47cSJens Wiklander 	if (objectInfo) {
872d372a47cSJens Wiklander 		objectInfo->objectType = info.obj_type;
87375d6a373SJens Wiklander 		objectInfo->keySize = info.obj_size;
87475d6a373SJens Wiklander 		objectInfo->maxKeySize = info.max_obj_size;
87575d6a373SJens Wiklander 		objectInfo->objectUsage = info.obj_usage;
87675d6a373SJens Wiklander 		objectInfo->dataSize = info.data_size;
87775d6a373SJens Wiklander 		objectInfo->dataPosition = info.data_pos;
87875d6a373SJens Wiklander 		objectInfo->handleFlags = info.handle_flags;
87975d6a373SJens Wiklander 	}
880e86f1266SJens Wiklander 	*objectIDLen = len;
881b0104773SPascal Brand 
88215cd3c30SCedric Chaumont out:
88315cd3c30SCedric Chaumont 	if (res != TEE_SUCCESS &&
88415cd3c30SCedric Chaumont 	    res != TEE_ERROR_ITEM_NOT_FOUND &&
88515cd3c30SCedric Chaumont 	    res != TEE_ERROR_CORRUPT_OBJECT &&
88615cd3c30SCedric Chaumont 	    res != TEE_ERROR_STORAGE_NOT_AVAILABLE)
887b36311adSJerome Forissier 		TEE_Panic(res);
888b0104773SPascal Brand 
889b0104773SPascal Brand 	return res;
890b0104773SPascal Brand }
891b0104773SPascal Brand 
892b0104773SPascal Brand /* Data and Key Storage API  - Data Stream Access Functions */
893b0104773SPascal Brand 
894b0104773SPascal Brand TEE_Result TEE_ReadObjectData(TEE_ObjectHandle object, void *buffer,
895*41af5286SJens Wiklander 			      size_t size, size_t *count)
896b0104773SPascal Brand {
897b0104773SPascal Brand 	TEE_Result res;
898e86f1266SJens Wiklander 	uint64_t cnt64;
899b0104773SPascal Brand 
900ae1289baSCedric Chaumont 	if (object == TEE_HANDLE_NULL) {
901ae1289baSCedric Chaumont 		res = TEE_ERROR_BAD_PARAMETERS;
902ae1289baSCedric Chaumont 		goto out;
903ae1289baSCedric Chaumont 	}
9046915bbbbSJens Wiklander 	__utee_check_out_annotation(count, sizeof(*count));
905b0104773SPascal Brand 
906e86f1266SJens Wiklander 	cnt64 = *count;
9072c028fdeSJerome Forissier 	res = _utee_storage_obj_read((unsigned long)object, buffer, size,
908e86f1266SJens Wiklander 				     &cnt64);
909e86f1266SJens Wiklander 	*count = cnt64;
910b0104773SPascal Brand 
911ae1289baSCedric Chaumont out:
912ae1289baSCedric Chaumont 	if (res != TEE_SUCCESS &&
913ae1289baSCedric Chaumont 	    res != TEE_ERROR_CORRUPT_OBJECT &&
914ae1289baSCedric Chaumont 	    res != TEE_ERROR_STORAGE_NOT_AVAILABLE)
915b36311adSJerome Forissier 		TEE_Panic(res);
916b0104773SPascal Brand 
917b0104773SPascal Brand 	return res;
918b0104773SPascal Brand }
919b0104773SPascal Brand 
920*41af5286SJens Wiklander TEE_Result __GP11_TEE_ReadObjectData(TEE_ObjectHandle object, void *buffer,
921*41af5286SJens Wiklander 				     uint32_t size, uint32_t *count)
922*41af5286SJens Wiklander {
923*41af5286SJens Wiklander 	TEE_Result res = TEE_SUCCESS;
924*41af5286SJens Wiklander 	size_t cnt = 0;
925*41af5286SJens Wiklander 
926*41af5286SJens Wiklander 	__utee_check_out_annotation(count, sizeof(*count));
927*41af5286SJens Wiklander 	cnt = *count;
928*41af5286SJens Wiklander 	res = TEE_ReadObjectData(object, buffer, size, &cnt);
929*41af5286SJens Wiklander 	*count = cnt;
930*41af5286SJens Wiklander 	return res;
931*41af5286SJens Wiklander }
932*41af5286SJens Wiklander 
9338f07fe6fSJerome Forissier TEE_Result TEE_WriteObjectData(TEE_ObjectHandle object, const void *buffer,
934*41af5286SJens Wiklander 			       size_t size)
935b0104773SPascal Brand {
936b0104773SPascal Brand 	TEE_Result res;
937b0104773SPascal Brand 
938ae1289baSCedric Chaumont 	if (object == TEE_HANDLE_NULL) {
939ae1289baSCedric Chaumont 		res = TEE_ERROR_BAD_PARAMETERS;
940ae1289baSCedric Chaumont 		goto out;
941ae1289baSCedric Chaumont 	}
942ae1289baSCedric Chaumont 
943ae1289baSCedric Chaumont 	if (size > TEE_DATA_MAX_POSITION) {
944ae1289baSCedric Chaumont 		res = TEE_ERROR_OVERFLOW;
945ae1289baSCedric Chaumont 		goto out;
946ae1289baSCedric Chaumont 	}
947b0104773SPascal Brand 
9482c028fdeSJerome Forissier 	res = _utee_storage_obj_write((unsigned long)object, buffer, size);
949b0104773SPascal Brand 
950ae1289baSCedric Chaumont out:
951ae1289baSCedric Chaumont 	if (res != TEE_SUCCESS &&
952ae1289baSCedric Chaumont 	    res != TEE_ERROR_STORAGE_NO_SPACE &&
953ae1289baSCedric Chaumont 	    res != TEE_ERROR_OVERFLOW &&
954ae1289baSCedric Chaumont 	    res != TEE_ERROR_CORRUPT_OBJECT &&
955ae1289baSCedric Chaumont 	    res != TEE_ERROR_STORAGE_NOT_AVAILABLE)
956b36311adSJerome Forissier 		TEE_Panic(res);
957b0104773SPascal Brand 
958b0104773SPascal Brand 	return res;
959b0104773SPascal Brand }
960b0104773SPascal Brand 
961*41af5286SJens Wiklander TEE_Result __GP11_TEE_WriteObjectData(TEE_ObjectHandle object,
962*41af5286SJens Wiklander 				      const void *buffer, uint32_t size)
963*41af5286SJens Wiklander {
964*41af5286SJens Wiklander 	return TEE_WriteObjectData(object, buffer, size);
965*41af5286SJens Wiklander }
966*41af5286SJens Wiklander 
967b0104773SPascal Brand TEE_Result TEE_TruncateObjectData(TEE_ObjectHandle object, uint32_t size)
968b0104773SPascal Brand {
969b0104773SPascal Brand 	TEE_Result res;
970b0104773SPascal Brand 
971ae1289baSCedric Chaumont 	if (object == TEE_HANDLE_NULL) {
972ae1289baSCedric Chaumont 		res = TEE_ERROR_BAD_PARAMETERS;
973ae1289baSCedric Chaumont 		goto out;
974ae1289baSCedric Chaumont 	}
975b0104773SPascal Brand 
9762c028fdeSJerome Forissier 	res = _utee_storage_obj_trunc((unsigned long)object, size);
977b0104773SPascal Brand 
978ae1289baSCedric Chaumont out:
979ae1289baSCedric Chaumont 	if (res != TEE_SUCCESS &&
980ae1289baSCedric Chaumont 	    res != TEE_ERROR_STORAGE_NO_SPACE &&
981ae1289baSCedric Chaumont 	    res != TEE_ERROR_CORRUPT_OBJECT &&
982ae1289baSCedric Chaumont 	    res != TEE_ERROR_STORAGE_NOT_AVAILABLE)
983b36311adSJerome Forissier 		TEE_Panic(res);
984b0104773SPascal Brand 
985b0104773SPascal Brand 	return res;
986b0104773SPascal Brand }
987b0104773SPascal Brand 
988b0104773SPascal Brand TEE_Result TEE_SeekObjectData(TEE_ObjectHandle object, int32_t offset,
989b0104773SPascal Brand 			      TEE_Whence whence)
990b0104773SPascal Brand {
99175d6a373SJens Wiklander 	struct utee_object_info info = { };
99275d6a373SJens Wiklander 	TEE_Result res = TEE_SUCCESS;
993b0104773SPascal Brand 
994ae1289baSCedric Chaumont 	if (object == TEE_HANDLE_NULL) {
995ae1289baSCedric Chaumont 		res = TEE_ERROR_BAD_PARAMETERS;
996ae1289baSCedric Chaumont 		goto out;
997ae1289baSCedric Chaumont 	}
998b0104773SPascal Brand 
9992c028fdeSJerome Forissier 	res = _utee_cryp_obj_get_info((unsigned long)object, &info);
1000b0104773SPascal Brand 	if (res != TEE_SUCCESS)
1001ae1289baSCedric Chaumont 		goto out;
1002b0104773SPascal Brand 
1003b0104773SPascal Brand 	switch (whence) {
1004b0104773SPascal Brand 	case TEE_DATA_SEEK_SET:
1005ae1289baSCedric Chaumont 		if (offset > 0 && (uint32_t)offset > TEE_DATA_MAX_POSITION) {
1006ae1289baSCedric Chaumont 			res = TEE_ERROR_OVERFLOW;
1007ae1289baSCedric Chaumont 			goto out;
1008ae1289baSCedric Chaumont 		}
1009b0104773SPascal Brand 		break;
1010b0104773SPascal Brand 	case TEE_DATA_SEEK_CUR:
1011b0104773SPascal Brand 		if (offset > 0 &&
101275d6a373SJens Wiklander 		    ((uint32_t)offset + info.data_pos > TEE_DATA_MAX_POSITION ||
101375d6a373SJens Wiklander 		     (uint32_t)offset + info.data_pos < info.data_pos)) {
1014ae1289baSCedric Chaumont 			res = TEE_ERROR_OVERFLOW;
1015ae1289baSCedric Chaumont 			goto out;
1016ae1289baSCedric Chaumont 		}
1017b0104773SPascal Brand 		break;
1018b0104773SPascal Brand 	case TEE_DATA_SEEK_END:
1019b0104773SPascal Brand 		if (offset > 0 &&
102075d6a373SJens Wiklander 		    ((uint32_t)offset + info.data_size >
102175d6a373SJens Wiklander 		     TEE_DATA_MAX_POSITION ||
102275d6a373SJens Wiklander 		     (uint32_t)offset + info.data_size < info.data_size)) {
1023ae1289baSCedric Chaumont 			res = TEE_ERROR_OVERFLOW;
1024ae1289baSCedric Chaumont 			goto out;
1025ae1289baSCedric Chaumont 		}
1026b0104773SPascal Brand 		break;
1027b0104773SPascal Brand 	default:
1028ae1289baSCedric Chaumont 		res = TEE_ERROR_ITEM_NOT_FOUND;
1029ae1289baSCedric Chaumont 		goto out;
1030b0104773SPascal Brand 	}
1031b0104773SPascal Brand 
10322c028fdeSJerome Forissier 	res = _utee_storage_obj_seek((unsigned long)object, offset, whence);
1033b0104773SPascal Brand 
1034ae1289baSCedric Chaumont out:
1035ae1289baSCedric Chaumont 	if (res != TEE_SUCCESS &&
1036ae1289baSCedric Chaumont 	    res != TEE_ERROR_OVERFLOW &&
1037ae1289baSCedric Chaumont 	    res != TEE_ERROR_CORRUPT_OBJECT &&
1038ae1289baSCedric Chaumont 	    res != TEE_ERROR_STORAGE_NOT_AVAILABLE)
1039b36311adSJerome Forissier 		TEE_Panic(res);
1040b0104773SPascal Brand 
1041b0104773SPascal Brand 	return res;
1042b0104773SPascal Brand }
1043