xref: /optee_os/lib/libutee/tee_api_objects.c (revision be96c837733613b0f5299b587e5f32e0c5cbf342)
1 /*
2  * Copyright (c) 2014, STMicroelectronics International N.V.
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions are met:
7  *
8  * 1. Redistributions of source code must retain the above copyright notice,
9  * this list of conditions and the following disclaimer.
10  *
11  * 2. Redistributions in binary form must reproduce the above copyright notice,
12  * this list of conditions and the following disclaimer in the documentation
13  * and/or other materials provided with the distribution.
14  *
15  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
16  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
19  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
20  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
21  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
22  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
24  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25  * POSSIBILITY OF SUCH DAMAGE.
26  */
27 #include <stdlib.h>
28 #include <string.h>
29 
30 #include <tee_api.h>
31 #include <utee_syscalls.h>
32 #include "tee_api_private.h"
33 
34 #define TEE_USAGE_DEFAULT   0xffffffff
35 
36 #define TEE_ATTR_BIT_VALUE                  (1 << 29)
37 #define TEE_ATTR_BIT_PROTECTED              (1 << 28)
38 
39 void __utee_from_attr(struct utee_attribute *ua, const TEE_Attribute *attrs,
40 			uint32_t attr_count)
41 {
42 	size_t n;
43 
44 	for (n = 0; n < attr_count; n++) {
45 		ua[n].attribute_id = attrs[n].attributeID;
46 		if (attrs[n].attributeID & TEE_ATTR_BIT_VALUE) {
47 			ua[n].a = attrs[n].content.value.a;
48 			ua[n].b = attrs[n].content.value.b;
49 		} else {
50 			ua[n].a = (uintptr_t)attrs[n].content.ref.buffer;
51 			ua[n].b = attrs[n].content.ref.length;
52 		}
53 	}
54 }
55 
56 /* Data and Key Storage API  - Generic Object Functions */
57 /*
58  * Use of this function is deprecated
59  * new code SHOULD use the TEE_GetObjectInfo1 function instead
60  * These functions will be removed at some future major revision of
61  * this specification
62  */
63 void TEE_GetObjectInfo(TEE_ObjectHandle object, TEE_ObjectInfo *objectInfo)
64 {
65 	TEE_Result res;
66 
67 	res = utee_cryp_obj_get_info((unsigned long)object, objectInfo);
68 
69 	if (res != TEE_SUCCESS)
70 		TEE_Panic(res);
71 
72 	if (objectInfo->objectType == TEE_TYPE_CORRUPTED_OBJECT) {
73 		objectInfo->keySize = 0;
74 		objectInfo->maxKeySize = 0;
75 		objectInfo->objectUsage = 0;
76 		objectInfo->dataSize = 0;
77 		objectInfo->dataPosition = 0;
78 		objectInfo->handleFlags = 0;
79 	}
80 }
81 
82 TEE_Result TEE_GetObjectInfo1(TEE_ObjectHandle object, TEE_ObjectInfo *objectInfo)
83 {
84 	TEE_Result res;
85 
86 	res = utee_cryp_obj_get_info((unsigned long)object, objectInfo);
87 
88 	if (res != TEE_SUCCESS &&
89 	    res != TEE_ERROR_CORRUPT_OBJECT &&
90 	    res != TEE_ERROR_STORAGE_NOT_AVAILABLE)
91 		TEE_Panic(res);
92 
93 	return res;
94 }
95 
96 /*
97  * Use of this function is deprecated
98  * new code SHOULD use the TEE_RestrictObjectUsage1 function instead
99  * These functions will be removed at some future major revision of
100  * this specification
101  */
102 void TEE_RestrictObjectUsage(TEE_ObjectHandle object, uint32_t objectUsage)
103 {
104 	TEE_Result res;
105 	TEE_ObjectInfo objectInfo;
106 
107 	res = utee_cryp_obj_get_info((unsigned long)object, &objectInfo);
108 	if (objectInfo.objectType == TEE_TYPE_CORRUPTED_OBJECT)
109 		return;
110 
111 	res = TEE_RestrictObjectUsage1(object, objectUsage);
112 
113 	if (res != TEE_SUCCESS)
114 		TEE_Panic(0);
115 }
116 
117 TEE_Result TEE_RestrictObjectUsage1(TEE_ObjectHandle object, uint32_t objectUsage)
118 {
119 	TEE_Result res;
120 
121 	res = utee_cryp_obj_restrict_usage((unsigned long)object, objectUsage);
122 
123 	if (res != TEE_SUCCESS &&
124 	    res != TEE_ERROR_CORRUPT_OBJECT &&
125 	    res != TEE_ERROR_STORAGE_NOT_AVAILABLE)
126 		TEE_Panic(res);
127 
128 	return res;
129 }
130 
131 TEE_Result TEE_GetObjectBufferAttribute(TEE_ObjectHandle object,
132 					uint32_t attributeID, void *buffer,
133 					uint32_t *size)
134 {
135 	TEE_Result res;
136 	TEE_ObjectInfo info;
137 	uint64_t sz;
138 
139 	res = utee_cryp_obj_get_info((unsigned long)object, &info);
140 	if (res != TEE_SUCCESS)
141 		goto exit;
142 
143 	/* This function only supports reference attributes */
144 	if ((attributeID & TEE_ATTR_BIT_VALUE)) {
145 		res = TEE_ERROR_BAD_PARAMETERS;
146 		goto exit;
147 	}
148 
149 	sz = *size;
150 	res = utee_cryp_obj_get_attr((unsigned long)object, attributeID,
151 				     buffer, &sz);
152 	*size = sz;
153 
154 exit:
155 	if (res != TEE_SUCCESS &&
156 	    res != TEE_ERROR_ITEM_NOT_FOUND &&
157 	    res != TEE_ERROR_SHORT_BUFFER &&
158 	    res != TEE_ERROR_CORRUPT_OBJECT &&
159 	    res != TEE_ERROR_STORAGE_NOT_AVAILABLE)
160 		TEE_Panic(0);
161 
162 	return res;
163 }
164 
165 TEE_Result TEE_GetObjectValueAttribute(TEE_ObjectHandle object,
166 				       uint32_t attributeID, uint32_t *a,
167 				       uint32_t *b)
168 {
169 	TEE_Result res;
170 	TEE_ObjectInfo info;
171 	uint32_t buf[2];
172 	uint64_t size = sizeof(buf);
173 
174 	res = utee_cryp_obj_get_info((unsigned long)object, &info);
175 	if (res != TEE_SUCCESS)
176 		goto exit;
177 
178 	/* This function only supports value attributes */
179 	if (!(attributeID & TEE_ATTR_BIT_VALUE)) {
180 		res = TEE_ERROR_BAD_PARAMETERS;
181 		goto exit;
182 	}
183 
184 	res = utee_cryp_obj_get_attr((unsigned long)object, attributeID, buf,
185 				     &size);
186 
187 exit:
188 	if (res != TEE_SUCCESS &&
189 	    res != TEE_ERROR_ITEM_NOT_FOUND &&
190 	    res != TEE_ERROR_CORRUPT_OBJECT &&
191 	    res != TEE_ERROR_STORAGE_NOT_AVAILABLE)
192 		TEE_Panic(0);
193 
194 	if (size != sizeof(buf))
195 		TEE_Panic(0);
196 
197 	if (res == TEE_SUCCESS) {
198 		*a = buf[0];
199 		*b = buf[1];
200 	}
201 
202 	return res;
203 }
204 
205 void TEE_CloseObject(TEE_ObjectHandle object)
206 {
207 	TEE_Result res;
208 
209 	if (object == TEE_HANDLE_NULL)
210 		return;
211 
212 	res = utee_cryp_obj_close((unsigned long)object);
213 	if (res != TEE_SUCCESS)
214 		TEE_Panic(0);
215 }
216 
217 /* Data and Key Storage API  - Transient Object Functions */
218 
219 TEE_Result TEE_AllocateTransientObject(TEE_ObjectType objectType,
220 				       uint32_t maxKeySize,
221 				       TEE_ObjectHandle *object)
222 {
223 	TEE_Result res;
224 	uint32_t obj;
225 
226 	res = utee_cryp_obj_alloc(objectType, maxKeySize, &obj);
227 
228 	if (res != TEE_SUCCESS &&
229 	    res != TEE_ERROR_OUT_OF_MEMORY &&
230 	    res != TEE_ERROR_NOT_SUPPORTED)
231 		TEE_Panic(0);
232 
233 	if (res == TEE_SUCCESS)
234 		*object = (TEE_ObjectHandle)(uintptr_t)obj;
235 
236 	return res;
237 }
238 
239 void TEE_FreeTransientObject(TEE_ObjectHandle object)
240 {
241 	TEE_Result res;
242 	TEE_ObjectInfo info;
243 
244 	if (object == TEE_HANDLE_NULL)
245 		return;
246 
247 	res = utee_cryp_obj_get_info((unsigned long)object, &info);
248 	if (res != TEE_SUCCESS)
249 		TEE_Panic(0);
250 
251 	if ((info.handleFlags & TEE_HANDLE_FLAG_PERSISTENT) != 0)
252 		TEE_Panic(0);
253 
254 	res = utee_cryp_obj_close((unsigned long)object);
255 	if (res != TEE_SUCCESS)
256 		TEE_Panic(0);
257 }
258 
259 void TEE_ResetTransientObject(TEE_ObjectHandle object)
260 {
261 	TEE_Result res;
262 	TEE_ObjectInfo info;
263 
264 	if (object == TEE_HANDLE_NULL)
265 		return;
266 
267 	res = utee_cryp_obj_get_info((unsigned long)object, &info);
268 	if (res != TEE_SUCCESS)
269 		TEE_Panic(0);
270 
271 	if ((info.handleFlags & TEE_HANDLE_FLAG_PERSISTENT) != 0)
272 		TEE_Panic(0);
273 
274 	res = utee_cryp_obj_reset((unsigned long)object);
275 	if (res != TEE_SUCCESS)
276 		TEE_Panic(0);
277 }
278 
279 TEE_Result TEE_PopulateTransientObject(TEE_ObjectHandle object,
280 				       TEE_Attribute *attrs,
281 				       uint32_t attrCount)
282 {
283 	TEE_Result res;
284 	TEE_ObjectInfo info;
285 	struct utee_attribute ua[attrCount];
286 
287 	res = utee_cryp_obj_get_info((unsigned long)object, &info);
288 	if (res != TEE_SUCCESS)
289 		TEE_Panic(0);
290 
291 	/* Must be a transient object */
292 	if ((info.handleFlags & TEE_HANDLE_FLAG_PERSISTENT) != 0)
293 		TEE_Panic(0);
294 
295 	/* Must not be initialized already */
296 	if ((info.handleFlags & TEE_HANDLE_FLAG_INITIALIZED) != 0)
297 		TEE_Panic(0);
298 
299 	__utee_from_attr(ua, attrs, attrCount);
300 	res = utee_cryp_obj_populate((unsigned long)object, ua, attrCount);
301 	if (res != TEE_SUCCESS && res != TEE_ERROR_BAD_PARAMETERS)
302 		TEE_Panic(res);
303 	return res;
304 }
305 
306 void TEE_InitRefAttribute(TEE_Attribute *attr, uint32_t attributeID,
307 			  void *buffer, uint32_t length)
308 {
309 	if (attr == NULL)
310 		TEE_Panic(0);
311 	if ((attributeID & TEE_ATTR_BIT_VALUE) != 0)
312 		TEE_Panic(0);
313 	attr->attributeID = attributeID;
314 	attr->content.ref.buffer = buffer;
315 	attr->content.ref.length = length;
316 }
317 
318 void TEE_InitValueAttribute(TEE_Attribute *attr, uint32_t attributeID,
319 			    uint32_t a, uint32_t b)
320 {
321 	if (attr == NULL)
322 		TEE_Panic(0);
323 	if ((attributeID & TEE_ATTR_BIT_VALUE) == 0)
324 		TEE_Panic(0);
325 	attr->attributeID = attributeID;
326 	attr->content.value.a = a;
327 	attr->content.value.b = b;
328 }
329 
330 /*
331  * Use of this function is deprecated
332  * new code SHOULD use the TEE_CopyObjectAttributes1 function instead
333  * These functions will be removed at some future major revision of
334  * this specification
335  */
336 void TEE_CopyObjectAttributes(TEE_ObjectHandle destObject,
337 			      TEE_ObjectHandle srcObject)
338 {
339 	TEE_Result res;
340 	TEE_ObjectInfo src_info;
341 
342 	res = utee_cryp_obj_get_info((unsigned long)srcObject, &src_info);
343 	if (src_info.objectType == TEE_TYPE_CORRUPTED_OBJECT)
344 		return;
345 
346 	res = TEE_CopyObjectAttributes1(destObject, srcObject);
347 	if (res != TEE_SUCCESS)
348 		TEE_Panic(0);
349 }
350 
351 TEE_Result TEE_CopyObjectAttributes1(TEE_ObjectHandle destObject,
352 			      TEE_ObjectHandle srcObject)
353 {
354 	TEE_Result res;
355 	TEE_ObjectInfo dst_info;
356 	TEE_ObjectInfo src_info;
357 
358 	res = utee_cryp_obj_get_info((unsigned long)destObject, &dst_info);
359 	if (res != TEE_SUCCESS)
360 		goto exit;
361 
362 	res = utee_cryp_obj_get_info((unsigned long)srcObject, &src_info);
363 	if (res != TEE_SUCCESS)
364 		goto exit;
365 
366 	if (!(src_info.handleFlags & TEE_HANDLE_FLAG_INITIALIZED))
367 		TEE_Panic(0);
368 
369 	if ((dst_info.handleFlags & TEE_HANDLE_FLAG_PERSISTENT))
370 		TEE_Panic(0);
371 
372 	if ((dst_info.handleFlags & TEE_HANDLE_FLAG_INITIALIZED))
373 		TEE_Panic(0);
374 
375 	res = utee_cryp_obj_copy((unsigned long)destObject,
376 				 (unsigned long)srcObject);
377 
378 exit:
379 	if (res != TEE_SUCCESS &&
380 	    res != TEE_ERROR_CORRUPT_OBJECT &&
381 	    res != TEE_ERROR_STORAGE_NOT_AVAILABLE)
382 		TEE_Panic(res);
383 
384 	return res;
385 }
386 
387 TEE_Result TEE_GenerateKey(TEE_ObjectHandle object, uint32_t keySize,
388 			   TEE_Attribute *params, uint32_t paramCount)
389 {
390 	TEE_Result res;
391 	struct utee_attribute ua[paramCount];
392 
393 	__utee_from_attr(ua, params, paramCount);
394 	res = utee_cryp_obj_generate_key((unsigned long)object, keySize,
395 					 ua, paramCount);
396 
397 	if (res != TEE_SUCCESS && res != TEE_ERROR_BAD_PARAMETERS)
398 		TEE_Panic(0);
399 
400 	return res;
401 }
402 
403 /* Data and Key Storage API  - Persistent Object Functions */
404 
405 TEE_Result TEE_OpenPersistentObject(uint32_t storageID, void *objectID,
406 				    uint32_t objectIDLen, uint32_t flags,
407 				    TEE_ObjectHandle *object)
408 {
409 	TEE_Result res;
410 	uint32_t obj;
411 
412 	if (!objectID) {
413 		res = TEE_ERROR_ITEM_NOT_FOUND;
414 		goto out;
415 	}
416 
417 	if (objectIDLen > TEE_OBJECT_ID_MAX_LEN) {
418 		res = TEE_ERROR_BAD_PARAMETERS;
419 		goto out;
420 	}
421 
422 	if (!object) {
423 		res = TEE_ERROR_BAD_PARAMETERS;
424 		goto out;
425 	}
426 
427 	res = utee_storage_obj_open(storageID, objectID, objectIDLen, flags,
428 				     &obj);
429 	if (res == TEE_SUCCESS)
430 		*object = (TEE_ObjectHandle)(uintptr_t)obj;
431 
432 out:
433 	if (res != TEE_SUCCESS &&
434 	    res != TEE_ERROR_ITEM_NOT_FOUND &&
435 	    res != TEE_ERROR_ACCESS_CONFLICT &&
436 	    res != TEE_ERROR_OUT_OF_MEMORY &&
437 	    res != TEE_ERROR_CORRUPT_OBJECT &&
438 	    res != TEE_ERROR_STORAGE_NOT_AVAILABLE)
439 		TEE_Panic(0);
440 
441 	return res;
442 }
443 
444 TEE_Result TEE_CreatePersistentObject(uint32_t storageID, void *objectID,
445 				      uint32_t objectIDLen, uint32_t flags,
446 				      TEE_ObjectHandle attributes,
447 				      const void *initialData,
448 				      uint32_t initialDataLen,
449 				      TEE_ObjectHandle *object)
450 {
451 	TEE_Result res;
452 	uint32_t obj;
453 
454 	if (!objectID) {
455 		res = TEE_ERROR_ITEM_NOT_FOUND;
456 		goto err;
457 	}
458 
459 	if (objectIDLen > TEE_OBJECT_ID_MAX_LEN) {
460 		res = TEE_ERROR_BAD_PARAMETERS;
461 		goto err;
462 	}
463 
464 	res = utee_storage_obj_create(storageID, objectID, objectIDLen, flags,
465 				      (unsigned long)attributes, initialData,
466 				      initialDataLen, &obj);
467 	if (res == TEE_SUCCESS) {
468 		if (object)
469 			*object = (TEE_ObjectHandle)(uintptr_t)obj;
470 		else
471 			res = utee_cryp_obj_close(obj);
472 		if (res == TEE_SUCCESS)
473 			goto out;
474 	}
475 err:
476 	if (object)
477 		*object = TEE_HANDLE_NULL;
478 	if (res == TEE_ERROR_ITEM_NOT_FOUND ||
479 	    res == TEE_ERROR_ACCESS_CONFLICT ||
480 	    res == TEE_ERROR_OUT_OF_MEMORY ||
481 	    res == TEE_ERROR_STORAGE_NO_SPACE ||
482 	    res == TEE_ERROR_CORRUPT_OBJECT ||
483 	    res == TEE_ERROR_STORAGE_NOT_AVAILABLE)
484 		return res;
485 	TEE_Panic(0);
486 out:
487 	return TEE_SUCCESS;
488 }
489 
490 /*
491  * Use of this function is deprecated
492  * new code SHOULD use the TEE_CloseAndDeletePersistentObject1 function instead
493  * These functions will be removed at some future major revision of
494  * this specification
495  */
496 void TEE_CloseAndDeletePersistentObject(TEE_ObjectHandle object)
497 {
498 	TEE_Result res;
499 
500 	if (object == TEE_HANDLE_NULL)
501 		return;
502 
503 	res = TEE_CloseAndDeletePersistentObject1(object);
504 
505 	if (res != TEE_SUCCESS)
506 		TEE_Panic(0);
507 }
508 
509 TEE_Result TEE_CloseAndDeletePersistentObject1(TEE_ObjectHandle object)
510 {
511 	TEE_Result res;
512 
513 	if (object == TEE_HANDLE_NULL)
514 		return TEE_ERROR_STORAGE_NOT_AVAILABLE;
515 
516 	res = utee_storage_obj_del((unsigned long)object);
517 
518 	if (res != TEE_SUCCESS && res != TEE_ERROR_STORAGE_NOT_AVAILABLE)
519 		TEE_Panic(0);
520 
521 	return res;
522 }
523 
524 
525 TEE_Result TEE_RenamePersistentObject(TEE_ObjectHandle object,
526 				      const void *newObjectID,
527 				      uint32_t newObjectIDLen)
528 {
529 	TEE_Result res;
530 
531 	if (object == TEE_HANDLE_NULL) {
532 		res = TEE_ERROR_ITEM_NOT_FOUND;
533 		goto out;
534 	}
535 
536 	if (!newObjectID) {
537 		res = TEE_ERROR_BAD_PARAMETERS;
538 		goto out;
539 	}
540 
541 	if (newObjectIDLen > TEE_OBJECT_ID_MAX_LEN) {
542 		res = TEE_ERROR_BAD_PARAMETERS;
543 		goto out;
544 	}
545 
546 	res = utee_storage_obj_rename((unsigned long)object, newObjectID,
547 				      newObjectIDLen);
548 
549 out:
550 	if (res != TEE_SUCCESS &&
551 	    res != TEE_ERROR_ACCESS_CONFLICT &&
552 	    res != TEE_ERROR_CORRUPT_OBJECT &&
553 	    res != TEE_ERROR_STORAGE_NOT_AVAILABLE)
554 		TEE_Panic(0);
555 
556 	return res;
557 }
558 
559 TEE_Result TEE_AllocatePersistentObjectEnumerator(TEE_ObjectEnumHandle *
560 						  objectEnumerator)
561 {
562 	TEE_Result res;
563 	uint32_t oe;
564 
565 	if (!objectEnumerator)
566 		return TEE_ERROR_BAD_PARAMETERS;
567 
568 	res = utee_storage_alloc_enum(&oe);
569 
570 	if (res != TEE_SUCCESS)
571 		oe = TEE_HANDLE_NULL;
572 
573 	*objectEnumerator = (TEE_ObjectEnumHandle)(uintptr_t)oe;
574 
575 	if (res != TEE_SUCCESS &&
576 	    res != TEE_ERROR_ACCESS_CONFLICT)
577 		TEE_Panic(0);
578 
579 	return res;
580 }
581 
582 void TEE_FreePersistentObjectEnumerator(TEE_ObjectEnumHandle objectEnumerator)
583 {
584 	TEE_Result res;
585 
586 	if (objectEnumerator == TEE_HANDLE_NULL)
587 		return;
588 
589 	res = utee_storage_free_enum((unsigned long)objectEnumerator);
590 
591 	if (res != TEE_SUCCESS)
592 		TEE_Panic(0);
593 }
594 
595 void TEE_ResetPersistentObjectEnumerator(TEE_ObjectEnumHandle objectEnumerator)
596 {
597 	TEE_Result res;
598 
599 	if (objectEnumerator == TEE_HANDLE_NULL)
600 		return;
601 
602 	res = utee_storage_reset_enum((unsigned long)objectEnumerator);
603 
604 	if (res != TEE_SUCCESS)
605 		TEE_Panic(0);
606 }
607 
608 TEE_Result TEE_StartPersistentObjectEnumerator(TEE_ObjectEnumHandle
609 					       objectEnumerator,
610 					       uint32_t storageID)
611 {
612 	TEE_Result res;
613 
614 	res = utee_storage_start_enum((unsigned long)objectEnumerator,
615 				      storageID);
616 
617 	if (res != TEE_SUCCESS &&
618 	    res != TEE_ERROR_ITEM_NOT_FOUND &&
619 	    res != TEE_ERROR_CORRUPT_OBJECT &&
620 	    res != TEE_ERROR_STORAGE_NOT_AVAILABLE)
621 		TEE_Panic(0);
622 
623 	return res;
624 }
625 
626 TEE_Result TEE_GetNextPersistentObject(TEE_ObjectEnumHandle objectEnumerator,
627 				       TEE_ObjectInfo *objectInfo,
628 				       void *objectID, uint32_t *objectIDLen)
629 {
630 	TEE_Result res;
631 	uint64_t len;
632 	TEE_ObjectInfo local_info;
633 	TEE_ObjectInfo *pt_info;
634 
635 	if (!objectID) {
636 		res = TEE_ERROR_BAD_PARAMETERS;
637 		goto out;
638 	}
639 
640 	if (!objectIDLen) {
641 		res = TEE_ERROR_BAD_PARAMETERS;
642 		goto out;
643 	}
644 
645 	if (objectInfo)
646 		pt_info = objectInfo;
647 	else
648 		pt_info = &local_info;
649 	len = *objectIDLen;
650 	res = utee_storage_next_enum((unsigned long)objectEnumerator,
651 				     pt_info, objectID, &len);
652 	*objectIDLen = len;
653 
654 out:
655 	if (res != TEE_SUCCESS &&
656 	    res != TEE_ERROR_ITEM_NOT_FOUND &&
657 	    res != TEE_ERROR_CORRUPT_OBJECT &&
658 	    res != TEE_ERROR_STORAGE_NOT_AVAILABLE)
659 		TEE_Panic(0);
660 
661 	return res;
662 }
663 
664 /* Data and Key Storage API  - Data Stream Access Functions */
665 
666 TEE_Result TEE_ReadObjectData(TEE_ObjectHandle object, void *buffer,
667 			      uint32_t size, uint32_t *count)
668 {
669 	TEE_Result res;
670 	uint64_t cnt64;
671 
672 	if (object == TEE_HANDLE_NULL) {
673 		res = TEE_ERROR_BAD_PARAMETERS;
674 		goto out;
675 	}
676 
677 	cnt64 = *count;
678 	res = utee_storage_obj_read((unsigned long)object, buffer, size,
679 				    &cnt64);
680 	*count = cnt64;
681 
682 out:
683 	if (res != TEE_SUCCESS &&
684 	    res != TEE_ERROR_CORRUPT_OBJECT &&
685 	    res != TEE_ERROR_STORAGE_NOT_AVAILABLE)
686 		TEE_Panic(0);
687 
688 	return res;
689 }
690 
691 TEE_Result TEE_WriteObjectData(TEE_ObjectHandle object, void *buffer,
692 			       uint32_t size)
693 {
694 	TEE_Result res;
695 
696 	if (object == TEE_HANDLE_NULL) {
697 		res = TEE_ERROR_BAD_PARAMETERS;
698 		goto out;
699 	}
700 
701 	if (size > TEE_DATA_MAX_POSITION) {
702 		res = TEE_ERROR_OVERFLOW;
703 		goto out;
704 	}
705 
706 	res = utee_storage_obj_write((unsigned long)object, buffer, size);
707 
708 out:
709 	if (res != TEE_SUCCESS &&
710 	    res != TEE_ERROR_STORAGE_NO_SPACE &&
711 	    res != TEE_ERROR_OVERFLOW &&
712 	    res != TEE_ERROR_CORRUPT_OBJECT &&
713 	    res != TEE_ERROR_STORAGE_NOT_AVAILABLE)
714 		TEE_Panic(0);
715 
716 	return res;
717 }
718 
719 TEE_Result TEE_TruncateObjectData(TEE_ObjectHandle object, uint32_t size)
720 {
721 	TEE_Result res;
722 
723 	if (object == TEE_HANDLE_NULL) {
724 		res = TEE_ERROR_BAD_PARAMETERS;
725 		goto out;
726 	}
727 
728 	res = utee_storage_obj_trunc((unsigned long)object, size);
729 
730 out:
731 	if (res != TEE_SUCCESS &&
732 	    res != TEE_ERROR_STORAGE_NO_SPACE &&
733 	    res != TEE_ERROR_CORRUPT_OBJECT &&
734 	    res != TEE_ERROR_STORAGE_NOT_AVAILABLE)
735 		TEE_Panic(0);
736 
737 	return res;
738 }
739 
740 TEE_Result TEE_SeekObjectData(TEE_ObjectHandle object, int32_t offset,
741 			      TEE_Whence whence)
742 {
743 	TEE_Result res;
744 	TEE_ObjectInfo info;
745 
746 	if (object == TEE_HANDLE_NULL) {
747 		res = TEE_ERROR_BAD_PARAMETERS;
748 		goto out;
749 	}
750 
751 	res = utee_cryp_obj_get_info((unsigned long)object, &info);
752 	if (res != TEE_SUCCESS)
753 		goto out;
754 
755 	switch (whence) {
756 	case TEE_DATA_SEEK_SET:
757 		if (offset > 0 && (uint32_t)offset > TEE_DATA_MAX_POSITION) {
758 			res = TEE_ERROR_OVERFLOW;
759 			goto out;
760 		}
761 		break;
762 	case TEE_DATA_SEEK_CUR:
763 		if (offset > 0 &&
764 		    ((uint32_t)offset + info.dataPosition >
765 		     TEE_DATA_MAX_POSITION ||
766 		     (uint32_t)offset + info.dataPosition <
767 		     info.dataPosition)) {
768 			res = TEE_ERROR_OVERFLOW;
769 			goto out;
770 		}
771 		break;
772 	case TEE_DATA_SEEK_END:
773 		if (offset > 0 &&
774 		    ((uint32_t)offset + info.dataSize > TEE_DATA_MAX_POSITION ||
775 		     (uint32_t)offset + info.dataSize < info.dataSize)) {
776 			res = TEE_ERROR_OVERFLOW;
777 			goto out;
778 		}
779 		break;
780 	default:
781 		res = TEE_ERROR_ITEM_NOT_FOUND;
782 		goto out;
783 	}
784 
785 	res = utee_storage_obj_seek((unsigned long)object, offset, whence);
786 
787 out:
788 	if (res != TEE_SUCCESS &&
789 	    res != TEE_ERROR_OVERFLOW &&
790 	    res != TEE_ERROR_CORRUPT_OBJECT &&
791 	    res != TEE_ERROR_STORAGE_NOT_AVAILABLE)
792 		TEE_Panic(0);
793 
794 	return res;
795 }
796