xref: /optee_os/lib/libutee/tee_api_objects.c (revision d372a47cd336f9d1a7aeb3cccc24e7d658c22313)
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 
31b0104773SPascal Brand /* Data and Key Storage API  - Generic Object Functions */
327583c59eSCedric Chaumont /*
337583c59eSCedric Chaumont  * Use of this function is deprecated
347583c59eSCedric Chaumont  * new code SHOULD use the TEE_GetObjectInfo1 function instead
357583c59eSCedric Chaumont  * These functions will be removed at some future major revision of
367583c59eSCedric Chaumont  * this specification
377583c59eSCedric Chaumont  */
38b0104773SPascal Brand void TEE_GetObjectInfo(TEE_ObjectHandle object, TEE_ObjectInfo *objectInfo)
39b0104773SPascal Brand {
4075d6a373SJens Wiklander 	struct utee_object_info info = { };
4175d6a373SJens Wiklander 	TEE_Result res = TEE_SUCCESS;
42b0104773SPascal Brand 
4375d6a373SJens Wiklander 	res = _utee_cryp_obj_get_info((unsigned long)object, &info);
447583c59eSCedric Chaumont 
45b0104773SPascal Brand 	if (res != TEE_SUCCESS)
46b0104773SPascal Brand 		TEE_Panic(res);
477583c59eSCedric Chaumont 
4875d6a373SJens Wiklander 	if (info.obj_type == TEE_TYPE_CORRUPTED_OBJECT) {
49*d372a47cSJens Wiklander 		objectInfo->objectSize = 0;
50*d372a47cSJens Wiklander 		objectInfo->maxObjectSize = 0;
51*d372a47cSJens Wiklander 		objectInfo->objectUsage = 0;
52*d372a47cSJens Wiklander 		objectInfo->dataSize = 0;
53*d372a47cSJens Wiklander 		objectInfo->dataPosition = 0;
54*d372a47cSJens Wiklander 		objectInfo->handleFlags = 0;
55*d372a47cSJens Wiklander 	} else {
56*d372a47cSJens Wiklander 		objectInfo->objectType = info.obj_type;
57*d372a47cSJens Wiklander 		objectInfo->objectSize = info.obj_size;
58*d372a47cSJens Wiklander 		objectInfo->maxObjectSize = info.max_obj_size;
59*d372a47cSJens Wiklander 		objectInfo->objectUsage = info.obj_usage;
60*d372a47cSJens Wiklander 		objectInfo->dataSize = info.data_size;
61*d372a47cSJens Wiklander 		objectInfo->dataPosition = info.data_pos;
62*d372a47cSJens Wiklander 		objectInfo->handleFlags = info.handle_flags;
63*d372a47cSJens Wiklander 	}
64*d372a47cSJens Wiklander }
65*d372a47cSJens Wiklander 
66*d372a47cSJens Wiklander void __GP11_TEE_GetObjectInfo(TEE_ObjectHandle object,
67*d372a47cSJens Wiklander 			      __GP11_TEE_ObjectInfo *objectInfo)
68*d372a47cSJens Wiklander {
69*d372a47cSJens Wiklander 	struct utee_object_info info = { };
70*d372a47cSJens Wiklander 	TEE_Result res = TEE_SUCCESS;
71*d372a47cSJens Wiklander 
72*d372a47cSJens Wiklander 	res = _utee_cryp_obj_get_info((unsigned long)object, &info);
73*d372a47cSJens Wiklander 
74*d372a47cSJens Wiklander 	if (res != TEE_SUCCESS)
75*d372a47cSJens Wiklander 		TEE_Panic(res);
76*d372a47cSJens Wiklander 
77*d372a47cSJens Wiklander 	if (info.obj_type == TEE_TYPE_CORRUPTED_OBJECT) {
787583c59eSCedric Chaumont 		objectInfo->keySize = 0;
797583c59eSCedric Chaumont 		objectInfo->maxKeySize = 0;
807583c59eSCedric Chaumont 		objectInfo->objectUsage = 0;
817583c59eSCedric Chaumont 		objectInfo->dataSize = 0;
827583c59eSCedric Chaumont 		objectInfo->dataPosition = 0;
837583c59eSCedric Chaumont 		objectInfo->handleFlags = 0;
8475d6a373SJens Wiklander 	} else {
8575d6a373SJens Wiklander 		objectInfo->objectType = info.obj_type;
8675d6a373SJens Wiklander 		objectInfo->keySize = info.obj_size;
8775d6a373SJens Wiklander 		objectInfo->maxKeySize = info.max_obj_size;
8875d6a373SJens Wiklander 		objectInfo->objectUsage = info.obj_usage;
8975d6a373SJens Wiklander 		objectInfo->dataSize = info.data_size;
9075d6a373SJens Wiklander 		objectInfo->dataPosition = info.data_pos;
9175d6a373SJens Wiklander 		objectInfo->handleFlags = info.handle_flags;
927583c59eSCedric Chaumont 	}
93b0104773SPascal Brand }
94b0104773SPascal Brand 
95*d372a47cSJens Wiklander TEE_Result TEE_GetObjectInfo1(TEE_ObjectHandle object,
96*d372a47cSJens Wiklander 			      TEE_ObjectInfo *objectInfo)
97*d372a47cSJens Wiklander {
98*d372a47cSJens Wiklander 	struct utee_object_info info = { };
99*d372a47cSJens Wiklander 	TEE_Result res = TEE_SUCCESS;
100*d372a47cSJens Wiklander 
101*d372a47cSJens Wiklander 	res = _utee_cryp_obj_get_info((unsigned long)object, &info);
102*d372a47cSJens Wiklander 
103*d372a47cSJens Wiklander 	if (res != TEE_SUCCESS &&
104*d372a47cSJens Wiklander 	    res != TEE_ERROR_CORRUPT_OBJECT &&
105*d372a47cSJens Wiklander 	    res != TEE_ERROR_STORAGE_NOT_AVAILABLE)
106*d372a47cSJens Wiklander 		TEE_Panic(res);
107*d372a47cSJens Wiklander 
108*d372a47cSJens Wiklander 	objectInfo->objectType = info.obj_type;
109*d372a47cSJens Wiklander 	objectInfo->objectSize = info.obj_size;
110*d372a47cSJens Wiklander 	objectInfo->maxObjectSize = info.max_obj_size;
111*d372a47cSJens Wiklander 	objectInfo->objectUsage = info.obj_usage;
112*d372a47cSJens Wiklander 	objectInfo->dataSize = info.data_size;
113*d372a47cSJens Wiklander 	objectInfo->dataPosition = info.data_pos;
114*d372a47cSJens Wiklander 	objectInfo->handleFlags = info.handle_flags;
115*d372a47cSJens Wiklander 
116*d372a47cSJens Wiklander 	return res;
117*d372a47cSJens Wiklander }
118*d372a47cSJens Wiklander 
119*d372a47cSJens Wiklander TEE_Result __GP11_TEE_GetObjectInfo1(TEE_ObjectHandle object,
120*d372a47cSJens Wiklander 				     __GP11_TEE_ObjectInfo *objectInfo)
1217583c59eSCedric Chaumont {
12275d6a373SJens Wiklander 	struct utee_object_info info = { };
12375d6a373SJens Wiklander 	TEE_Result res = TEE_SUCCESS;
1247583c59eSCedric Chaumont 
12575d6a373SJens Wiklander 	res = _utee_cryp_obj_get_info((unsigned long)object, &info);
1267583c59eSCedric Chaumont 
127a2e9a830SCedric Chaumont 	if (res != TEE_SUCCESS &&
128a2e9a830SCedric Chaumont 	    res != TEE_ERROR_CORRUPT_OBJECT &&
129a2e9a830SCedric Chaumont 	    res != TEE_ERROR_STORAGE_NOT_AVAILABLE)
1307583c59eSCedric Chaumont 		TEE_Panic(res);
1317583c59eSCedric Chaumont 
13275d6a373SJens Wiklander 	objectInfo->objectType = info.obj_type;
13375d6a373SJens Wiklander 	objectInfo->keySize = info.obj_size;
13475d6a373SJens Wiklander 	objectInfo->maxKeySize = info.max_obj_size;
13575d6a373SJens Wiklander 	objectInfo->objectUsage = info.obj_usage;
13675d6a373SJens Wiklander 	objectInfo->dataSize = info.data_size;
13775d6a373SJens Wiklander 	objectInfo->dataPosition = info.data_pos;
13875d6a373SJens Wiklander 	objectInfo->handleFlags = info.handle_flags;
13975d6a373SJens Wiklander 
1407583c59eSCedric Chaumont 	return res;
1417583c59eSCedric Chaumont }
1427583c59eSCedric Chaumont 
1437583c59eSCedric Chaumont /*
1447583c59eSCedric Chaumont  * Use of this function is deprecated
1457583c59eSCedric Chaumont  * new code SHOULD use the TEE_RestrictObjectUsage1 function instead
1467583c59eSCedric Chaumont  * These functions will be removed at some future major revision of
1477583c59eSCedric Chaumont  * this specification
1487583c59eSCedric Chaumont  */
149b0104773SPascal Brand void TEE_RestrictObjectUsage(TEE_ObjectHandle object, uint32_t objectUsage)
150b0104773SPascal Brand {
15175d6a373SJens Wiklander 	struct utee_object_info info = { };
15275d6a373SJens Wiklander 	TEE_Result res = TEE_SUCCESS;
1537583c59eSCedric Chaumont 
15475d6a373SJens Wiklander 	res = _utee_cryp_obj_get_info((unsigned long)object, &info);
15575d6a373SJens Wiklander 	if (info.obj_type == TEE_TYPE_CORRUPTED_OBJECT)
1567583c59eSCedric Chaumont 		return;
1577583c59eSCedric Chaumont 
1587583c59eSCedric Chaumont 	res = TEE_RestrictObjectUsage1(object, objectUsage);
159b0104773SPascal Brand 
160b0104773SPascal Brand 	if (res != TEE_SUCCESS)
161b36311adSJerome Forissier 		TEE_Panic(res);
162b0104773SPascal Brand }
163b0104773SPascal Brand 
1647583c59eSCedric Chaumont TEE_Result TEE_RestrictObjectUsage1(TEE_ObjectHandle object, uint32_t objectUsage)
1657583c59eSCedric Chaumont {
1667583c59eSCedric Chaumont 	TEE_Result res;
1677583c59eSCedric Chaumont 
1682c028fdeSJerome Forissier 	res = _utee_cryp_obj_restrict_usage((unsigned long)object,
1692c028fdeSJerome Forissier 					    objectUsage);
1707583c59eSCedric Chaumont 
171a2e9a830SCedric Chaumont 	if (res != TEE_SUCCESS &&
172a2e9a830SCedric Chaumont 	    res != TEE_ERROR_CORRUPT_OBJECT &&
173a2e9a830SCedric Chaumont 	    res != TEE_ERROR_STORAGE_NOT_AVAILABLE)
174a2e9a830SCedric Chaumont 		TEE_Panic(res);
1757583c59eSCedric Chaumont 
1767583c59eSCedric Chaumont 	return res;
1777583c59eSCedric Chaumont }
1787583c59eSCedric Chaumont 
179b0104773SPascal Brand TEE_Result TEE_GetObjectBufferAttribute(TEE_ObjectHandle object,
180b0104773SPascal Brand 					uint32_t attributeID, void *buffer,
18179a3c601SCedric Chaumont 					uint32_t *size)
182b0104773SPascal Brand {
18375d6a373SJens Wiklander 	struct utee_object_info info = { };
18475d6a373SJens Wiklander 	TEE_Result res = TEE_SUCCESS;
18575d6a373SJens Wiklander 	uint64_t sz = 0;
186b0104773SPascal Brand 
1876915bbbbSJens Wiklander 	__utee_check_inout_annotation(size, sizeof(*size));
1886915bbbbSJens Wiklander 
1892c028fdeSJerome Forissier 	res = _utee_cryp_obj_get_info((unsigned long)object, &info);
190b0104773SPascal Brand 	if (res != TEE_SUCCESS)
191a2e9a830SCedric Chaumont 		goto exit;
192b0104773SPascal Brand 
193b0104773SPascal Brand 	/* This function only supports reference attributes */
194b9416909SJens Wiklander 	if ((attributeID & TEE_ATTR_FLAG_VALUE)) {
195a2e9a830SCedric Chaumont 		res = TEE_ERROR_BAD_PARAMETERS;
196a2e9a830SCedric Chaumont 		goto exit;
197a2e9a830SCedric Chaumont 	}
198b0104773SPascal Brand 
199e86f1266SJens Wiklander 	sz = *size;
2002c028fdeSJerome Forissier 	res = _utee_cryp_obj_get_attr((unsigned long)object, attributeID,
201e86f1266SJens Wiklander 				      buffer, &sz);
202e86f1266SJens Wiklander 	*size = sz;
203b0104773SPascal Brand 
204a2e9a830SCedric Chaumont exit:
2050ed6a6caSCedric Chaumont 	if (res != TEE_SUCCESS &&
2060ed6a6caSCedric Chaumont 	    res != TEE_ERROR_ITEM_NOT_FOUND &&
2070ed6a6caSCedric Chaumont 	    res != TEE_ERROR_SHORT_BUFFER &&
2080ed6a6caSCedric Chaumont 	    res != TEE_ERROR_CORRUPT_OBJECT &&
2090ed6a6caSCedric Chaumont 	    res != TEE_ERROR_STORAGE_NOT_AVAILABLE)
210b36311adSJerome Forissier 		TEE_Panic(res);
211b0104773SPascal Brand 
212b0104773SPascal Brand 	return res;
213b0104773SPascal Brand }
214b0104773SPascal Brand 
215b0104773SPascal Brand TEE_Result TEE_GetObjectValueAttribute(TEE_ObjectHandle object,
216b0104773SPascal Brand 				       uint32_t attributeID, uint32_t *a,
217b0104773SPascal Brand 				       uint32_t *b)
218b0104773SPascal Brand {
21975d6a373SJens Wiklander 	struct utee_object_info info = { };
22075d6a373SJens Wiklander 	TEE_Result res = TEE_SUCCESS;
221b0104773SPascal Brand 	uint32_t buf[2];
222e86f1266SJens Wiklander 	uint64_t size = sizeof(buf);
223b0104773SPascal Brand 
2246915bbbbSJens Wiklander 	if (a)
2256915bbbbSJens Wiklander 		__utee_check_out_annotation(a, sizeof(*a));
2266915bbbbSJens Wiklander 	if (b)
2276915bbbbSJens Wiklander 		__utee_check_out_annotation(b, sizeof(*b));
2286915bbbbSJens Wiklander 
2292c028fdeSJerome Forissier 	res = _utee_cryp_obj_get_info((unsigned long)object, &info);
230b0104773SPascal Brand 	if (res != TEE_SUCCESS)
231a2e9a830SCedric Chaumont 		goto exit;
232b0104773SPascal Brand 
233b0104773SPascal Brand 	/* This function only supports value attributes */
234b9416909SJens Wiklander 	if (!(attributeID & TEE_ATTR_FLAG_VALUE)) {
235a2e9a830SCedric Chaumont 		res = TEE_ERROR_BAD_PARAMETERS;
236a2e9a830SCedric Chaumont 		goto exit;
237a2e9a830SCedric Chaumont 	}
238b0104773SPascal Brand 
2392c028fdeSJerome Forissier 	res = _utee_cryp_obj_get_attr((unsigned long)object, attributeID, buf,
240e86f1266SJens Wiklander 				      &size);
241b0104773SPascal Brand 
242a2e9a830SCedric Chaumont exit:
2430ed6a6caSCedric Chaumont 	if (res != TEE_SUCCESS &&
2440ed6a6caSCedric Chaumont 	    res != TEE_ERROR_ITEM_NOT_FOUND &&
2450ed6a6caSCedric Chaumont 	    res != TEE_ERROR_CORRUPT_OBJECT &&
2460ed6a6caSCedric Chaumont 	    res != TEE_ERROR_STORAGE_NOT_AVAILABLE)
247b36311adSJerome Forissier 		TEE_Panic(res);
248b0104773SPascal Brand 
249b0104773SPascal Brand 	if (size != sizeof(buf))
250b0104773SPascal Brand 		TEE_Panic(0);
251b0104773SPascal Brand 
252be96c837SJerome Forissier 	if (res == TEE_SUCCESS) {
253b9d8f134SJerome Forissier 		if (a)
254b0104773SPascal Brand 			*a = buf[0];
255b9d8f134SJerome Forissier 		if (b)
256b0104773SPascal Brand 			*b = buf[1];
257be96c837SJerome Forissier 	}
258b0104773SPascal Brand 
259b0104773SPascal Brand 	return res;
260b0104773SPascal Brand }
261b0104773SPascal Brand 
262b0104773SPascal Brand void TEE_CloseObject(TEE_ObjectHandle object)
263b0104773SPascal Brand {
264b0104773SPascal Brand 	TEE_Result res;
265b0104773SPascal Brand 
266b0104773SPascal Brand 	if (object == TEE_HANDLE_NULL)
267b0104773SPascal Brand 		return;
268b0104773SPascal Brand 
2692c028fdeSJerome Forissier 	res = _utee_cryp_obj_close((unsigned long)object);
270b0104773SPascal Brand 	if (res != TEE_SUCCESS)
271b36311adSJerome Forissier 		TEE_Panic(res);
272b0104773SPascal Brand }
273b0104773SPascal Brand 
274b0104773SPascal Brand /* Data and Key Storage API  - Transient Object Functions */
275b0104773SPascal Brand 
276b0104773SPascal Brand TEE_Result TEE_AllocateTransientObject(TEE_ObjectType objectType,
27779a3c601SCedric Chaumont 				       uint32_t maxKeySize,
278b0104773SPascal Brand 				       TEE_ObjectHandle *object)
279b0104773SPascal Brand {
280b0104773SPascal Brand 	TEE_Result res;
281b0104773SPascal Brand 	uint32_t obj;
282b0104773SPascal Brand 
2836915bbbbSJens Wiklander 	__utee_check_out_annotation(object, sizeof(*object));
2846915bbbbSJens Wiklander 
2852c028fdeSJerome Forissier 	res = _utee_cryp_obj_alloc(objectType, maxKeySize, &obj);
286aeb0d927SCedric Chaumont 
287aeb0d927SCedric Chaumont 	if (res != TEE_SUCCESS &&
288aeb0d927SCedric Chaumont 	    res != TEE_ERROR_OUT_OF_MEMORY &&
289aeb0d927SCedric Chaumont 	    res != TEE_ERROR_NOT_SUPPORTED)
290b36311adSJerome Forissier 		TEE_Panic(res);
291aeb0d927SCedric Chaumont 
292b0104773SPascal Brand 	if (res == TEE_SUCCESS)
293e86f1266SJens Wiklander 		*object = (TEE_ObjectHandle)(uintptr_t)obj;
2940ed6a6caSCedric Chaumont 
295b0104773SPascal Brand 	return res;
296b0104773SPascal Brand }
297b0104773SPascal Brand 
298b0104773SPascal Brand void TEE_FreeTransientObject(TEE_ObjectHandle object)
299b0104773SPascal Brand {
30075d6a373SJens Wiklander 	struct utee_object_info info = { };
30175d6a373SJens Wiklander 	TEE_Result res = TEE_SUCCESS;
302b0104773SPascal Brand 
303b0104773SPascal Brand 	if (object == TEE_HANDLE_NULL)
304b0104773SPascal Brand 		return;
305b0104773SPascal Brand 
3062c028fdeSJerome Forissier 	res = _utee_cryp_obj_get_info((unsigned long)object, &info);
307b0104773SPascal Brand 	if (res != TEE_SUCCESS)
308b36311adSJerome Forissier 		TEE_Panic(res);
309b0104773SPascal Brand 
31075d6a373SJens Wiklander 	if ((info.handle_flags & TEE_HANDLE_FLAG_PERSISTENT) != 0)
311b0104773SPascal Brand 		TEE_Panic(0);
312b0104773SPascal Brand 
3132c028fdeSJerome Forissier 	res = _utee_cryp_obj_close((unsigned long)object);
314b0104773SPascal Brand 	if (res != TEE_SUCCESS)
315b36311adSJerome Forissier 		TEE_Panic(res);
316b0104773SPascal Brand }
317b0104773SPascal Brand 
318b0104773SPascal Brand void TEE_ResetTransientObject(TEE_ObjectHandle object)
319b0104773SPascal Brand {
32075d6a373SJens Wiklander 	struct utee_object_info info = { };
32175d6a373SJens Wiklander 	TEE_Result res = TEE_SUCCESS;
322b0104773SPascal Brand 
323b0104773SPascal Brand 	if (object == TEE_HANDLE_NULL)
324b0104773SPascal Brand 		return;
325b0104773SPascal Brand 
3262c028fdeSJerome Forissier 	res = _utee_cryp_obj_get_info((unsigned long)object, &info);
327b0104773SPascal Brand 	if (res != TEE_SUCCESS)
328b36311adSJerome Forissier 		TEE_Panic(res);
329b0104773SPascal Brand 
33075d6a373SJens Wiklander 	if ((info.handle_flags & TEE_HANDLE_FLAG_PERSISTENT) != 0)
331b0104773SPascal Brand 		TEE_Panic(0);
332b0104773SPascal Brand 
3332c028fdeSJerome Forissier 	res = _utee_cryp_obj_reset((unsigned long)object);
334b0104773SPascal Brand 	if (res != TEE_SUCCESS)
335b36311adSJerome Forissier 		TEE_Panic(res);
336b0104773SPascal Brand }
337b0104773SPascal Brand 
338b0104773SPascal Brand TEE_Result TEE_PopulateTransientObject(TEE_ObjectHandle object,
3398f07fe6fSJerome Forissier 				       const TEE_Attribute *attrs,
340b0104773SPascal Brand 				       uint32_t attrCount)
341b0104773SPascal Brand {
342e86f1266SJens Wiklander 	struct utee_attribute ua[attrCount];
34375d6a373SJens Wiklander 	struct utee_object_info info = { };
34475d6a373SJens Wiklander 	TEE_Result res = TEE_SUCCESS;
345b0104773SPascal Brand 
3466915bbbbSJens Wiklander 	__utee_check_attr_in_annotation(attrs, attrCount);
3476915bbbbSJens Wiklander 
3482c028fdeSJerome Forissier 	res = _utee_cryp_obj_get_info((unsigned long)object, &info);
349b0104773SPascal Brand 	if (res != TEE_SUCCESS)
350b36311adSJerome Forissier 		TEE_Panic(res);
351b0104773SPascal Brand 
352b0104773SPascal Brand 	/* Must be a transient object */
35375d6a373SJens Wiklander 	if ((info.handle_flags & TEE_HANDLE_FLAG_PERSISTENT) != 0)
354b0104773SPascal Brand 		TEE_Panic(0);
355b0104773SPascal Brand 
356b0104773SPascal Brand 	/* Must not be initialized already */
35775d6a373SJens Wiklander 	if ((info.handle_flags & TEE_HANDLE_FLAG_INITIALIZED) != 0)
358b0104773SPascal Brand 		TEE_Panic(0);
359b0104773SPascal Brand 
360e86f1266SJens Wiklander 	__utee_from_attr(ua, attrs, attrCount);
3612c028fdeSJerome Forissier 	res = _utee_cryp_obj_populate((unsigned long)object, ua, attrCount);
362b0104773SPascal Brand 	if (res != TEE_SUCCESS && res != TEE_ERROR_BAD_PARAMETERS)
363b0104773SPascal Brand 		TEE_Panic(res);
364b0104773SPascal Brand 	return res;
365b0104773SPascal Brand }
366b0104773SPascal Brand 
367b0104773SPascal Brand void TEE_InitRefAttribute(TEE_Attribute *attr, uint32_t attributeID,
3688f07fe6fSJerome Forissier 			  const void *buffer, uint32_t length)
369b0104773SPascal Brand {
3706915bbbbSJens Wiklander 	__utee_check_out_annotation(attr, sizeof(*attr));
3716915bbbbSJens Wiklander 
372b9416909SJens Wiklander 	if ((attributeID & TEE_ATTR_FLAG_VALUE) != 0)
373b0104773SPascal Brand 		TEE_Panic(0);
374b0104773SPascal Brand 	attr->attributeID = attributeID;
3758f07fe6fSJerome Forissier 	attr->content.ref.buffer = (void *)buffer;
376b0104773SPascal Brand 	attr->content.ref.length = length;
377b0104773SPascal Brand }
378b0104773SPascal Brand 
379b0104773SPascal Brand void TEE_InitValueAttribute(TEE_Attribute *attr, uint32_t attributeID,
380b0104773SPascal Brand 			    uint32_t a, uint32_t b)
381b0104773SPascal Brand {
3826915bbbbSJens Wiklander 	__utee_check_out_annotation(attr, sizeof(*attr));
3836915bbbbSJens Wiklander 
384b9416909SJens Wiklander 	if ((attributeID & TEE_ATTR_FLAG_VALUE) == 0)
385b0104773SPascal Brand 		TEE_Panic(0);
386b0104773SPascal Brand 	attr->attributeID = attributeID;
387b0104773SPascal Brand 	attr->content.value.a = a;
388b0104773SPascal Brand 	attr->content.value.b = b;
389b0104773SPascal Brand }
390b0104773SPascal Brand 
3917583c59eSCedric Chaumont /*
3927583c59eSCedric Chaumont  * Use of this function is deprecated
3937583c59eSCedric Chaumont  * new code SHOULD use the TEE_CopyObjectAttributes1 function instead
3947583c59eSCedric Chaumont  * These functions will be removed at some future major revision of
3957583c59eSCedric Chaumont  * this specification
3967583c59eSCedric Chaumont  */
397b0104773SPascal Brand void TEE_CopyObjectAttributes(TEE_ObjectHandle destObject,
398b0104773SPascal Brand 			      TEE_ObjectHandle srcObject)
399b0104773SPascal Brand {
40075d6a373SJens Wiklander 	struct utee_object_info src_info = { };
40175d6a373SJens Wiklander 	TEE_Result res = TEE_SUCCESS;
4027583c59eSCedric Chaumont 
4032c028fdeSJerome Forissier 	res = _utee_cryp_obj_get_info((unsigned long)srcObject, &src_info);
40475d6a373SJens Wiklander 	if (src_info.obj_type == TEE_TYPE_CORRUPTED_OBJECT)
4057583c59eSCedric Chaumont 		return;
4067583c59eSCedric Chaumont 
4077583c59eSCedric Chaumont 	res = TEE_CopyObjectAttributes1(destObject, srcObject);
4087583c59eSCedric Chaumont 	if (res != TEE_SUCCESS)
409b36311adSJerome Forissier 		TEE_Panic(res);
4107583c59eSCedric Chaumont }
4117583c59eSCedric Chaumont 
4127583c59eSCedric Chaumont TEE_Result TEE_CopyObjectAttributes1(TEE_ObjectHandle destObject,
4137583c59eSCedric Chaumont 			      TEE_ObjectHandle srcObject)
4147583c59eSCedric Chaumont {
41575d6a373SJens Wiklander 	struct utee_object_info dst_info = { };
41675d6a373SJens Wiklander 	struct utee_object_info src_info = { };
41775d6a373SJens Wiklander 	TEE_Result res = TEE_SUCCESS;
418b0104773SPascal Brand 
4192c028fdeSJerome Forissier 	res = _utee_cryp_obj_get_info((unsigned long)destObject, &dst_info);
420b0104773SPascal Brand 	if (res != TEE_SUCCESS)
421a2e9a830SCedric Chaumont 		goto exit;
422b0104773SPascal Brand 
4232c028fdeSJerome Forissier 	res = _utee_cryp_obj_get_info((unsigned long)srcObject, &src_info);
424b0104773SPascal Brand 	if (res != TEE_SUCCESS)
425a2e9a830SCedric Chaumont 		goto exit;
426b0104773SPascal Brand 
42775d6a373SJens Wiklander 	if (!(src_info.handle_flags & TEE_HANDLE_FLAG_INITIALIZED))
428b0104773SPascal Brand 		TEE_Panic(0);
429a2e9a830SCedric Chaumont 
43075d6a373SJens Wiklander 	if ((dst_info.handle_flags & TEE_HANDLE_FLAG_PERSISTENT))
431b0104773SPascal Brand 		TEE_Panic(0);
432a2e9a830SCedric Chaumont 
43375d6a373SJens Wiklander 	if ((dst_info.handle_flags & TEE_HANDLE_FLAG_INITIALIZED))
434b0104773SPascal Brand 		TEE_Panic(0);
435b0104773SPascal Brand 
4362c028fdeSJerome Forissier 	res = _utee_cryp_obj_copy((unsigned long)destObject,
437e86f1266SJens Wiklander 				  (unsigned long)srcObject);
4387583c59eSCedric Chaumont 
439a2e9a830SCedric Chaumont exit:
440a2e9a830SCedric Chaumont 	if (res != TEE_SUCCESS &&
441a2e9a830SCedric Chaumont 	    res != TEE_ERROR_CORRUPT_OBJECT &&
442a2e9a830SCedric Chaumont 	    res != TEE_ERROR_STORAGE_NOT_AVAILABLE)
443a2e9a830SCedric Chaumont 		TEE_Panic(res);
4447583c59eSCedric Chaumont 
4457583c59eSCedric Chaumont 	return res;
446b0104773SPascal Brand }
447b0104773SPascal Brand 
448b0104773SPascal Brand TEE_Result TEE_GenerateKey(TEE_ObjectHandle object, uint32_t keySize,
4498f07fe6fSJerome Forissier 			   const TEE_Attribute *params, uint32_t paramCount)
450b0104773SPascal Brand {
451b0104773SPascal Brand 	TEE_Result res;
452e86f1266SJens Wiklander 	struct utee_attribute ua[paramCount];
453b0104773SPascal Brand 
4546915bbbbSJens Wiklander 	__utee_check_attr_in_annotation(params, paramCount);
4556915bbbbSJens Wiklander 
456e86f1266SJens Wiklander 	__utee_from_attr(ua, params, paramCount);
4572c028fdeSJerome Forissier 	res = _utee_cryp_obj_generate_key((unsigned long)object, keySize,
458e86f1266SJens Wiklander 					  ua, paramCount);
459b0104773SPascal Brand 
460aeb0d927SCedric Chaumont 	if (res != TEE_SUCCESS && res != TEE_ERROR_BAD_PARAMETERS)
461b36311adSJerome Forissier 		TEE_Panic(res);
462b0104773SPascal Brand 
463b0104773SPascal Brand 	return res;
464b0104773SPascal Brand }
465b0104773SPascal Brand 
466b0104773SPascal Brand /* Data and Key Storage API  - Persistent Object Functions */
467b0104773SPascal Brand 
4688f07fe6fSJerome Forissier TEE_Result TEE_OpenPersistentObject(uint32_t storageID, const void *objectID,
46979a3c601SCedric Chaumont 				    uint32_t objectIDLen, uint32_t flags,
470b0104773SPascal Brand 				    TEE_ObjectHandle *object)
471b0104773SPascal Brand {
4729b520646SCedric Chaumont 	TEE_Result res;
473e86f1266SJens Wiklander 	uint32_t obj;
474b0104773SPascal Brand 
4752138a6f8SStefan Schmidt 	__utee_check_out_annotation(object, sizeof(*object));
4762138a6f8SStefan Schmidt 
4772c028fdeSJerome Forissier 	res = _utee_storage_obj_open(storageID, objectID, objectIDLen, flags,
478e86f1266SJens Wiklander 				     &obj);
479e86f1266SJens Wiklander 	if (res == TEE_SUCCESS)
480e86f1266SJens Wiklander 		*object = (TEE_ObjectHandle)(uintptr_t)obj;
4819b520646SCedric Chaumont 
4829b520646SCedric Chaumont 	if (res != TEE_SUCCESS &&
4839b520646SCedric Chaumont 	    res != TEE_ERROR_ITEM_NOT_FOUND &&
4849b520646SCedric Chaumont 	    res != TEE_ERROR_ACCESS_CONFLICT &&
4859b520646SCedric Chaumont 	    res != TEE_ERROR_OUT_OF_MEMORY &&
4869b520646SCedric Chaumont 	    res != TEE_ERROR_CORRUPT_OBJECT &&
4879b520646SCedric Chaumont 	    res != TEE_ERROR_STORAGE_NOT_AVAILABLE)
488b36311adSJerome Forissier 		TEE_Panic(res);
489b0104773SPascal Brand 
490172d637bSCedric Auger 	if (res != TEE_SUCCESS)
49169a3d6beSDaniel Glöckner 		*object = TEE_HANDLE_NULL;
49269a3d6beSDaniel Glöckner 
4939b520646SCedric Chaumont 	return res;
494b0104773SPascal Brand }
495b0104773SPascal Brand 
4968f07fe6fSJerome Forissier TEE_Result TEE_CreatePersistentObject(uint32_t storageID, const void *objectID,
49779a3c601SCedric Chaumont 				      uint32_t objectIDLen, uint32_t flags,
498b0104773SPascal Brand 				      TEE_ObjectHandle attributes,
499b0104773SPascal Brand 				      const void *initialData,
50079a3c601SCedric Chaumont 				      uint32_t initialDataLen,
501b0104773SPascal Brand 				      TEE_ObjectHandle *object)
502b0104773SPascal Brand {
50384431ae3SCedric Chaumont 	TEE_Result res;
504e86f1266SJens Wiklander 	uint32_t obj;
505b0104773SPascal Brand 
5066915bbbbSJens Wiklander 	__utee_check_out_annotation(object, sizeof(*object));
507b0104773SPascal Brand 
5082c028fdeSJerome Forissier 	res = _utee_storage_obj_create(storageID, objectID, objectIDLen, flags,
509e86f1266SJens Wiklander 				       (unsigned long)attributes, initialData,
510e86f1266SJens Wiklander 				       initialDataLen, &obj);
511172d637bSCedric Auger 
5121c96fa7fSPascal Brand 	if (res == TEE_SUCCESS)
513172d637bSCedric Auger 		*object = (TEE_ObjectHandle)(uintptr_t)obj;
514172d637bSCedric Auger 
515172d637bSCedric Auger 	if (res != TEE_SUCCESS &&
516172d637bSCedric Auger 	    res != TEE_ERROR_ITEM_NOT_FOUND &&
517172d637bSCedric Auger 	    res != TEE_ERROR_ACCESS_CONFLICT &&
518172d637bSCedric Auger 	    res != TEE_ERROR_OUT_OF_MEMORY &&
519172d637bSCedric Auger 	    res != TEE_ERROR_STORAGE_NO_SPACE &&
520172d637bSCedric Auger 	    res != TEE_ERROR_CORRUPT_OBJECT &&
521172d637bSCedric Auger 	    res != TEE_ERROR_STORAGE_NOT_AVAILABLE)
522b36311adSJerome Forissier 		TEE_Panic(res);
523172d637bSCedric Auger 
524172d637bSCedric Auger 	if (res != TEE_SUCCESS)
525172d637bSCedric Auger 		*object = TEE_HANDLE_NULL;
526172d637bSCedric Auger 
527172d637bSCedric Auger 	return res;
528b0104773SPascal Brand }
529b0104773SPascal Brand 
5307583c59eSCedric Chaumont /*
5317583c59eSCedric Chaumont  * Use of this function is deprecated
5327583c59eSCedric Chaumont  * new code SHOULD use the TEE_CloseAndDeletePersistentObject1 function instead
5337583c59eSCedric Chaumont  * These functions will be removed at some future major revision of
5347583c59eSCedric Chaumont  * this specification
5357583c59eSCedric Chaumont  */
536b0104773SPascal Brand void TEE_CloseAndDeletePersistentObject(TEE_ObjectHandle object)
537b0104773SPascal Brand {
538b0104773SPascal Brand 	TEE_Result res;
539b0104773SPascal Brand 
540b0104773SPascal Brand 	if (object == TEE_HANDLE_NULL)
541b0104773SPascal Brand 		return;
542b0104773SPascal Brand 
5437583c59eSCedric Chaumont 	res = TEE_CloseAndDeletePersistentObject1(object);
544b0104773SPascal Brand 
545b0104773SPascal Brand 	if (res != TEE_SUCCESS)
546b0104773SPascal Brand 		TEE_Panic(0);
547b0104773SPascal Brand }
548b0104773SPascal Brand 
5497583c59eSCedric Chaumont TEE_Result TEE_CloseAndDeletePersistentObject1(TEE_ObjectHandle object)
5507583c59eSCedric Chaumont {
5517583c59eSCedric Chaumont 	TEE_Result res;
5527583c59eSCedric Chaumont 
5537583c59eSCedric Chaumont 	if (object == TEE_HANDLE_NULL)
55446cfd17cSJens Wiklander 		return TEE_SUCCESS;
5557583c59eSCedric Chaumont 
5562c028fdeSJerome Forissier 	res = _utee_storage_obj_del((unsigned long)object);
5577583c59eSCedric Chaumont 
5587583c59eSCedric Chaumont 	if (res != TEE_SUCCESS && res != TEE_ERROR_STORAGE_NOT_AVAILABLE)
559b36311adSJerome Forissier 		TEE_Panic(res);
5607583c59eSCedric Chaumont 
5617583c59eSCedric Chaumont 	return res;
5627583c59eSCedric Chaumont }
5637583c59eSCedric Chaumont 
5647583c59eSCedric Chaumont 
565b0104773SPascal Brand TEE_Result TEE_RenamePersistentObject(TEE_ObjectHandle object,
566b0104773SPascal Brand 				      const void *newObjectID,
56779a3c601SCedric Chaumont 				      uint32_t newObjectIDLen)
568b0104773SPascal Brand {
569b0104773SPascal Brand 	TEE_Result res;
570b0104773SPascal Brand 
571a76bf53fSCedric Chaumont 	if (object == TEE_HANDLE_NULL) {
572a76bf53fSCedric Chaumont 		res = TEE_ERROR_ITEM_NOT_FOUND;
573a76bf53fSCedric Chaumont 		goto out;
574a76bf53fSCedric Chaumont 	}
575b0104773SPascal Brand 
5762c028fdeSJerome Forissier 	res = _utee_storage_obj_rename((unsigned long)object, newObjectID,
577e86f1266SJens Wiklander 				       newObjectIDLen);
578b0104773SPascal Brand 
579a76bf53fSCedric Chaumont out:
580a76bf53fSCedric Chaumont 	if (res != TEE_SUCCESS &&
581a76bf53fSCedric Chaumont 	    res != TEE_ERROR_ACCESS_CONFLICT &&
582a76bf53fSCedric Chaumont 	    res != TEE_ERROR_CORRUPT_OBJECT &&
583a76bf53fSCedric Chaumont 	    res != TEE_ERROR_STORAGE_NOT_AVAILABLE)
584b36311adSJerome Forissier 		TEE_Panic(res);
585b0104773SPascal Brand 
586b0104773SPascal Brand 	return res;
587b0104773SPascal Brand }
588b0104773SPascal Brand 
589b0104773SPascal Brand TEE_Result TEE_AllocatePersistentObjectEnumerator(TEE_ObjectEnumHandle *
590b0104773SPascal Brand 						  objectEnumerator)
591b0104773SPascal Brand {
592b0104773SPascal Brand 	TEE_Result res;
593e86f1266SJens Wiklander 	uint32_t oe;
594b0104773SPascal Brand 
5956915bbbbSJens Wiklander 	__utee_check_out_annotation(objectEnumerator,
5966915bbbbSJens Wiklander 				    sizeof(*objectEnumerator));
597b0104773SPascal Brand 
5982c028fdeSJerome Forissier 	res = _utee_storage_alloc_enum(&oe);
599b0104773SPascal Brand 
600b0104773SPascal Brand 	if (res != TEE_SUCCESS)
601e86f1266SJens Wiklander 		oe = TEE_HANDLE_NULL;
602e86f1266SJens Wiklander 
603e86f1266SJens Wiklander 	*objectEnumerator = (TEE_ObjectEnumHandle)(uintptr_t)oe;
604b0104773SPascal Brand 
60515cd3c30SCedric Chaumont 	if (res != TEE_SUCCESS &&
60615cd3c30SCedric Chaumont 	    res != TEE_ERROR_ACCESS_CONFLICT)
607b36311adSJerome Forissier 		TEE_Panic(res);
60815cd3c30SCedric Chaumont 
609b0104773SPascal Brand 	return res;
610b0104773SPascal Brand }
611b0104773SPascal Brand 
612b0104773SPascal Brand void TEE_FreePersistentObjectEnumerator(TEE_ObjectEnumHandle objectEnumerator)
613b0104773SPascal Brand {
614b0104773SPascal Brand 	TEE_Result res;
615b0104773SPascal Brand 
616b0104773SPascal Brand 	if (objectEnumerator == TEE_HANDLE_NULL)
617b0104773SPascal Brand 		return;
618b0104773SPascal Brand 
6192c028fdeSJerome Forissier 	res = _utee_storage_free_enum((unsigned long)objectEnumerator);
620b0104773SPascal Brand 
621b0104773SPascal Brand 	if (res != TEE_SUCCESS)
622b36311adSJerome Forissier 		TEE_Panic(res);
623b0104773SPascal Brand }
624b0104773SPascal Brand 
625b0104773SPascal Brand void TEE_ResetPersistentObjectEnumerator(TEE_ObjectEnumHandle objectEnumerator)
626b0104773SPascal Brand {
627b0104773SPascal Brand 	TEE_Result res;
628b0104773SPascal Brand 
629b0104773SPascal Brand 	if (objectEnumerator == TEE_HANDLE_NULL)
630b0104773SPascal Brand 		return;
631b0104773SPascal Brand 
6322c028fdeSJerome Forissier 	res = _utee_storage_reset_enum((unsigned long)objectEnumerator);
633b0104773SPascal Brand 
634b0104773SPascal Brand 	if (res != TEE_SUCCESS)
635b36311adSJerome Forissier 		TEE_Panic(res);
636b0104773SPascal Brand }
637b0104773SPascal Brand 
638b0104773SPascal Brand TEE_Result TEE_StartPersistentObjectEnumerator(TEE_ObjectEnumHandle
639b0104773SPascal Brand 					       objectEnumerator,
640b0104773SPascal Brand 					       uint32_t storageID)
641b0104773SPascal Brand {
642b0104773SPascal Brand 	TEE_Result res;
643b0104773SPascal Brand 
6442c028fdeSJerome Forissier 	res = _utee_storage_start_enum((unsigned long)objectEnumerator,
645e86f1266SJens Wiklander 				       storageID);
646b0104773SPascal Brand 
64715cd3c30SCedric Chaumont 	if (res != TEE_SUCCESS &&
64815cd3c30SCedric Chaumont 	    res != TEE_ERROR_ITEM_NOT_FOUND &&
64915cd3c30SCedric Chaumont 	    res != TEE_ERROR_CORRUPT_OBJECT &&
65015cd3c30SCedric Chaumont 	    res != TEE_ERROR_STORAGE_NOT_AVAILABLE)
651b36311adSJerome Forissier 		TEE_Panic(res);
652b0104773SPascal Brand 
653b0104773SPascal Brand 	return res;
654b0104773SPascal Brand }
655b0104773SPascal Brand 
656b0104773SPascal Brand TEE_Result TEE_GetNextPersistentObject(TEE_ObjectEnumHandle objectEnumerator,
657b0104773SPascal Brand 				       TEE_ObjectInfo *objectInfo,
65879a3c601SCedric Chaumont 				       void *objectID, uint32_t *objectIDLen)
659b0104773SPascal Brand {
66075d6a373SJens Wiklander 	struct utee_object_info info = { };
66175d6a373SJens Wiklander 	TEE_Result res = TEE_SUCCESS;
66275d6a373SJens Wiklander 	uint64_t len = 0;
663b0104773SPascal Brand 
6646915bbbbSJens Wiklander 	if (objectInfo)
6656915bbbbSJens Wiklander 		__utee_check_out_annotation(objectInfo, sizeof(*objectInfo));
6666915bbbbSJens Wiklander 	__utee_check_out_annotation(objectIDLen, sizeof(*objectIDLen));
66715cd3c30SCedric Chaumont 
6686915bbbbSJens Wiklander 	if (!objectID) {
66915cd3c30SCedric Chaumont 		res = TEE_ERROR_BAD_PARAMETERS;
67015cd3c30SCedric Chaumont 		goto out;
67115cd3c30SCedric Chaumont 	}
67215cd3c30SCedric Chaumont 
673e86f1266SJens Wiklander 	len = *objectIDLen;
6742c028fdeSJerome Forissier 	res = _utee_storage_next_enum((unsigned long)objectEnumerator,
67575d6a373SJens Wiklander 				      &info, objectID, &len);
67675d6a373SJens Wiklander 	if (objectInfo) {
67775d6a373SJens Wiklander 		objectInfo->objectType = info.obj_type;
678*d372a47cSJens Wiklander 		objectInfo->objectSize = info.obj_size;
679*d372a47cSJens Wiklander 		objectInfo->maxObjectSize = info.max_obj_size;
680*d372a47cSJens Wiklander 		objectInfo->objectUsage = info.obj_usage;
681*d372a47cSJens Wiklander 		objectInfo->dataSize = info.data_size;
682*d372a47cSJens Wiklander 		objectInfo->dataPosition = info.data_pos;
683*d372a47cSJens Wiklander 		objectInfo->handleFlags = info.handle_flags;
684*d372a47cSJens Wiklander 	}
685*d372a47cSJens Wiklander 	*objectIDLen = len;
686*d372a47cSJens Wiklander 
687*d372a47cSJens Wiklander out:
688*d372a47cSJens Wiklander 	if (res != TEE_SUCCESS &&
689*d372a47cSJens Wiklander 	    res != TEE_ERROR_ITEM_NOT_FOUND &&
690*d372a47cSJens Wiklander 	    res != TEE_ERROR_CORRUPT_OBJECT &&
691*d372a47cSJens Wiklander 	    res != TEE_ERROR_STORAGE_NOT_AVAILABLE)
692*d372a47cSJens Wiklander 		TEE_Panic(res);
693*d372a47cSJens Wiklander 
694*d372a47cSJens Wiklander 	return res;
695*d372a47cSJens Wiklander }
696*d372a47cSJens Wiklander 
697*d372a47cSJens Wiklander TEE_Result
698*d372a47cSJens Wiklander __GP11_TEE_GetNextPersistentObject(TEE_ObjectEnumHandle objectEnumerator,
699*d372a47cSJens Wiklander 				   __GP11_TEE_ObjectInfo *objectInfo,
700*d372a47cSJens Wiklander 				   void *objectID, uint32_t *objectIDLen)
701*d372a47cSJens Wiklander {
702*d372a47cSJens Wiklander 	struct utee_object_info info = { };
703*d372a47cSJens Wiklander 	TEE_Result res = TEE_SUCCESS;
704*d372a47cSJens Wiklander 	uint64_t len = 0;
705*d372a47cSJens Wiklander 
706*d372a47cSJens Wiklander 	if (objectInfo)
707*d372a47cSJens Wiklander 		__utee_check_out_annotation(objectInfo, sizeof(*objectInfo));
708*d372a47cSJens Wiklander 	__utee_check_out_annotation(objectIDLen, sizeof(*objectIDLen));
709*d372a47cSJens Wiklander 
710*d372a47cSJens Wiklander 	if (!objectID) {
711*d372a47cSJens Wiklander 		res = TEE_ERROR_BAD_PARAMETERS;
712*d372a47cSJens Wiklander 		goto out;
713*d372a47cSJens Wiklander 	}
714*d372a47cSJens Wiklander 
715*d372a47cSJens Wiklander 	len = *objectIDLen;
716*d372a47cSJens Wiklander 	res = _utee_storage_next_enum((unsigned long)objectEnumerator,
717*d372a47cSJens Wiklander 				      &info, objectID, &len);
718*d372a47cSJens Wiklander 	if (objectInfo) {
719*d372a47cSJens Wiklander 		objectInfo->objectType = info.obj_type;
72075d6a373SJens Wiklander 		objectInfo->keySize = info.obj_size;
72175d6a373SJens Wiklander 		objectInfo->maxKeySize = info.max_obj_size;
72275d6a373SJens Wiklander 		objectInfo->objectUsage = info.obj_usage;
72375d6a373SJens Wiklander 		objectInfo->dataSize = info.data_size;
72475d6a373SJens Wiklander 		objectInfo->dataPosition = info.data_pos;
72575d6a373SJens Wiklander 		objectInfo->handleFlags = info.handle_flags;
72675d6a373SJens Wiklander 	}
727e86f1266SJens Wiklander 	*objectIDLen = len;
728b0104773SPascal Brand 
72915cd3c30SCedric Chaumont out:
73015cd3c30SCedric Chaumont 	if (res != TEE_SUCCESS &&
73115cd3c30SCedric Chaumont 	    res != TEE_ERROR_ITEM_NOT_FOUND &&
73215cd3c30SCedric Chaumont 	    res != TEE_ERROR_CORRUPT_OBJECT &&
73315cd3c30SCedric Chaumont 	    res != TEE_ERROR_STORAGE_NOT_AVAILABLE)
734b36311adSJerome Forissier 		TEE_Panic(res);
735b0104773SPascal Brand 
736b0104773SPascal Brand 	return res;
737b0104773SPascal Brand }
738b0104773SPascal Brand 
739b0104773SPascal Brand /* Data and Key Storage API  - Data Stream Access Functions */
740b0104773SPascal Brand 
741b0104773SPascal Brand TEE_Result TEE_ReadObjectData(TEE_ObjectHandle object, void *buffer,
74279a3c601SCedric Chaumont 			      uint32_t size, uint32_t *count)
743b0104773SPascal Brand {
744b0104773SPascal Brand 	TEE_Result res;
745e86f1266SJens Wiklander 	uint64_t cnt64;
746b0104773SPascal Brand 
747ae1289baSCedric Chaumont 	if (object == TEE_HANDLE_NULL) {
748ae1289baSCedric Chaumont 		res = TEE_ERROR_BAD_PARAMETERS;
749ae1289baSCedric Chaumont 		goto out;
750ae1289baSCedric Chaumont 	}
7516915bbbbSJens Wiklander 	__utee_check_out_annotation(count, sizeof(*count));
752b0104773SPascal Brand 
753e86f1266SJens Wiklander 	cnt64 = *count;
7542c028fdeSJerome Forissier 	res = _utee_storage_obj_read((unsigned long)object, buffer, size,
755e86f1266SJens Wiklander 				     &cnt64);
756e86f1266SJens Wiklander 	*count = cnt64;
757b0104773SPascal Brand 
758ae1289baSCedric Chaumont out:
759ae1289baSCedric Chaumont 	if (res != TEE_SUCCESS &&
760ae1289baSCedric Chaumont 	    res != TEE_ERROR_CORRUPT_OBJECT &&
761ae1289baSCedric Chaumont 	    res != TEE_ERROR_STORAGE_NOT_AVAILABLE)
762b36311adSJerome Forissier 		TEE_Panic(res);
763b0104773SPascal Brand 
764b0104773SPascal Brand 	return res;
765b0104773SPascal Brand }
766b0104773SPascal Brand 
7678f07fe6fSJerome Forissier TEE_Result TEE_WriteObjectData(TEE_ObjectHandle object, const void *buffer,
76879a3c601SCedric Chaumont 			       uint32_t size)
769b0104773SPascal Brand {
770b0104773SPascal Brand 	TEE_Result res;
771b0104773SPascal Brand 
772ae1289baSCedric Chaumont 	if (object == TEE_HANDLE_NULL) {
773ae1289baSCedric Chaumont 		res = TEE_ERROR_BAD_PARAMETERS;
774ae1289baSCedric Chaumont 		goto out;
775ae1289baSCedric Chaumont 	}
776ae1289baSCedric Chaumont 
777ae1289baSCedric Chaumont 	if (size > TEE_DATA_MAX_POSITION) {
778ae1289baSCedric Chaumont 		res = TEE_ERROR_OVERFLOW;
779ae1289baSCedric Chaumont 		goto out;
780ae1289baSCedric Chaumont 	}
781b0104773SPascal Brand 
7822c028fdeSJerome Forissier 	res = _utee_storage_obj_write((unsigned long)object, buffer, size);
783b0104773SPascal Brand 
784ae1289baSCedric Chaumont out:
785ae1289baSCedric Chaumont 	if (res != TEE_SUCCESS &&
786ae1289baSCedric Chaumont 	    res != TEE_ERROR_STORAGE_NO_SPACE &&
787ae1289baSCedric Chaumont 	    res != TEE_ERROR_OVERFLOW &&
788ae1289baSCedric Chaumont 	    res != TEE_ERROR_CORRUPT_OBJECT &&
789ae1289baSCedric Chaumont 	    res != TEE_ERROR_STORAGE_NOT_AVAILABLE)
790b36311adSJerome Forissier 		TEE_Panic(res);
791b0104773SPascal Brand 
792b0104773SPascal Brand 	return res;
793b0104773SPascal Brand }
794b0104773SPascal Brand 
795b0104773SPascal Brand TEE_Result TEE_TruncateObjectData(TEE_ObjectHandle object, uint32_t size)
796b0104773SPascal Brand {
797b0104773SPascal Brand 	TEE_Result res;
798b0104773SPascal Brand 
799ae1289baSCedric Chaumont 	if (object == TEE_HANDLE_NULL) {
800ae1289baSCedric Chaumont 		res = TEE_ERROR_BAD_PARAMETERS;
801ae1289baSCedric Chaumont 		goto out;
802ae1289baSCedric Chaumont 	}
803b0104773SPascal Brand 
8042c028fdeSJerome Forissier 	res = _utee_storage_obj_trunc((unsigned long)object, size);
805b0104773SPascal Brand 
806ae1289baSCedric Chaumont out:
807ae1289baSCedric Chaumont 	if (res != TEE_SUCCESS &&
808ae1289baSCedric Chaumont 	    res != TEE_ERROR_STORAGE_NO_SPACE &&
809ae1289baSCedric Chaumont 	    res != TEE_ERROR_CORRUPT_OBJECT &&
810ae1289baSCedric Chaumont 	    res != TEE_ERROR_STORAGE_NOT_AVAILABLE)
811b36311adSJerome Forissier 		TEE_Panic(res);
812b0104773SPascal Brand 
813b0104773SPascal Brand 	return res;
814b0104773SPascal Brand }
815b0104773SPascal Brand 
816b0104773SPascal Brand TEE_Result TEE_SeekObjectData(TEE_ObjectHandle object, int32_t offset,
817b0104773SPascal Brand 			      TEE_Whence whence)
818b0104773SPascal Brand {
81975d6a373SJens Wiklander 	struct utee_object_info info = { };
82075d6a373SJens Wiklander 	TEE_Result res = TEE_SUCCESS;
821b0104773SPascal Brand 
822ae1289baSCedric Chaumont 	if (object == TEE_HANDLE_NULL) {
823ae1289baSCedric Chaumont 		res = TEE_ERROR_BAD_PARAMETERS;
824ae1289baSCedric Chaumont 		goto out;
825ae1289baSCedric Chaumont 	}
826b0104773SPascal Brand 
8272c028fdeSJerome Forissier 	res = _utee_cryp_obj_get_info((unsigned long)object, &info);
828b0104773SPascal Brand 	if (res != TEE_SUCCESS)
829ae1289baSCedric Chaumont 		goto out;
830b0104773SPascal Brand 
831b0104773SPascal Brand 	switch (whence) {
832b0104773SPascal Brand 	case TEE_DATA_SEEK_SET:
833ae1289baSCedric Chaumont 		if (offset > 0 && (uint32_t)offset > TEE_DATA_MAX_POSITION) {
834ae1289baSCedric Chaumont 			res = TEE_ERROR_OVERFLOW;
835ae1289baSCedric Chaumont 			goto out;
836ae1289baSCedric Chaumont 		}
837b0104773SPascal Brand 		break;
838b0104773SPascal Brand 	case TEE_DATA_SEEK_CUR:
839b0104773SPascal Brand 		if (offset > 0 &&
84075d6a373SJens Wiklander 		    ((uint32_t)offset + info.data_pos > TEE_DATA_MAX_POSITION ||
84175d6a373SJens Wiklander 		     (uint32_t)offset + info.data_pos < info.data_pos)) {
842ae1289baSCedric Chaumont 			res = TEE_ERROR_OVERFLOW;
843ae1289baSCedric Chaumont 			goto out;
844ae1289baSCedric Chaumont 		}
845b0104773SPascal Brand 		break;
846b0104773SPascal Brand 	case TEE_DATA_SEEK_END:
847b0104773SPascal Brand 		if (offset > 0 &&
84875d6a373SJens Wiklander 		    ((uint32_t)offset + info.data_size >
84975d6a373SJens Wiklander 		     TEE_DATA_MAX_POSITION ||
85075d6a373SJens Wiklander 		     (uint32_t)offset + info.data_size < info.data_size)) {
851ae1289baSCedric Chaumont 			res = TEE_ERROR_OVERFLOW;
852ae1289baSCedric Chaumont 			goto out;
853ae1289baSCedric Chaumont 		}
854b0104773SPascal Brand 		break;
855b0104773SPascal Brand 	default:
856ae1289baSCedric Chaumont 		res = TEE_ERROR_ITEM_NOT_FOUND;
857ae1289baSCedric Chaumont 		goto out;
858b0104773SPascal Brand 	}
859b0104773SPascal Brand 
8602c028fdeSJerome Forissier 	res = _utee_storage_obj_seek((unsigned long)object, offset, whence);
861b0104773SPascal Brand 
862ae1289baSCedric Chaumont out:
863ae1289baSCedric Chaumont 	if (res != TEE_SUCCESS &&
864ae1289baSCedric Chaumont 	    res != TEE_ERROR_OVERFLOW &&
865ae1289baSCedric Chaumont 	    res != TEE_ERROR_CORRUPT_OBJECT &&
866ae1289baSCedric Chaumont 	    res != TEE_ERROR_STORAGE_NOT_AVAILABLE)
867b36311adSJerome Forissier 		TEE_Panic(res);
868b0104773SPascal Brand 
869b0104773SPascal Brand 	return res;
870b0104773SPascal Brand }
871