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