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