11bb92983SJerome Forissier // SPDX-License-Identifier: BSD-2-Clause 2b0104773SPascal Brand /* 3b0104773SPascal Brand * Copyright (c) 2014, STMicroelectronics International N.V. 4b0104773SPascal Brand */ 5b0104773SPascal Brand #include <stdlib.h> 6b0104773SPascal Brand #include <string.h> 7b0104773SPascal Brand 8b0104773SPascal Brand #include <tee_api.h> 9b0104773SPascal Brand #include <utee_syscalls.h> 10e86f1266SJens Wiklander #include "tee_api_private.h" 11b0104773SPascal Brand 12b0104773SPascal Brand #define TEE_USAGE_DEFAULT 0xffffffff 13b0104773SPascal Brand 14e86f1266SJens Wiklander void __utee_from_attr(struct utee_attribute *ua, const TEE_Attribute *attrs, 15e86f1266SJens Wiklander uint32_t attr_count) 16e86f1266SJens Wiklander { 17e86f1266SJens Wiklander size_t n; 18e86f1266SJens Wiklander 19e86f1266SJens Wiklander for (n = 0; n < attr_count; n++) { 20e86f1266SJens Wiklander ua[n].attribute_id = attrs[n].attributeID; 21b9416909SJens Wiklander if (attrs[n].attributeID & TEE_ATTR_FLAG_VALUE) { 22e86f1266SJens Wiklander ua[n].a = attrs[n].content.value.a; 23e86f1266SJens Wiklander ua[n].b = attrs[n].content.value.b; 24e86f1266SJens Wiklander } else { 25e86f1266SJens Wiklander ua[n].a = (uintptr_t)attrs[n].content.ref.buffer; 26e86f1266SJens Wiklander ua[n].b = attrs[n].content.ref.length; 27e86f1266SJens Wiklander } 28e86f1266SJens Wiklander } 29e86f1266SJens Wiklander } 30e86f1266SJens Wiklander 314f4374c8SJens Wiklander void __utee_from_gp11_attr(struct utee_attribute *ua, 324f4374c8SJens Wiklander const __GP11_TEE_Attribute *attrs, 334f4374c8SJens Wiklander uint32_t attr_count) 344f4374c8SJens Wiklander { 354f4374c8SJens Wiklander size_t n = 0; 364f4374c8SJens Wiklander 374f4374c8SJens Wiklander for (n = 0; n < attr_count; n++) { 384f4374c8SJens Wiklander ua[n].attribute_id = attrs[n].attributeID; 394f4374c8SJens Wiklander if (attrs[n].attributeID & TEE_ATTR_FLAG_VALUE) { 404f4374c8SJens Wiklander ua[n].a = attrs[n].content.value.a; 414f4374c8SJens Wiklander ua[n].b = attrs[n].content.value.b; 424f4374c8SJens Wiklander } else { 434f4374c8SJens Wiklander ua[n].a = (uintptr_t)attrs[n].content.ref.buffer; 444f4374c8SJens Wiklander ua[n].b = attrs[n].content.ref.length; 454f4374c8SJens Wiklander } 464f4374c8SJens Wiklander } 474f4374c8SJens Wiklander } 484f4374c8SJens Wiklander 49b0104773SPascal Brand /* Data and Key Storage API - Generic Object Functions */ 507583c59eSCedric Chaumont /* 517583c59eSCedric Chaumont * Use of this function is deprecated 527583c59eSCedric Chaumont * new code SHOULD use the TEE_GetObjectInfo1 function instead 537583c59eSCedric Chaumont * These functions will be removed at some future major revision of 547583c59eSCedric Chaumont * this specification 557583c59eSCedric Chaumont */ 56b0104773SPascal Brand void TEE_GetObjectInfo(TEE_ObjectHandle object, TEE_ObjectInfo *objectInfo) 57b0104773SPascal Brand { 5875d6a373SJens Wiklander struct utee_object_info info = { }; 5975d6a373SJens Wiklander TEE_Result res = TEE_SUCCESS; 60b0104773SPascal Brand 6175d6a373SJens Wiklander res = _utee_cryp_obj_get_info((unsigned long)object, &info); 627583c59eSCedric Chaumont 63b0104773SPascal Brand if (res != TEE_SUCCESS) 64b0104773SPascal Brand TEE_Panic(res); 657583c59eSCedric Chaumont 6675d6a373SJens Wiklander if (info.obj_type == TEE_TYPE_CORRUPTED_OBJECT) { 67d372a47cSJens Wiklander objectInfo->objectSize = 0; 68d372a47cSJens Wiklander objectInfo->maxObjectSize = 0; 69d372a47cSJens Wiklander objectInfo->objectUsage = 0; 70d372a47cSJens Wiklander objectInfo->dataSize = 0; 71d372a47cSJens Wiklander objectInfo->dataPosition = 0; 72d372a47cSJens Wiklander objectInfo->handleFlags = 0; 73d372a47cSJens Wiklander } else { 74d372a47cSJens Wiklander objectInfo->objectType = info.obj_type; 75d372a47cSJens Wiklander objectInfo->objectSize = info.obj_size; 76d372a47cSJens Wiklander objectInfo->maxObjectSize = info.max_obj_size; 77d372a47cSJens Wiklander objectInfo->objectUsage = info.obj_usage; 78d372a47cSJens Wiklander objectInfo->dataSize = info.data_size; 79d372a47cSJens Wiklander objectInfo->dataPosition = info.data_pos; 80d372a47cSJens Wiklander objectInfo->handleFlags = info.handle_flags; 81d372a47cSJens Wiklander } 82d372a47cSJens Wiklander } 83d372a47cSJens Wiklander 84d372a47cSJens Wiklander void __GP11_TEE_GetObjectInfo(TEE_ObjectHandle object, 85d372a47cSJens Wiklander __GP11_TEE_ObjectInfo *objectInfo) 86d372a47cSJens Wiklander { 87d372a47cSJens Wiklander struct utee_object_info info = { }; 88d372a47cSJens Wiklander TEE_Result res = TEE_SUCCESS; 89d372a47cSJens Wiklander 90d372a47cSJens Wiklander res = _utee_cryp_obj_get_info((unsigned long)object, &info); 91d372a47cSJens Wiklander 92d372a47cSJens Wiklander if (res != TEE_SUCCESS) 93d372a47cSJens Wiklander TEE_Panic(res); 94d372a47cSJens Wiklander 95d372a47cSJens Wiklander if (info.obj_type == TEE_TYPE_CORRUPTED_OBJECT) { 967583c59eSCedric Chaumont objectInfo->keySize = 0; 977583c59eSCedric Chaumont objectInfo->maxKeySize = 0; 987583c59eSCedric Chaumont objectInfo->objectUsage = 0; 997583c59eSCedric Chaumont objectInfo->dataSize = 0; 1007583c59eSCedric Chaumont objectInfo->dataPosition = 0; 1017583c59eSCedric Chaumont objectInfo->handleFlags = 0; 10275d6a373SJens Wiklander } else { 10375d6a373SJens Wiklander objectInfo->objectType = info.obj_type; 10475d6a373SJens Wiklander objectInfo->keySize = info.obj_size; 10575d6a373SJens Wiklander objectInfo->maxKeySize = info.max_obj_size; 10675d6a373SJens Wiklander objectInfo->objectUsage = info.obj_usage; 10775d6a373SJens Wiklander objectInfo->dataSize = info.data_size; 10875d6a373SJens Wiklander objectInfo->dataPosition = info.data_pos; 10975d6a373SJens Wiklander objectInfo->handleFlags = info.handle_flags; 1107583c59eSCedric Chaumont } 111b0104773SPascal Brand } 112b0104773SPascal Brand 113d372a47cSJens Wiklander TEE_Result TEE_GetObjectInfo1(TEE_ObjectHandle object, 114d372a47cSJens Wiklander TEE_ObjectInfo *objectInfo) 115d372a47cSJens Wiklander { 116d372a47cSJens Wiklander struct utee_object_info info = { }; 117d372a47cSJens Wiklander TEE_Result res = TEE_SUCCESS; 118d372a47cSJens Wiklander 119d372a47cSJens Wiklander res = _utee_cryp_obj_get_info((unsigned long)object, &info); 120d372a47cSJens Wiklander 121d372a47cSJens Wiklander if (res != TEE_SUCCESS && 122d372a47cSJens Wiklander res != TEE_ERROR_CORRUPT_OBJECT && 123d372a47cSJens Wiklander res != TEE_ERROR_STORAGE_NOT_AVAILABLE) 124d372a47cSJens Wiklander TEE_Panic(res); 125d372a47cSJens Wiklander 126d372a47cSJens Wiklander objectInfo->objectType = info.obj_type; 127d372a47cSJens Wiklander objectInfo->objectSize = info.obj_size; 128d372a47cSJens Wiklander objectInfo->maxObjectSize = info.max_obj_size; 129d372a47cSJens Wiklander objectInfo->objectUsage = info.obj_usage; 130d372a47cSJens Wiklander objectInfo->dataSize = info.data_size; 131d372a47cSJens Wiklander objectInfo->dataPosition = info.data_pos; 132d372a47cSJens Wiklander objectInfo->handleFlags = info.handle_flags; 133d372a47cSJens Wiklander 134d372a47cSJens Wiklander return res; 135d372a47cSJens Wiklander } 136d372a47cSJens Wiklander 137d372a47cSJens Wiklander TEE_Result __GP11_TEE_GetObjectInfo1(TEE_ObjectHandle object, 138d372a47cSJens Wiklander __GP11_TEE_ObjectInfo *objectInfo) 1397583c59eSCedric Chaumont { 14075d6a373SJens Wiklander struct utee_object_info info = { }; 14175d6a373SJens Wiklander TEE_Result res = TEE_SUCCESS; 1427583c59eSCedric Chaumont 14375d6a373SJens Wiklander res = _utee_cryp_obj_get_info((unsigned long)object, &info); 1447583c59eSCedric Chaumont 145a2e9a830SCedric Chaumont if (res != TEE_SUCCESS && 146a2e9a830SCedric Chaumont res != TEE_ERROR_CORRUPT_OBJECT && 147a2e9a830SCedric Chaumont res != TEE_ERROR_STORAGE_NOT_AVAILABLE) 1487583c59eSCedric Chaumont TEE_Panic(res); 1497583c59eSCedric Chaumont 15075d6a373SJens Wiklander objectInfo->objectType = info.obj_type; 15175d6a373SJens Wiklander objectInfo->keySize = info.obj_size; 15275d6a373SJens Wiklander objectInfo->maxKeySize = info.max_obj_size; 15375d6a373SJens Wiklander objectInfo->objectUsage = info.obj_usage; 15475d6a373SJens Wiklander objectInfo->dataSize = info.data_size; 15575d6a373SJens Wiklander objectInfo->dataPosition = info.data_pos; 15675d6a373SJens Wiklander objectInfo->handleFlags = info.handle_flags; 15775d6a373SJens Wiklander 1587583c59eSCedric Chaumont return res; 1597583c59eSCedric Chaumont } 1607583c59eSCedric Chaumont 1617583c59eSCedric Chaumont /* 1627583c59eSCedric Chaumont * Use of this function is deprecated 1637583c59eSCedric Chaumont * new code SHOULD use the TEE_RestrictObjectUsage1 function instead 1647583c59eSCedric Chaumont * These functions will be removed at some future major revision of 1657583c59eSCedric Chaumont * this specification 1667583c59eSCedric Chaumont */ 167b0104773SPascal Brand void TEE_RestrictObjectUsage(TEE_ObjectHandle object, uint32_t objectUsage) 168b0104773SPascal Brand { 16975d6a373SJens Wiklander struct utee_object_info info = { }; 17075d6a373SJens Wiklander TEE_Result res = TEE_SUCCESS; 1717583c59eSCedric Chaumont 17275d6a373SJens Wiklander res = _utee_cryp_obj_get_info((unsigned long)object, &info); 17375d6a373SJens Wiklander if (info.obj_type == TEE_TYPE_CORRUPTED_OBJECT) 1747583c59eSCedric Chaumont return; 1757583c59eSCedric Chaumont 1767583c59eSCedric Chaumont res = TEE_RestrictObjectUsage1(object, objectUsage); 177b0104773SPascal Brand 178b0104773SPascal Brand if (res != TEE_SUCCESS) 179b36311adSJerome Forissier TEE_Panic(res); 180b0104773SPascal Brand } 181b0104773SPascal Brand 1827583c59eSCedric Chaumont TEE_Result TEE_RestrictObjectUsage1(TEE_ObjectHandle object, uint32_t objectUsage) 1837583c59eSCedric Chaumont { 1847583c59eSCedric Chaumont TEE_Result res; 1857583c59eSCedric Chaumont 1862c028fdeSJerome Forissier res = _utee_cryp_obj_restrict_usage((unsigned long)object, 1872c028fdeSJerome Forissier objectUsage); 1887583c59eSCedric Chaumont 189a2e9a830SCedric Chaumont if (res != TEE_SUCCESS && 190a2e9a830SCedric Chaumont res != TEE_ERROR_CORRUPT_OBJECT && 191a2e9a830SCedric Chaumont res != TEE_ERROR_STORAGE_NOT_AVAILABLE) 192a2e9a830SCedric Chaumont TEE_Panic(res); 1937583c59eSCedric Chaumont 1947583c59eSCedric Chaumont return res; 1957583c59eSCedric Chaumont } 1967583c59eSCedric Chaumont 197b0104773SPascal Brand TEE_Result TEE_GetObjectBufferAttribute(TEE_ObjectHandle object, 198b0104773SPascal Brand uint32_t attributeID, void *buffer, 19991c84248SJens Wiklander size_t *size) 200b0104773SPascal Brand { 20175d6a373SJens Wiklander struct utee_object_info info = { }; 20275d6a373SJens Wiklander TEE_Result res = TEE_SUCCESS; 20375d6a373SJens Wiklander uint64_t sz = 0; 204b0104773SPascal Brand 2056915bbbbSJens Wiklander __utee_check_inout_annotation(size, sizeof(*size)); 2066915bbbbSJens Wiklander 2072c028fdeSJerome Forissier res = _utee_cryp_obj_get_info((unsigned long)object, &info); 208b0104773SPascal Brand if (res != TEE_SUCCESS) 209a2e9a830SCedric Chaumont goto exit; 210b0104773SPascal Brand 211b0104773SPascal Brand /* This function only supports reference attributes */ 212b9416909SJens Wiklander if ((attributeID & TEE_ATTR_FLAG_VALUE)) { 213a2e9a830SCedric Chaumont res = TEE_ERROR_BAD_PARAMETERS; 214a2e9a830SCedric Chaumont goto exit; 215a2e9a830SCedric Chaumont } 216b0104773SPascal Brand 217e86f1266SJens Wiklander sz = *size; 2182c028fdeSJerome Forissier res = _utee_cryp_obj_get_attr((unsigned long)object, attributeID, 219e86f1266SJens Wiklander buffer, &sz); 220e86f1266SJens Wiklander *size = sz; 221b0104773SPascal Brand 222a2e9a830SCedric Chaumont exit: 2230ed6a6caSCedric Chaumont if (res != TEE_SUCCESS && 2240ed6a6caSCedric Chaumont res != TEE_ERROR_ITEM_NOT_FOUND && 2250ed6a6caSCedric Chaumont res != TEE_ERROR_SHORT_BUFFER && 2260ed6a6caSCedric Chaumont res != TEE_ERROR_CORRUPT_OBJECT && 2270ed6a6caSCedric Chaumont res != TEE_ERROR_STORAGE_NOT_AVAILABLE) 228b36311adSJerome Forissier TEE_Panic(res); 229b0104773SPascal Brand 230b0104773SPascal Brand return res; 231b0104773SPascal Brand } 232b0104773SPascal Brand 23391c84248SJens Wiklander TEE_Result __GP11_TEE_GetObjectBufferAttribute(TEE_ObjectHandle object, 23491c84248SJens Wiklander uint32_t attributeID, 23591c84248SJens Wiklander void *buffer, uint32_t *size) 23691c84248SJens Wiklander { 23791c84248SJens Wiklander TEE_Result res = TEE_SUCCESS; 23891c84248SJens Wiklander size_t l = 0; 23991c84248SJens Wiklander 24091c84248SJens Wiklander __utee_check_inout_annotation(size, sizeof(*size)); 24191c84248SJens Wiklander l = *size; 24291c84248SJens Wiklander res = TEE_GetObjectBufferAttribute(object, attributeID, buffer, &l); 24391c84248SJens Wiklander *size = l; 24491c84248SJens Wiklander return res; 24591c84248SJens Wiklander } 24691c84248SJens Wiklander 247b0104773SPascal Brand TEE_Result TEE_GetObjectValueAttribute(TEE_ObjectHandle object, 248b0104773SPascal Brand uint32_t attributeID, uint32_t *a, 249b0104773SPascal Brand uint32_t *b) 250b0104773SPascal Brand { 25175d6a373SJens Wiklander struct utee_object_info info = { }; 25275d6a373SJens Wiklander TEE_Result res = TEE_SUCCESS; 253b0104773SPascal Brand uint32_t buf[2]; 254e86f1266SJens Wiklander uint64_t size = sizeof(buf); 255b0104773SPascal Brand 2566915bbbbSJens Wiklander if (a) 2576915bbbbSJens Wiklander __utee_check_out_annotation(a, sizeof(*a)); 2586915bbbbSJens Wiklander if (b) 2596915bbbbSJens Wiklander __utee_check_out_annotation(b, sizeof(*b)); 2606915bbbbSJens Wiklander 2612c028fdeSJerome Forissier res = _utee_cryp_obj_get_info((unsigned long)object, &info); 262b0104773SPascal Brand if (res != TEE_SUCCESS) 263a2e9a830SCedric Chaumont goto exit; 264b0104773SPascal Brand 265b0104773SPascal Brand /* This function only supports value attributes */ 266b9416909SJens Wiklander if (!(attributeID & TEE_ATTR_FLAG_VALUE)) { 267a2e9a830SCedric Chaumont res = TEE_ERROR_BAD_PARAMETERS; 268a2e9a830SCedric Chaumont goto exit; 269a2e9a830SCedric Chaumont } 270b0104773SPascal Brand 2712c028fdeSJerome Forissier res = _utee_cryp_obj_get_attr((unsigned long)object, attributeID, buf, 272e86f1266SJens Wiklander &size); 273b0104773SPascal Brand 274a2e9a830SCedric Chaumont exit: 2750ed6a6caSCedric Chaumont if (res != TEE_SUCCESS && 2760ed6a6caSCedric Chaumont res != TEE_ERROR_ITEM_NOT_FOUND && 2770ed6a6caSCedric Chaumont res != TEE_ERROR_CORRUPT_OBJECT && 2780ed6a6caSCedric Chaumont res != TEE_ERROR_STORAGE_NOT_AVAILABLE) 279b36311adSJerome Forissier TEE_Panic(res); 280b0104773SPascal Brand 281b0104773SPascal Brand if (size != sizeof(buf)) 282b0104773SPascal Brand TEE_Panic(0); 283b0104773SPascal Brand 284be96c837SJerome Forissier if (res == TEE_SUCCESS) { 285b9d8f134SJerome Forissier if (a) 286b0104773SPascal Brand *a = buf[0]; 287b9d8f134SJerome Forissier if (b) 288b0104773SPascal Brand *b = buf[1]; 289be96c837SJerome Forissier } 290b0104773SPascal Brand 291b0104773SPascal Brand return res; 292b0104773SPascal Brand } 293b0104773SPascal Brand 294b0104773SPascal Brand void TEE_CloseObject(TEE_ObjectHandle object) 295b0104773SPascal Brand { 296b0104773SPascal Brand TEE_Result res; 297b0104773SPascal Brand 298b0104773SPascal Brand if (object == TEE_HANDLE_NULL) 299b0104773SPascal Brand return; 300b0104773SPascal Brand 3012c028fdeSJerome Forissier res = _utee_cryp_obj_close((unsigned long)object); 302b0104773SPascal Brand if (res != TEE_SUCCESS) 303b36311adSJerome Forissier TEE_Panic(res); 304b0104773SPascal Brand } 305b0104773SPascal Brand 306b0104773SPascal Brand /* Data and Key Storage API - Transient Object Functions */ 307b0104773SPascal Brand 308b0104773SPascal Brand TEE_Result TEE_AllocateTransientObject(TEE_ObjectType objectType, 309edc817baSJens Wiklander uint32_t maxObjectSize, 310edc817baSJens Wiklander TEE_ObjectHandle *object) 311edc817baSJens Wiklander { 312edc817baSJens Wiklander if (objectType == TEE_TYPE_DATA) 313edc817baSJens Wiklander return TEE_ERROR_NOT_SUPPORTED; 314edc817baSJens Wiklander 315edc817baSJens Wiklander return __GP11_TEE_AllocateTransientObject(objectType, maxObjectSize, 316edc817baSJens Wiklander object); 317edc817baSJens Wiklander } 318edc817baSJens Wiklander 319edc817baSJens Wiklander TEE_Result __GP11_TEE_AllocateTransientObject(TEE_ObjectType objectType, 32079a3c601SCedric Chaumont uint32_t maxKeySize, 321b0104773SPascal Brand TEE_ObjectHandle *object) 322b0104773SPascal Brand { 323b0104773SPascal Brand TEE_Result res; 324b0104773SPascal Brand uint32_t obj; 325b0104773SPascal Brand 3266915bbbbSJens Wiklander __utee_check_out_annotation(object, sizeof(*object)); 3276915bbbbSJens Wiklander 3282c028fdeSJerome Forissier res = _utee_cryp_obj_alloc(objectType, maxKeySize, &obj); 329aeb0d927SCedric Chaumont 330aeb0d927SCedric Chaumont if (res != TEE_SUCCESS && 331aeb0d927SCedric Chaumont res != TEE_ERROR_OUT_OF_MEMORY && 332aeb0d927SCedric Chaumont res != TEE_ERROR_NOT_SUPPORTED) 333b36311adSJerome Forissier TEE_Panic(res); 334aeb0d927SCedric Chaumont 335b0104773SPascal Brand if (res == TEE_SUCCESS) 336e86f1266SJens Wiklander *object = (TEE_ObjectHandle)(uintptr_t)obj; 3370ed6a6caSCedric Chaumont 338b0104773SPascal Brand return res; 339b0104773SPascal Brand } 340b0104773SPascal Brand 341b0104773SPascal Brand void TEE_FreeTransientObject(TEE_ObjectHandle object) 342b0104773SPascal Brand { 34375d6a373SJens Wiklander struct utee_object_info info = { }; 34475d6a373SJens Wiklander TEE_Result res = TEE_SUCCESS; 345b0104773SPascal Brand 346b0104773SPascal Brand if (object == TEE_HANDLE_NULL) 347b0104773SPascal Brand return; 348b0104773SPascal Brand 3492c028fdeSJerome Forissier res = _utee_cryp_obj_get_info((unsigned long)object, &info); 350b0104773SPascal Brand if (res != TEE_SUCCESS) 351b36311adSJerome Forissier TEE_Panic(res); 352b0104773SPascal Brand 35375d6a373SJens Wiklander if ((info.handle_flags & TEE_HANDLE_FLAG_PERSISTENT) != 0) 354b0104773SPascal Brand TEE_Panic(0); 355b0104773SPascal Brand 3562c028fdeSJerome Forissier res = _utee_cryp_obj_close((unsigned long)object); 357b0104773SPascal Brand if (res != TEE_SUCCESS) 358b36311adSJerome Forissier TEE_Panic(res); 359b0104773SPascal Brand } 360b0104773SPascal Brand 361b0104773SPascal Brand void TEE_ResetTransientObject(TEE_ObjectHandle object) 362b0104773SPascal Brand { 36375d6a373SJens Wiklander struct utee_object_info info = { }; 36475d6a373SJens Wiklander TEE_Result res = TEE_SUCCESS; 365b0104773SPascal Brand 366b0104773SPascal Brand if (object == TEE_HANDLE_NULL) 367b0104773SPascal Brand return; 368b0104773SPascal Brand 3692c028fdeSJerome Forissier res = _utee_cryp_obj_get_info((unsigned long)object, &info); 370b0104773SPascal Brand if (res != TEE_SUCCESS) 371b36311adSJerome Forissier TEE_Panic(res); 372b0104773SPascal Brand 37375d6a373SJens Wiklander if ((info.handle_flags & TEE_HANDLE_FLAG_PERSISTENT) != 0) 374b0104773SPascal Brand TEE_Panic(0); 375b0104773SPascal Brand 3762c028fdeSJerome Forissier res = _utee_cryp_obj_reset((unsigned long)object); 377b0104773SPascal Brand if (res != TEE_SUCCESS) 378b36311adSJerome Forissier TEE_Panic(res); 379b0104773SPascal Brand } 380b0104773SPascal Brand 381b0104773SPascal Brand TEE_Result TEE_PopulateTransientObject(TEE_ObjectHandle object, 3828f07fe6fSJerome Forissier const TEE_Attribute *attrs, 383b0104773SPascal Brand uint32_t attrCount) 384b0104773SPascal Brand { 385e86f1266SJens Wiklander struct utee_attribute ua[attrCount]; 38675d6a373SJens Wiklander struct utee_object_info info = { }; 38775d6a373SJens Wiklander TEE_Result res = TEE_SUCCESS; 388b0104773SPascal Brand 3896915bbbbSJens Wiklander __utee_check_attr_in_annotation(attrs, attrCount); 3906915bbbbSJens Wiklander 3912c028fdeSJerome Forissier res = _utee_cryp_obj_get_info((unsigned long)object, &info); 392b0104773SPascal Brand if (res != TEE_SUCCESS) 393b36311adSJerome Forissier TEE_Panic(res); 394b0104773SPascal Brand 395b0104773SPascal Brand /* Must be a transient object */ 39675d6a373SJens Wiklander if ((info.handle_flags & TEE_HANDLE_FLAG_PERSISTENT) != 0) 397b0104773SPascal Brand TEE_Panic(0); 398b0104773SPascal Brand 399b0104773SPascal Brand /* Must not be initialized already */ 40075d6a373SJens Wiklander if ((info.handle_flags & TEE_HANDLE_FLAG_INITIALIZED) != 0) 401b0104773SPascal Brand TEE_Panic(0); 402b0104773SPascal Brand 403e86f1266SJens Wiklander __utee_from_attr(ua, attrs, attrCount); 4042c028fdeSJerome Forissier res = _utee_cryp_obj_populate((unsigned long)object, ua, attrCount); 405b0104773SPascal Brand if (res != TEE_SUCCESS && res != TEE_ERROR_BAD_PARAMETERS) 406b0104773SPascal Brand TEE_Panic(res); 407b0104773SPascal Brand return res; 408b0104773SPascal Brand } 409b0104773SPascal Brand 4104f4374c8SJens Wiklander TEE_Result __GP11_TEE_PopulateTransientObject(TEE_ObjectHandle object, 4114f4374c8SJens Wiklander const __GP11_TEE_Attribute *attrs, 4124f4374c8SJens Wiklander uint32_t attrCount) 4134f4374c8SJens Wiklander { 4144f4374c8SJens Wiklander struct utee_attribute ua[attrCount]; 4154f4374c8SJens Wiklander struct utee_object_info info = { }; 4164f4374c8SJens Wiklander TEE_Result res = TEE_SUCCESS; 4174f4374c8SJens Wiklander 4184f4374c8SJens Wiklander __utee_check_gp11_attr_in_annotation(attrs, attrCount); 4194f4374c8SJens Wiklander 4204f4374c8SJens Wiklander res = _utee_cryp_obj_get_info((unsigned long)object, &info); 4214f4374c8SJens Wiklander if (res != TEE_SUCCESS) 4224f4374c8SJens Wiklander TEE_Panic(res); 4234f4374c8SJens Wiklander 4244f4374c8SJens Wiklander /* Must be a transient object */ 4254f4374c8SJens Wiklander if ((info.handle_flags & TEE_HANDLE_FLAG_PERSISTENT) != 0) 4264f4374c8SJens Wiklander TEE_Panic(0); 4274f4374c8SJens Wiklander 4284f4374c8SJens Wiklander /* Must not be initialized already */ 4294f4374c8SJens Wiklander if ((info.handle_flags & TEE_HANDLE_FLAG_INITIALIZED) != 0) 4304f4374c8SJens Wiklander TEE_Panic(0); 4314f4374c8SJens Wiklander 4324f4374c8SJens Wiklander __utee_from_gp11_attr(ua, attrs, attrCount); 4334f4374c8SJens Wiklander res = _utee_cryp_obj_populate((unsigned long)object, ua, attrCount); 4344f4374c8SJens Wiklander if (res != TEE_SUCCESS && res != TEE_ERROR_BAD_PARAMETERS) 4354f4374c8SJens Wiklander TEE_Panic(res); 4364f4374c8SJens Wiklander return res; 4374f4374c8SJens Wiklander } 4384f4374c8SJens Wiklander 439b0104773SPascal Brand void TEE_InitRefAttribute(TEE_Attribute *attr, uint32_t attributeID, 440a62171f8SJens Wiklander const void *buffer, size_t length) 441b0104773SPascal Brand { 4426915bbbbSJens Wiklander __utee_check_out_annotation(attr, sizeof(*attr)); 4436915bbbbSJens Wiklander 444b9416909SJens Wiklander if ((attributeID & TEE_ATTR_FLAG_VALUE) != 0) 445b0104773SPascal Brand TEE_Panic(0); 446b0104773SPascal Brand attr->attributeID = attributeID; 4478f07fe6fSJerome Forissier attr->content.ref.buffer = (void *)buffer; 448b0104773SPascal Brand attr->content.ref.length = length; 449b0104773SPascal Brand } 450b0104773SPascal Brand 4514f4374c8SJens Wiklander void __GP11_TEE_InitRefAttribute(__GP11_TEE_Attribute *attr, 4524f4374c8SJens Wiklander uint32_t attributeID, 4534f4374c8SJens Wiklander const void *buffer, uint32_t length) 4544f4374c8SJens Wiklander { 4554f4374c8SJens Wiklander __utee_check_out_annotation(attr, sizeof(*attr)); 4564f4374c8SJens Wiklander 4574f4374c8SJens Wiklander if ((attributeID & TEE_ATTR_FLAG_VALUE) != 0) 4584f4374c8SJens Wiklander TEE_Panic(0); 4594f4374c8SJens Wiklander attr->attributeID = attributeID; 4604f4374c8SJens Wiklander attr->content.ref.buffer = (void *)buffer; 4614f4374c8SJens Wiklander attr->content.ref.length = length; 4624f4374c8SJens Wiklander } 4634f4374c8SJens Wiklander 464b0104773SPascal Brand void TEE_InitValueAttribute(TEE_Attribute *attr, uint32_t attributeID, 465b0104773SPascal Brand uint32_t a, uint32_t b) 466b0104773SPascal Brand { 4676915bbbbSJens Wiklander __utee_check_out_annotation(attr, sizeof(*attr)); 4686915bbbbSJens Wiklander 469b9416909SJens Wiklander if ((attributeID & TEE_ATTR_FLAG_VALUE) == 0) 470b0104773SPascal Brand TEE_Panic(0); 471b0104773SPascal Brand attr->attributeID = attributeID; 472b0104773SPascal Brand attr->content.value.a = a; 473b0104773SPascal Brand attr->content.value.b = b; 474b0104773SPascal Brand } 475b0104773SPascal Brand 4764f4374c8SJens Wiklander void __GP11_TEE_InitValueAttribute(__GP11_TEE_Attribute *attr, 4774f4374c8SJens Wiklander uint32_t attributeID, 4784f4374c8SJens Wiklander uint32_t a, uint32_t b) 4794f4374c8SJens Wiklander { 4804f4374c8SJens Wiklander __utee_check_out_annotation(attr, sizeof(*attr)); 4814f4374c8SJens Wiklander 4824f4374c8SJens Wiklander if ((attributeID & TEE_ATTR_FLAG_VALUE) == 0) 4834f4374c8SJens Wiklander TEE_Panic(0); 4844f4374c8SJens Wiklander attr->attributeID = attributeID; 4854f4374c8SJens Wiklander attr->content.value.a = a; 4864f4374c8SJens Wiklander attr->content.value.b = b; 4874f4374c8SJens Wiklander } 4884f4374c8SJens Wiklander 4897583c59eSCedric Chaumont /* 4907583c59eSCedric Chaumont * Use of this function is deprecated 4917583c59eSCedric Chaumont * new code SHOULD use the TEE_CopyObjectAttributes1 function instead 4927583c59eSCedric Chaumont * These functions will be removed at some future major revision of 4937583c59eSCedric Chaumont * this specification 4947583c59eSCedric Chaumont */ 495b0104773SPascal Brand void TEE_CopyObjectAttributes(TEE_ObjectHandle destObject, 496b0104773SPascal Brand TEE_ObjectHandle srcObject) 497b0104773SPascal Brand { 49875d6a373SJens Wiklander struct utee_object_info src_info = { }; 49975d6a373SJens Wiklander TEE_Result res = TEE_SUCCESS; 5007583c59eSCedric Chaumont 5012c028fdeSJerome Forissier res = _utee_cryp_obj_get_info((unsigned long)srcObject, &src_info); 50275d6a373SJens Wiklander if (src_info.obj_type == TEE_TYPE_CORRUPTED_OBJECT) 5037583c59eSCedric Chaumont return; 5047583c59eSCedric Chaumont 5057583c59eSCedric Chaumont res = TEE_CopyObjectAttributes1(destObject, srcObject); 5067583c59eSCedric Chaumont if (res != TEE_SUCCESS) 507b36311adSJerome Forissier TEE_Panic(res); 5087583c59eSCedric Chaumont } 5097583c59eSCedric Chaumont 5107583c59eSCedric Chaumont TEE_Result TEE_CopyObjectAttributes1(TEE_ObjectHandle destObject, 5117583c59eSCedric Chaumont TEE_ObjectHandle srcObject) 5127583c59eSCedric Chaumont { 51375d6a373SJens Wiklander struct utee_object_info dst_info = { }; 51475d6a373SJens Wiklander struct utee_object_info src_info = { }; 51575d6a373SJens Wiklander TEE_Result res = TEE_SUCCESS; 516b0104773SPascal Brand 5172c028fdeSJerome Forissier res = _utee_cryp_obj_get_info((unsigned long)destObject, &dst_info); 518b0104773SPascal Brand if (res != TEE_SUCCESS) 519a2e9a830SCedric Chaumont goto exit; 520b0104773SPascal Brand 5212c028fdeSJerome Forissier res = _utee_cryp_obj_get_info((unsigned long)srcObject, &src_info); 522b0104773SPascal Brand if (res != TEE_SUCCESS) 523a2e9a830SCedric Chaumont goto exit; 524b0104773SPascal Brand 52575d6a373SJens Wiklander if (!(src_info.handle_flags & TEE_HANDLE_FLAG_INITIALIZED)) 526b0104773SPascal Brand TEE_Panic(0); 527a2e9a830SCedric Chaumont 52875d6a373SJens Wiklander if ((dst_info.handle_flags & TEE_HANDLE_FLAG_PERSISTENT)) 529b0104773SPascal Brand TEE_Panic(0); 530a2e9a830SCedric Chaumont 53175d6a373SJens Wiklander if ((dst_info.handle_flags & TEE_HANDLE_FLAG_INITIALIZED)) 532b0104773SPascal Brand TEE_Panic(0); 533b0104773SPascal Brand 5342c028fdeSJerome Forissier res = _utee_cryp_obj_copy((unsigned long)destObject, 535e86f1266SJens Wiklander (unsigned long)srcObject); 5367583c59eSCedric Chaumont 537a2e9a830SCedric Chaumont exit: 538a2e9a830SCedric Chaumont if (res != TEE_SUCCESS && 539a2e9a830SCedric Chaumont res != TEE_ERROR_CORRUPT_OBJECT && 540a2e9a830SCedric Chaumont res != TEE_ERROR_STORAGE_NOT_AVAILABLE) 541a2e9a830SCedric Chaumont TEE_Panic(res); 5427583c59eSCedric Chaumont 5437583c59eSCedric Chaumont return res; 544b0104773SPascal Brand } 545b0104773SPascal Brand 546b0104773SPascal Brand TEE_Result TEE_GenerateKey(TEE_ObjectHandle object, uint32_t keySize, 5478f07fe6fSJerome Forissier const TEE_Attribute *params, uint32_t paramCount) 548b0104773SPascal Brand { 549b0104773SPascal Brand TEE_Result res; 550e86f1266SJens Wiklander struct utee_attribute ua[paramCount]; 551b0104773SPascal Brand 5526915bbbbSJens Wiklander __utee_check_attr_in_annotation(params, paramCount); 5536915bbbbSJens Wiklander 554e86f1266SJens Wiklander __utee_from_attr(ua, params, paramCount); 5552c028fdeSJerome Forissier res = _utee_cryp_obj_generate_key((unsigned long)object, keySize, 556e86f1266SJens Wiklander ua, paramCount); 557b0104773SPascal Brand 558aeb0d927SCedric Chaumont if (res != TEE_SUCCESS && res != TEE_ERROR_BAD_PARAMETERS) 559b36311adSJerome Forissier TEE_Panic(res); 560b0104773SPascal Brand 561b0104773SPascal Brand return res; 562b0104773SPascal Brand } 563b0104773SPascal Brand 5644f4374c8SJens Wiklander TEE_Result __GP11_TEE_GenerateKey(TEE_ObjectHandle object, uint32_t keySize, 5654f4374c8SJens Wiklander const __GP11_TEE_Attribute *params, 5664f4374c8SJens Wiklander uint32_t paramCount) 5674f4374c8SJens Wiklander { 5684f4374c8SJens Wiklander TEE_Result res = TEE_SUCCESS; 5694f4374c8SJens Wiklander struct utee_attribute ua[paramCount]; 5704f4374c8SJens Wiklander 5714f4374c8SJens Wiklander __utee_check_gp11_attr_in_annotation(params, paramCount); 5724f4374c8SJens Wiklander 5734f4374c8SJens Wiklander __utee_from_gp11_attr(ua, params, paramCount); 5744f4374c8SJens Wiklander res = _utee_cryp_obj_generate_key((unsigned long)object, keySize, 5754f4374c8SJens Wiklander ua, paramCount); 5764f4374c8SJens Wiklander 5774f4374c8SJens Wiklander if (res != TEE_SUCCESS && res != TEE_ERROR_BAD_PARAMETERS) 5784f4374c8SJens Wiklander TEE_Panic(res); 5794f4374c8SJens Wiklander 5804f4374c8SJens Wiklander return res; 5814f4374c8SJens Wiklander } 5824f4374c8SJens Wiklander 583b0104773SPascal Brand /* Data and Key Storage API - Persistent Object Functions */ 584b0104773SPascal Brand 5858f07fe6fSJerome Forissier TEE_Result TEE_OpenPersistentObject(uint32_t storageID, const void *objectID, 58664a530f9SJens Wiklander size_t objectIDLen, uint32_t flags, 587b0104773SPascal Brand TEE_ObjectHandle *object) 588b0104773SPascal Brand { 5899b520646SCedric Chaumont TEE_Result res; 590e86f1266SJens Wiklander uint32_t obj; 591b0104773SPascal Brand 5922138a6f8SStefan Schmidt __utee_check_out_annotation(object, sizeof(*object)); 5932138a6f8SStefan Schmidt 5942c028fdeSJerome Forissier res = _utee_storage_obj_open(storageID, objectID, objectIDLen, flags, 595e86f1266SJens Wiklander &obj); 596e86f1266SJens Wiklander if (res == TEE_SUCCESS) 597e86f1266SJens Wiklander *object = (TEE_ObjectHandle)(uintptr_t)obj; 5989b520646SCedric Chaumont 5999b520646SCedric Chaumont if (res != TEE_SUCCESS && 6009b520646SCedric Chaumont res != TEE_ERROR_ITEM_NOT_FOUND && 6019b520646SCedric Chaumont res != TEE_ERROR_ACCESS_CONFLICT && 6029b520646SCedric Chaumont res != TEE_ERROR_OUT_OF_MEMORY && 6039b520646SCedric Chaumont res != TEE_ERROR_CORRUPT_OBJECT && 6049b520646SCedric Chaumont res != TEE_ERROR_STORAGE_NOT_AVAILABLE) 605b36311adSJerome Forissier TEE_Panic(res); 606b0104773SPascal Brand 607172d637bSCedric Auger if (res != TEE_SUCCESS) 60869a3d6beSDaniel Glöckner *object = TEE_HANDLE_NULL; 60969a3d6beSDaniel Glöckner 6109b520646SCedric Chaumont return res; 611b0104773SPascal Brand } 612b0104773SPascal Brand 61364a530f9SJens Wiklander TEE_Result __GP11_TEE_OpenPersistentObject(uint32_t storageID, 61464a530f9SJens Wiklander const void *objectID, 61564a530f9SJens Wiklander uint32_t objectIDLen, uint32_t flags, 61664a530f9SJens Wiklander TEE_ObjectHandle *object) 61764a530f9SJens Wiklander { 61864a530f9SJens Wiklander return TEE_OpenPersistentObject(storageID, objectID, objectIDLen, 61964a530f9SJens Wiklander flags, object); 62064a530f9SJens Wiklander } 62164a530f9SJens Wiklander 6228f07fe6fSJerome Forissier TEE_Result TEE_CreatePersistentObject(uint32_t storageID, const void *objectID, 623*f22e1655SJens Wiklander size_t objectIDLen, uint32_t flags, 624b0104773SPascal Brand TEE_ObjectHandle attributes, 625b0104773SPascal Brand const void *initialData, 626*f22e1655SJens Wiklander size_t initialDataLen, 627b0104773SPascal Brand TEE_ObjectHandle *object) 628b0104773SPascal Brand { 629*f22e1655SJens Wiklander TEE_Result res = TEE_SUCCESS; 630*f22e1655SJens Wiklander uint32_t *obj_ptr = NULL; 631*f22e1655SJens Wiklander uint32_t obj = 0; 632b0104773SPascal Brand 633*f22e1655SJens Wiklander if (object) { 6346915bbbbSJens Wiklander __utee_check_out_annotation(object, sizeof(*object)); 635*f22e1655SJens Wiklander obj_ptr = &obj; 636*f22e1655SJens Wiklander } 637b0104773SPascal Brand 6382c028fdeSJerome Forissier res = _utee_storage_obj_create(storageID, objectID, objectIDLen, flags, 639e86f1266SJens Wiklander (unsigned long)attributes, initialData, 640*f22e1655SJens Wiklander initialDataLen, obj_ptr); 641172d637bSCedric Auger 642*f22e1655SJens Wiklander if (res == TEE_SUCCESS && object) 643172d637bSCedric Auger *object = (TEE_ObjectHandle)(uintptr_t)obj; 644172d637bSCedric Auger 645172d637bSCedric Auger if (res != TEE_SUCCESS && 646172d637bSCedric Auger res != TEE_ERROR_ITEM_NOT_FOUND && 647172d637bSCedric Auger res != TEE_ERROR_ACCESS_CONFLICT && 648172d637bSCedric Auger res != TEE_ERROR_OUT_OF_MEMORY && 649172d637bSCedric Auger res != TEE_ERROR_STORAGE_NO_SPACE && 650172d637bSCedric Auger res != TEE_ERROR_CORRUPT_OBJECT && 651172d637bSCedric Auger res != TEE_ERROR_STORAGE_NOT_AVAILABLE) 652b36311adSJerome Forissier TEE_Panic(res); 653172d637bSCedric Auger 654*f22e1655SJens Wiklander if (res != TEE_SUCCESS && object) 655172d637bSCedric Auger *object = TEE_HANDLE_NULL; 656172d637bSCedric Auger 657172d637bSCedric Auger return res; 658b0104773SPascal Brand } 659b0104773SPascal Brand 660*f22e1655SJens Wiklander TEE_Result __GP11_TEE_CreatePersistentObject(uint32_t storageID, 661*f22e1655SJens Wiklander const void *objectID, 662*f22e1655SJens Wiklander uint32_t objectIDLen, 663*f22e1655SJens Wiklander uint32_t flags, 664*f22e1655SJens Wiklander TEE_ObjectHandle attributes, 665*f22e1655SJens Wiklander const void *initialData, 666*f22e1655SJens Wiklander uint32_t initialDataLen, 667*f22e1655SJens Wiklander TEE_ObjectHandle *object) 668*f22e1655SJens Wiklander { 669*f22e1655SJens Wiklander __utee_check_out_annotation(object, sizeof(*object)); 670*f22e1655SJens Wiklander 671*f22e1655SJens Wiklander return TEE_CreatePersistentObject(storageID, objectID, objectIDLen, 672*f22e1655SJens Wiklander flags, attributes, initialData, 673*f22e1655SJens Wiklander initialDataLen, object); 674*f22e1655SJens Wiklander } 675*f22e1655SJens Wiklander 6767583c59eSCedric Chaumont /* 6777583c59eSCedric Chaumont * Use of this function is deprecated 6787583c59eSCedric Chaumont * new code SHOULD use the TEE_CloseAndDeletePersistentObject1 function instead 6797583c59eSCedric Chaumont * These functions will be removed at some future major revision of 6807583c59eSCedric Chaumont * this specification 6817583c59eSCedric Chaumont */ 682b0104773SPascal Brand void TEE_CloseAndDeletePersistentObject(TEE_ObjectHandle object) 683b0104773SPascal Brand { 684b0104773SPascal Brand TEE_Result res; 685b0104773SPascal Brand 686b0104773SPascal Brand if (object == TEE_HANDLE_NULL) 687b0104773SPascal Brand return; 688b0104773SPascal Brand 6897583c59eSCedric Chaumont res = TEE_CloseAndDeletePersistentObject1(object); 690b0104773SPascal Brand 691b0104773SPascal Brand if (res != TEE_SUCCESS) 692b0104773SPascal Brand TEE_Panic(0); 693b0104773SPascal Brand } 694b0104773SPascal Brand 6957583c59eSCedric Chaumont TEE_Result TEE_CloseAndDeletePersistentObject1(TEE_ObjectHandle object) 6967583c59eSCedric Chaumont { 6977583c59eSCedric Chaumont TEE_Result res; 6987583c59eSCedric Chaumont 6997583c59eSCedric Chaumont if (object == TEE_HANDLE_NULL) 70046cfd17cSJens Wiklander return TEE_SUCCESS; 7017583c59eSCedric Chaumont 7022c028fdeSJerome Forissier res = _utee_storage_obj_del((unsigned long)object); 7037583c59eSCedric Chaumont 7047583c59eSCedric Chaumont if (res != TEE_SUCCESS && res != TEE_ERROR_STORAGE_NOT_AVAILABLE) 705b36311adSJerome Forissier TEE_Panic(res); 7067583c59eSCedric Chaumont 7077583c59eSCedric Chaumont return res; 7087583c59eSCedric Chaumont } 7097583c59eSCedric Chaumont 7107583c59eSCedric Chaumont 711b0104773SPascal Brand TEE_Result TEE_RenamePersistentObject(TEE_ObjectHandle object, 712b0104773SPascal Brand const void *newObjectID, 71379a3c601SCedric Chaumont uint32_t newObjectIDLen) 714b0104773SPascal Brand { 715b0104773SPascal Brand TEE_Result res; 716b0104773SPascal Brand 717a76bf53fSCedric Chaumont if (object == TEE_HANDLE_NULL) { 718a76bf53fSCedric Chaumont res = TEE_ERROR_ITEM_NOT_FOUND; 719a76bf53fSCedric Chaumont goto out; 720a76bf53fSCedric Chaumont } 721b0104773SPascal Brand 7222c028fdeSJerome Forissier res = _utee_storage_obj_rename((unsigned long)object, newObjectID, 723e86f1266SJens Wiklander newObjectIDLen); 724b0104773SPascal Brand 725a76bf53fSCedric Chaumont out: 726a76bf53fSCedric Chaumont if (res != TEE_SUCCESS && 727a76bf53fSCedric Chaumont res != TEE_ERROR_ACCESS_CONFLICT && 728a76bf53fSCedric Chaumont res != TEE_ERROR_CORRUPT_OBJECT && 729a76bf53fSCedric Chaumont res != TEE_ERROR_STORAGE_NOT_AVAILABLE) 730b36311adSJerome Forissier TEE_Panic(res); 731b0104773SPascal Brand 732b0104773SPascal Brand return res; 733b0104773SPascal Brand } 734b0104773SPascal Brand 735b0104773SPascal Brand TEE_Result TEE_AllocatePersistentObjectEnumerator(TEE_ObjectEnumHandle * 736b0104773SPascal Brand objectEnumerator) 737b0104773SPascal Brand { 738b0104773SPascal Brand TEE_Result res; 739e86f1266SJens Wiklander uint32_t oe; 740b0104773SPascal Brand 7416915bbbbSJens Wiklander __utee_check_out_annotation(objectEnumerator, 7426915bbbbSJens Wiklander sizeof(*objectEnumerator)); 743b0104773SPascal Brand 7442c028fdeSJerome Forissier res = _utee_storage_alloc_enum(&oe); 745b0104773SPascal Brand 746b0104773SPascal Brand if (res != TEE_SUCCESS) 747e86f1266SJens Wiklander oe = TEE_HANDLE_NULL; 748e86f1266SJens Wiklander 749e86f1266SJens Wiklander *objectEnumerator = (TEE_ObjectEnumHandle)(uintptr_t)oe; 750b0104773SPascal Brand 75115cd3c30SCedric Chaumont if (res != TEE_SUCCESS && 75215cd3c30SCedric Chaumont res != TEE_ERROR_ACCESS_CONFLICT) 753b36311adSJerome Forissier TEE_Panic(res); 75415cd3c30SCedric Chaumont 755b0104773SPascal Brand return res; 756b0104773SPascal Brand } 757b0104773SPascal Brand 758b0104773SPascal Brand void TEE_FreePersistentObjectEnumerator(TEE_ObjectEnumHandle objectEnumerator) 759b0104773SPascal Brand { 760b0104773SPascal Brand TEE_Result res; 761b0104773SPascal Brand 762b0104773SPascal Brand if (objectEnumerator == TEE_HANDLE_NULL) 763b0104773SPascal Brand return; 764b0104773SPascal Brand 7652c028fdeSJerome Forissier res = _utee_storage_free_enum((unsigned long)objectEnumerator); 766b0104773SPascal Brand 767b0104773SPascal Brand if (res != TEE_SUCCESS) 768b36311adSJerome Forissier TEE_Panic(res); 769b0104773SPascal Brand } 770b0104773SPascal Brand 771b0104773SPascal Brand void TEE_ResetPersistentObjectEnumerator(TEE_ObjectEnumHandle objectEnumerator) 772b0104773SPascal Brand { 773b0104773SPascal Brand TEE_Result res; 774b0104773SPascal Brand 775b0104773SPascal Brand if (objectEnumerator == TEE_HANDLE_NULL) 776b0104773SPascal Brand return; 777b0104773SPascal Brand 7782c028fdeSJerome Forissier res = _utee_storage_reset_enum((unsigned long)objectEnumerator); 779b0104773SPascal Brand 780b0104773SPascal Brand if (res != TEE_SUCCESS) 781b36311adSJerome Forissier TEE_Panic(res); 782b0104773SPascal Brand } 783b0104773SPascal Brand 784b0104773SPascal Brand TEE_Result TEE_StartPersistentObjectEnumerator(TEE_ObjectEnumHandle 785b0104773SPascal Brand objectEnumerator, 786b0104773SPascal Brand uint32_t storageID) 787b0104773SPascal Brand { 788b0104773SPascal Brand TEE_Result res; 789b0104773SPascal Brand 7902c028fdeSJerome Forissier res = _utee_storage_start_enum((unsigned long)objectEnumerator, 791e86f1266SJens Wiklander storageID); 792b0104773SPascal Brand 79315cd3c30SCedric Chaumont if (res != TEE_SUCCESS && 79415cd3c30SCedric Chaumont res != TEE_ERROR_ITEM_NOT_FOUND && 79515cd3c30SCedric Chaumont res != TEE_ERROR_CORRUPT_OBJECT && 79615cd3c30SCedric Chaumont res != TEE_ERROR_STORAGE_NOT_AVAILABLE) 797b36311adSJerome Forissier TEE_Panic(res); 798b0104773SPascal Brand 799b0104773SPascal Brand return res; 800b0104773SPascal Brand } 801b0104773SPascal Brand 802b0104773SPascal Brand TEE_Result TEE_GetNextPersistentObject(TEE_ObjectEnumHandle objectEnumerator, 803b0104773SPascal Brand TEE_ObjectInfo *objectInfo, 80479a3c601SCedric Chaumont void *objectID, uint32_t *objectIDLen) 805b0104773SPascal Brand { 80675d6a373SJens Wiklander struct utee_object_info info = { }; 80775d6a373SJens Wiklander TEE_Result res = TEE_SUCCESS; 80875d6a373SJens Wiklander uint64_t len = 0; 809b0104773SPascal Brand 8106915bbbbSJens Wiklander if (objectInfo) 8116915bbbbSJens Wiklander __utee_check_out_annotation(objectInfo, sizeof(*objectInfo)); 8126915bbbbSJens Wiklander __utee_check_out_annotation(objectIDLen, sizeof(*objectIDLen)); 81315cd3c30SCedric Chaumont 8146915bbbbSJens Wiklander if (!objectID) { 81515cd3c30SCedric Chaumont res = TEE_ERROR_BAD_PARAMETERS; 81615cd3c30SCedric Chaumont goto out; 81715cd3c30SCedric Chaumont } 81815cd3c30SCedric Chaumont 819e86f1266SJens Wiklander len = *objectIDLen; 8202c028fdeSJerome Forissier res = _utee_storage_next_enum((unsigned long)objectEnumerator, 82175d6a373SJens Wiklander &info, objectID, &len); 82275d6a373SJens Wiklander if (objectInfo) { 82375d6a373SJens Wiklander objectInfo->objectType = info.obj_type; 824d372a47cSJens Wiklander objectInfo->objectSize = info.obj_size; 825d372a47cSJens Wiklander objectInfo->maxObjectSize = info.max_obj_size; 826d372a47cSJens Wiklander objectInfo->objectUsage = info.obj_usage; 827d372a47cSJens Wiklander objectInfo->dataSize = info.data_size; 828d372a47cSJens Wiklander objectInfo->dataPosition = info.data_pos; 829d372a47cSJens Wiklander objectInfo->handleFlags = info.handle_flags; 830d372a47cSJens Wiklander } 831d372a47cSJens Wiklander *objectIDLen = len; 832d372a47cSJens Wiklander 833d372a47cSJens Wiklander out: 834d372a47cSJens Wiklander if (res != TEE_SUCCESS && 835d372a47cSJens Wiklander res != TEE_ERROR_ITEM_NOT_FOUND && 836d372a47cSJens Wiklander res != TEE_ERROR_CORRUPT_OBJECT && 837d372a47cSJens Wiklander res != TEE_ERROR_STORAGE_NOT_AVAILABLE) 838d372a47cSJens Wiklander TEE_Panic(res); 839d372a47cSJens Wiklander 840d372a47cSJens Wiklander return res; 841d372a47cSJens Wiklander } 842d372a47cSJens Wiklander 843d372a47cSJens Wiklander TEE_Result 844d372a47cSJens Wiklander __GP11_TEE_GetNextPersistentObject(TEE_ObjectEnumHandle objectEnumerator, 845d372a47cSJens Wiklander __GP11_TEE_ObjectInfo *objectInfo, 846d372a47cSJens Wiklander void *objectID, uint32_t *objectIDLen) 847d372a47cSJens Wiklander { 848d372a47cSJens Wiklander struct utee_object_info info = { }; 849d372a47cSJens Wiklander TEE_Result res = TEE_SUCCESS; 850d372a47cSJens Wiklander uint64_t len = 0; 851d372a47cSJens Wiklander 852d372a47cSJens Wiklander if (objectInfo) 853d372a47cSJens Wiklander __utee_check_out_annotation(objectInfo, sizeof(*objectInfo)); 854d372a47cSJens Wiklander __utee_check_out_annotation(objectIDLen, sizeof(*objectIDLen)); 855d372a47cSJens Wiklander 856d372a47cSJens Wiklander if (!objectID) { 857d372a47cSJens Wiklander res = TEE_ERROR_BAD_PARAMETERS; 858d372a47cSJens Wiklander goto out; 859d372a47cSJens Wiklander } 860d372a47cSJens Wiklander 861d372a47cSJens Wiklander len = *objectIDLen; 862d372a47cSJens Wiklander res = _utee_storage_next_enum((unsigned long)objectEnumerator, 863d372a47cSJens Wiklander &info, objectID, &len); 864d372a47cSJens Wiklander if (objectInfo) { 865d372a47cSJens Wiklander objectInfo->objectType = info.obj_type; 86675d6a373SJens Wiklander objectInfo->keySize = info.obj_size; 86775d6a373SJens Wiklander objectInfo->maxKeySize = info.max_obj_size; 86875d6a373SJens Wiklander objectInfo->objectUsage = info.obj_usage; 86975d6a373SJens Wiklander objectInfo->dataSize = info.data_size; 87075d6a373SJens Wiklander objectInfo->dataPosition = info.data_pos; 87175d6a373SJens Wiklander objectInfo->handleFlags = info.handle_flags; 87275d6a373SJens Wiklander } 873e86f1266SJens Wiklander *objectIDLen = len; 874b0104773SPascal Brand 87515cd3c30SCedric Chaumont out: 87615cd3c30SCedric Chaumont if (res != TEE_SUCCESS && 87715cd3c30SCedric Chaumont res != TEE_ERROR_ITEM_NOT_FOUND && 87815cd3c30SCedric Chaumont res != TEE_ERROR_CORRUPT_OBJECT && 87915cd3c30SCedric Chaumont res != TEE_ERROR_STORAGE_NOT_AVAILABLE) 880b36311adSJerome Forissier TEE_Panic(res); 881b0104773SPascal Brand 882b0104773SPascal Brand return res; 883b0104773SPascal Brand } 884b0104773SPascal Brand 885b0104773SPascal Brand /* Data and Key Storage API - Data Stream Access Functions */ 886b0104773SPascal Brand 887b0104773SPascal Brand TEE_Result TEE_ReadObjectData(TEE_ObjectHandle object, void *buffer, 88879a3c601SCedric Chaumont uint32_t size, uint32_t *count) 889b0104773SPascal Brand { 890b0104773SPascal Brand TEE_Result res; 891e86f1266SJens Wiklander uint64_t cnt64; 892b0104773SPascal Brand 893ae1289baSCedric Chaumont if (object == TEE_HANDLE_NULL) { 894ae1289baSCedric Chaumont res = TEE_ERROR_BAD_PARAMETERS; 895ae1289baSCedric Chaumont goto out; 896ae1289baSCedric Chaumont } 8976915bbbbSJens Wiklander __utee_check_out_annotation(count, sizeof(*count)); 898b0104773SPascal Brand 899e86f1266SJens Wiklander cnt64 = *count; 9002c028fdeSJerome Forissier res = _utee_storage_obj_read((unsigned long)object, buffer, size, 901e86f1266SJens Wiklander &cnt64); 902e86f1266SJens Wiklander *count = cnt64; 903b0104773SPascal Brand 904ae1289baSCedric Chaumont out: 905ae1289baSCedric Chaumont if (res != TEE_SUCCESS && 906ae1289baSCedric Chaumont res != TEE_ERROR_CORRUPT_OBJECT && 907ae1289baSCedric Chaumont res != TEE_ERROR_STORAGE_NOT_AVAILABLE) 908b36311adSJerome Forissier TEE_Panic(res); 909b0104773SPascal Brand 910b0104773SPascal Brand return res; 911b0104773SPascal Brand } 912b0104773SPascal Brand 9138f07fe6fSJerome Forissier TEE_Result TEE_WriteObjectData(TEE_ObjectHandle object, const void *buffer, 91479a3c601SCedric Chaumont uint32_t size) 915b0104773SPascal Brand { 916b0104773SPascal Brand TEE_Result res; 917b0104773SPascal Brand 918ae1289baSCedric Chaumont if (object == TEE_HANDLE_NULL) { 919ae1289baSCedric Chaumont res = TEE_ERROR_BAD_PARAMETERS; 920ae1289baSCedric Chaumont goto out; 921ae1289baSCedric Chaumont } 922ae1289baSCedric Chaumont 923ae1289baSCedric Chaumont if (size > TEE_DATA_MAX_POSITION) { 924ae1289baSCedric Chaumont res = TEE_ERROR_OVERFLOW; 925ae1289baSCedric Chaumont goto out; 926ae1289baSCedric Chaumont } 927b0104773SPascal Brand 9282c028fdeSJerome Forissier res = _utee_storage_obj_write((unsigned long)object, buffer, size); 929b0104773SPascal Brand 930ae1289baSCedric Chaumont out: 931ae1289baSCedric Chaumont if (res != TEE_SUCCESS && 932ae1289baSCedric Chaumont res != TEE_ERROR_STORAGE_NO_SPACE && 933ae1289baSCedric Chaumont res != TEE_ERROR_OVERFLOW && 934ae1289baSCedric Chaumont res != TEE_ERROR_CORRUPT_OBJECT && 935ae1289baSCedric Chaumont res != TEE_ERROR_STORAGE_NOT_AVAILABLE) 936b36311adSJerome Forissier TEE_Panic(res); 937b0104773SPascal Brand 938b0104773SPascal Brand return res; 939b0104773SPascal Brand } 940b0104773SPascal Brand 941b0104773SPascal Brand TEE_Result TEE_TruncateObjectData(TEE_ObjectHandle object, uint32_t size) 942b0104773SPascal Brand { 943b0104773SPascal Brand TEE_Result res; 944b0104773SPascal Brand 945ae1289baSCedric Chaumont if (object == TEE_HANDLE_NULL) { 946ae1289baSCedric Chaumont res = TEE_ERROR_BAD_PARAMETERS; 947ae1289baSCedric Chaumont goto out; 948ae1289baSCedric Chaumont } 949b0104773SPascal Brand 9502c028fdeSJerome Forissier res = _utee_storage_obj_trunc((unsigned long)object, size); 951b0104773SPascal Brand 952ae1289baSCedric Chaumont out: 953ae1289baSCedric Chaumont if (res != TEE_SUCCESS && 954ae1289baSCedric Chaumont res != TEE_ERROR_STORAGE_NO_SPACE && 955ae1289baSCedric Chaumont res != TEE_ERROR_CORRUPT_OBJECT && 956ae1289baSCedric Chaumont res != TEE_ERROR_STORAGE_NOT_AVAILABLE) 957b36311adSJerome Forissier TEE_Panic(res); 958b0104773SPascal Brand 959b0104773SPascal Brand return res; 960b0104773SPascal Brand } 961b0104773SPascal Brand 962b0104773SPascal Brand TEE_Result TEE_SeekObjectData(TEE_ObjectHandle object, int32_t offset, 963b0104773SPascal Brand TEE_Whence whence) 964b0104773SPascal Brand { 96575d6a373SJens Wiklander struct utee_object_info info = { }; 96675d6a373SJens Wiklander TEE_Result res = TEE_SUCCESS; 967b0104773SPascal Brand 968ae1289baSCedric Chaumont if (object == TEE_HANDLE_NULL) { 969ae1289baSCedric Chaumont res = TEE_ERROR_BAD_PARAMETERS; 970ae1289baSCedric Chaumont goto out; 971ae1289baSCedric Chaumont } 972b0104773SPascal Brand 9732c028fdeSJerome Forissier res = _utee_cryp_obj_get_info((unsigned long)object, &info); 974b0104773SPascal Brand if (res != TEE_SUCCESS) 975ae1289baSCedric Chaumont goto out; 976b0104773SPascal Brand 977b0104773SPascal Brand switch (whence) { 978b0104773SPascal Brand case TEE_DATA_SEEK_SET: 979ae1289baSCedric Chaumont if (offset > 0 && (uint32_t)offset > TEE_DATA_MAX_POSITION) { 980ae1289baSCedric Chaumont res = TEE_ERROR_OVERFLOW; 981ae1289baSCedric Chaumont goto out; 982ae1289baSCedric Chaumont } 983b0104773SPascal Brand break; 984b0104773SPascal Brand case TEE_DATA_SEEK_CUR: 985b0104773SPascal Brand if (offset > 0 && 98675d6a373SJens Wiklander ((uint32_t)offset + info.data_pos > TEE_DATA_MAX_POSITION || 98775d6a373SJens Wiklander (uint32_t)offset + info.data_pos < info.data_pos)) { 988ae1289baSCedric Chaumont res = TEE_ERROR_OVERFLOW; 989ae1289baSCedric Chaumont goto out; 990ae1289baSCedric Chaumont } 991b0104773SPascal Brand break; 992b0104773SPascal Brand case TEE_DATA_SEEK_END: 993b0104773SPascal Brand if (offset > 0 && 99475d6a373SJens Wiklander ((uint32_t)offset + info.data_size > 99575d6a373SJens Wiklander TEE_DATA_MAX_POSITION || 99675d6a373SJens Wiklander (uint32_t)offset + info.data_size < info.data_size)) { 997ae1289baSCedric Chaumont res = TEE_ERROR_OVERFLOW; 998ae1289baSCedric Chaumont goto out; 999ae1289baSCedric Chaumont } 1000b0104773SPascal Brand break; 1001b0104773SPascal Brand default: 1002ae1289baSCedric Chaumont res = TEE_ERROR_ITEM_NOT_FOUND; 1003ae1289baSCedric Chaumont goto out; 1004b0104773SPascal Brand } 1005b0104773SPascal Brand 10062c028fdeSJerome Forissier res = _utee_storage_obj_seek((unsigned long)object, offset, whence); 1007b0104773SPascal Brand 1008ae1289baSCedric Chaumont out: 1009ae1289baSCedric Chaumont if (res != TEE_SUCCESS && 1010ae1289baSCedric Chaumont res != TEE_ERROR_OVERFLOW && 1011ae1289baSCedric Chaumont res != TEE_ERROR_CORRUPT_OBJECT && 1012ae1289baSCedric Chaumont res != TEE_ERROR_STORAGE_NOT_AVAILABLE) 1013b36311adSJerome Forissier TEE_Panic(res); 1014b0104773SPascal Brand 1015b0104773SPascal Brand return res; 1016b0104773SPascal Brand } 1017