1ae8ec5e1SHisping Lin /* 2ae8ec5e1SHisping Lin * Copyright 2017, Rockchip Electronics Co., Ltd 3ae8ec5e1SHisping Lin * hisping lin, <hisping.lin@rock-chips.com> 4ae8ec5e1SHisping Lin * 5ae8ec5e1SHisping Lin * SPDX-License-Identifier: GPL-2.0+ 6ae8ec5e1SHisping Lin */ 7ae8ec5e1SHisping Lin 8ae8ec5e1SHisping Lin #include <common.h> 9bb1ba6acSHisping Lin #include <optee_include/OpteeClientInterface.h> 10ae8ec5e1SHisping Lin #include <optee_include/OpteeClientApiLib.h> 11ae8ec5e1SHisping Lin #include <optee_include/tee_client_api.h> 1278ef5fbdSqiujian #include <optee_include/tee_api_defines.h> 133251364cSHisping Lin #include <boot_rkimg.h> 14a7df4868Stony.xu #include <stdlib.h> 151e8c0e44STony Xu #include <attestation_key.h> 16a7df4868Stony.xu 17a7df4868Stony.xu #define BOOT_FROM_EMMC (1 << 1) 18c7de5349SHisping Lin #define STORAGE_CMD_READ_ATTRIBUTE_HASH 0 19c7de5349SHisping Lin #define STORAGE_CMD_WRITE_ATTRIBUTE_HASH 1 20c7de5349SHisping Lin #define STORAGE_CMD_UBOOT_END_OTP 2 21c7de5349SHisping Lin #define STORAGE_CMD_READ_VBOOTKEY_HASH 3 22c7de5349SHisping Lin #define STORAGE_CMD_WRITE_VBOOTKEY_HASH 4 23c7de5349SHisping Lin #define STORAGE_CMD_READ_ENABLE_FLAG 5 241ef63c75SHisping Lin #define STORAGE_CMD_WRITE_TA_ENCRYPTION_KEY 9 25fbf29bfbSHisping Lin #define STORAGE_CMD_CHECK_SECURITY_LEVEL_FLAG 10 26f39d4289SHisping Lin #define STORAGE_CMD_WRITE_OEM_HUK 11 27d5913350SHisping Lin #define STORAGE_CMD_WRITE_OEM_NS_OTP 12 28d5913350SHisping Lin #define STORAGE_CMD_READ_OEM_NS_OTP 13 2990e849a0Sxb.wang #define STORAGE_CMD_WRITE_OEM_OTP_KEY 14 30a405238aSHisping Lin #define STORAGE_CMD_SET_OEM_HR_OTP_READ_LOCK 15 319deb34f6SHisping Lin #define STORAGE_CMD_OEM_OTP_KEY_IS_WRITTEN 16 32ae8ec5e1SHisping Lin 332f8c34bdSxb.wang #define CRYPTO_SERVICE_CMD_OEM_OTP_KEY_PHYS_CIPHER 0x00000002 34fc3694d6Sxb.wang 35fc3694d6Sxb.wang #define RK_CRYPTO_SERVICE_UUID { 0x0cacdb5d, 0x4fea, 0x466c, \ 36fc3694d6Sxb.wang { 0x97, 0x16, 0x3d, 0x54, 0x16, 0x52, 0x83, 0x0f } } 37fc3694d6Sxb.wang 38ae8ec5e1SHisping Lin static uint8_t b2hs_add_base(uint8_t in) 39ae8ec5e1SHisping Lin { 40ae8ec5e1SHisping Lin if (in > 9) 41ae8ec5e1SHisping Lin return in + 55; 42ae8ec5e1SHisping Lin else 43ae8ec5e1SHisping Lin return in + 48; 44ae8ec5e1SHisping Lin } 45ae8ec5e1SHisping Lin 46c7de5349SHisping Lin static uint32_t b2hs(uint8_t *b, uint8_t *hs, uint32_t blen, uint32_t hslen) 47ae8ec5e1SHisping Lin { 48ae8ec5e1SHisping Lin uint32_t i = 0; 49ae8ec5e1SHisping Lin 50ae8ec5e1SHisping Lin if (blen * 2 + 1 > hslen) 51ae8ec5e1SHisping Lin return 0; 52ae8ec5e1SHisping Lin 53ae8ec5e1SHisping Lin for (; i < blen; i++) { 54ae8ec5e1SHisping Lin hs[i * 2 + 1] = b2hs_add_base(b[i] & 0xf); 55ae8ec5e1SHisping Lin hs[i * 2] = b2hs_add_base(b[i] >> 4); 56ae8ec5e1SHisping Lin } 57ae8ec5e1SHisping Lin hs[blen * 2] = 0; 58ae8ec5e1SHisping Lin 59ae8ec5e1SHisping Lin return blen * 2; 60ae8ec5e1SHisping Lin } 61ae8ec5e1SHisping Lin 622f8c34bdSxb.wang static void crypto_flush_cacheline(uint32_t addr, uint32_t size) 632f8c34bdSxb.wang { 642f8c34bdSxb.wang ulong alignment = CONFIG_SYS_CACHELINE_SIZE; 652f8c34bdSxb.wang ulong aligned_input, aligned_len; 662f8c34bdSxb.wang 672f8c34bdSxb.wang if (!addr || !size) 682f8c34bdSxb.wang return; 692f8c34bdSxb.wang 702f8c34bdSxb.wang /* Must flush dcache before crypto DMA fetch data region */ 712f8c34bdSxb.wang aligned_input = round_down(addr, alignment); 722f8c34bdSxb.wang aligned_len = round_up(size + (addr - aligned_input), alignment); 732f8c34bdSxb.wang flush_cache(aligned_input, aligned_len); 742f8c34bdSxb.wang } 752f8c34bdSxb.wang 76a900eef3SHisping Lin static void crypto_invalidate_cacheline(uint32_t addr, uint32_t size) 77a900eef3SHisping Lin { 78a900eef3SHisping Lin ulong alignment = CONFIG_SYS_CACHELINE_SIZE; 79a900eef3SHisping Lin ulong aligned_input, aligned_len; 80a900eef3SHisping Lin 81a900eef3SHisping Lin if (!addr || !size) 82a900eef3SHisping Lin return; 83a900eef3SHisping Lin 84a900eef3SHisping Lin /* Must invalidate dcache after crypto DMA write data region */ 85a900eef3SHisping Lin aligned_input = round_down(addr, alignment); 86a900eef3SHisping Lin aligned_len = round_up(size + (addr - aligned_input), alignment); 87a900eef3SHisping Lin invalidate_dcache_range(aligned_input, aligned_input + aligned_len); 88a900eef3SHisping Lin } 89a900eef3SHisping Lin 90c7de5349SHisping Lin static uint32_t trusty_base_write_security_data(char *filename, 91c7de5349SHisping Lin uint32_t filename_size, 92c7de5349SHisping Lin uint8_t *data, 93c7de5349SHisping Lin uint32_t data_size) 94ae8ec5e1SHisping Lin { 95ae8ec5e1SHisping Lin TEEC_Result TeecResult; 96ae8ec5e1SHisping Lin TEEC_Context TeecContext; 97ae8ec5e1SHisping Lin TEEC_Session TeecSession; 98ae8ec5e1SHisping Lin uint32_t ErrorOrigin; 99ae8ec5e1SHisping Lin TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 100ae8ec5e1SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 101ae8ec5e1SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 102ae8ec5e1SHisping Lin TEEC_Operation TeecOperation = {0}; 1033251364cSHisping Lin struct blk_desc *dev_desc; 1043251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 1056651d4c0SJason Zhu if (!dev_desc) { 1066651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 1076651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 1086651d4c0SJason Zhu } 1093251364cSHisping Lin 110f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 111f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 112f4e1db95SHisping Lin return TeecResult; 113ae8ec5e1SHisping Lin 114ae8ec5e1SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 115f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 116f4e1db95SHisping Lin return TeecResult; 117ae8ec5e1SHisping Lin 1183251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 1193251364cSHisping Lin TEEC_NONE, 1203251364cSHisping Lin TEEC_NONE, 1213251364cSHisping Lin TEEC_NONE); 1223251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 123b9a7e756SHisping Lin if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0) 124b9a7e756SHisping Lin TeecOperation.params[0].value.a = 1; 125b9a7e756SHisping Lin else 126b9a7e756SHisping Lin TeecOperation.params[0].value.a = 0; 1273251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 1283251364cSHisping Lin TeecOperation.params[0].value.a = 0; 1293251364cSHisping Lin #endif 1303251364cSHisping Lin 131ae8ec5e1SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 132ae8ec5e1SHisping Lin &TeecSession, 133ae8ec5e1SHisping Lin TeecUuid, 134ae8ec5e1SHisping Lin TEEC_LOGIN_PUBLIC, 135ae8ec5e1SHisping Lin NULL, 1363251364cSHisping Lin &TeecOperation, 137ae8ec5e1SHisping Lin &ErrorOrigin); 138f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 139f4e1db95SHisping Lin return TeecResult; 140ae8ec5e1SHisping Lin 141ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 142ae8ec5e1SHisping Lin 143c7de5349SHisping Lin SharedMem0.size = filename_size; 144ae8ec5e1SHisping Lin SharedMem0.flags = 0; 145ae8ec5e1SHisping Lin 146ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 147f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 148f4e1db95SHisping Lin goto exit; 149ae8ec5e1SHisping Lin 150c7de5349SHisping Lin memcpy(SharedMem0.buffer, filename, SharedMem0.size); 151ae8ec5e1SHisping Lin 152ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem1 = {0}; 153ae8ec5e1SHisping Lin 154c7de5349SHisping Lin SharedMem1.size = data_size; 155c7de5349SHisping Lin SharedMem1.flags = 0; 156c7de5349SHisping Lin 157c7de5349SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 158c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 159c7de5349SHisping Lin goto exit; 160c7de5349SHisping Lin 161c7de5349SHisping Lin memcpy(SharedMem1.buffer, data, SharedMem1.size); 162c7de5349SHisping Lin 163c7de5349SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 164c7de5349SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 165c7de5349SHisping Lin 166c7de5349SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 167c7de5349SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem1.size; 168c7de5349SHisping Lin 169c7de5349SHisping Lin 170c7de5349SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 171c7de5349SHisping Lin TEEC_MEMREF_TEMP_INOUT, 172c7de5349SHisping Lin TEEC_NONE, 173c7de5349SHisping Lin TEEC_NONE); 174c7de5349SHisping Lin 175c7de5349SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 176c7de5349SHisping Lin 1, 177c7de5349SHisping Lin &TeecOperation, 178c7de5349SHisping Lin &ErrorOrigin); 179c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 180c7de5349SHisping Lin goto exit; 181c7de5349SHisping Lin exit: 182c7de5349SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 183c7de5349SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem1); 184c7de5349SHisping Lin TEEC_CloseSession(&TeecSession); 185c7de5349SHisping Lin TEEC_FinalizeContext(&TeecContext); 186c7de5349SHisping Lin 187c7de5349SHisping Lin return TeecResult; 188c7de5349SHisping Lin } 189c7de5349SHisping Lin 190c7de5349SHisping Lin static uint32_t trusty_base_read_security_data(char *filename, 191c7de5349SHisping Lin uint32_t filename_size, 192c7de5349SHisping Lin uint8_t *data, 193c7de5349SHisping Lin uint32_t data_size) 194c7de5349SHisping Lin { 195c7de5349SHisping Lin TEEC_Result TeecResult; 196c7de5349SHisping Lin TEEC_Context TeecContext; 197c7de5349SHisping Lin TEEC_Session TeecSession; 198c7de5349SHisping Lin uint32_t ErrorOrigin; 199c7de5349SHisping Lin TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 200c7de5349SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 201c7de5349SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 202c7de5349SHisping Lin TEEC_Operation TeecOperation = {0}; 203c7de5349SHisping Lin 204c7de5349SHisping Lin struct blk_desc *dev_desc; 205c7de5349SHisping Lin dev_desc = rockchip_get_bootdev(); 206c7de5349SHisping Lin if (!dev_desc) { 207c7de5349SHisping Lin printf("%s: dev_desc is NULL!\n", __func__); 208c7de5349SHisping Lin return -TEEC_ERROR_GENERIC; 209c7de5349SHisping Lin } 210c7de5349SHisping Lin 211c7de5349SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 212c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 213c7de5349SHisping Lin return TeecResult; 214c7de5349SHisping Lin 215c7de5349SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 216c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 217c7de5349SHisping Lin return TeecResult; 218c7de5349SHisping Lin 219c7de5349SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 220c7de5349SHisping Lin TEEC_NONE, 221c7de5349SHisping Lin TEEC_NONE, 222c7de5349SHisping Lin TEEC_NONE); 223c7de5349SHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 224c7de5349SHisping Lin if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0) 225c7de5349SHisping Lin TeecOperation.params[0].value.a = 1; 226c7de5349SHisping Lin else 227c7de5349SHisping Lin TeecOperation.params[0].value.a = 0; 228c7de5349SHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 229c7de5349SHisping Lin TeecOperation.params[0].value.a = 0; 230c7de5349SHisping Lin #endif 231c7de5349SHisping Lin 232c7de5349SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 233c7de5349SHisping Lin &TeecSession, 234c7de5349SHisping Lin TeecUuid, 235c7de5349SHisping Lin TEEC_LOGIN_PUBLIC, 236c7de5349SHisping Lin NULL, 237c7de5349SHisping Lin &TeecOperation, 238c7de5349SHisping Lin &ErrorOrigin); 239c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 240c7de5349SHisping Lin return TeecResult; 241c7de5349SHisping Lin 242c7de5349SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 243c7de5349SHisping Lin 244c7de5349SHisping Lin SharedMem0.size = filename_size; 245c7de5349SHisping Lin SharedMem0.flags = 0; 246c7de5349SHisping Lin 247c7de5349SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 248c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 249c7de5349SHisping Lin goto exit; 250c7de5349SHisping Lin 251c7de5349SHisping Lin memcpy(SharedMem0.buffer, filename, SharedMem0.size); 252c7de5349SHisping Lin 253c7de5349SHisping Lin TEEC_SharedMemory SharedMem1 = {0}; 254c7de5349SHisping Lin 255c7de5349SHisping Lin SharedMem1.size = data_size; 256ae8ec5e1SHisping Lin SharedMem1.flags = 0; 257ae8ec5e1SHisping Lin 258ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 259f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 260f4e1db95SHisping Lin goto exit; 261ae8ec5e1SHisping Lin 262ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 263ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 264ae8ec5e1SHisping Lin 265ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 266ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem1.size; 267ae8ec5e1SHisping Lin 268ae8ec5e1SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 269ae8ec5e1SHisping Lin TEEC_MEMREF_TEMP_INOUT, 270ae8ec5e1SHisping Lin TEEC_NONE, 271ae8ec5e1SHisping Lin TEEC_NONE); 272ae8ec5e1SHisping Lin 273ae8ec5e1SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 274ae8ec5e1SHisping Lin 0, 275ae8ec5e1SHisping Lin &TeecOperation, 276ae8ec5e1SHisping Lin &ErrorOrigin); 27746b2a054SHisping Lin if (TeecResult == TEEC_SUCCESS) 278c7de5349SHisping Lin memcpy(data, SharedMem1.buffer, SharedMem1.size); 279f4e1db95SHisping Lin exit: 280ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 281ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem1); 282ae8ec5e1SHisping Lin TEEC_CloseSession(&TeecSession); 28346b2a054SHisping Lin TEEC_FinalizeContext(&TeecContext); 284ae8ec5e1SHisping Lin 285ae8ec5e1SHisping Lin return TeecResult; 286ae8ec5e1SHisping Lin } 287ae8ec5e1SHisping Lin 288c7de5349SHisping Lin static uint32_t trusty_base_end_security_data(void) 289c7de5349SHisping Lin { 290c7de5349SHisping Lin TEEC_Result TeecResult; 291c7de5349SHisping Lin TEEC_Context TeecContext; 292c7de5349SHisping Lin TEEC_Session TeecSession; 293c7de5349SHisping Lin uint32_t ErrorOrigin; 294c7de5349SHisping Lin TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 295c7de5349SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 296c7de5349SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 297c7de5349SHisping Lin TEEC_Operation TeecOperation = {0}; 298c7de5349SHisping Lin 299c7de5349SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 300c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 301c7de5349SHisping Lin return TeecResult; 302c7de5349SHisping Lin 303c7de5349SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 304c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 305c7de5349SHisping Lin return TeecResult; 306c7de5349SHisping Lin 307c7de5349SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 308c7de5349SHisping Lin &TeecSession, 309c7de5349SHisping Lin TeecUuid, 310c7de5349SHisping Lin TEEC_LOGIN_PUBLIC, 311c7de5349SHisping Lin NULL, 312c7de5349SHisping Lin NULL, 313c7de5349SHisping Lin &ErrorOrigin); 314c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 315c7de5349SHisping Lin return TeecResult; 316c7de5349SHisping Lin 317c7de5349SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE, 318c7de5349SHisping Lin TEEC_NONE, 319c7de5349SHisping Lin TEEC_NONE, 320c7de5349SHisping Lin TEEC_NONE); 321c7de5349SHisping Lin 322c7de5349SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 323c7de5349SHisping Lin 2, 324c7de5349SHisping Lin &TeecOperation, 325c7de5349SHisping Lin &ErrorOrigin); 326c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 327c7de5349SHisping Lin goto exit; 328c7de5349SHisping Lin exit: 329c7de5349SHisping Lin TEEC_CloseSession(&TeecSession); 330c7de5349SHisping Lin TEEC_FinalizeContext(&TeecContext); 331c7de5349SHisping Lin 332c7de5349SHisping Lin return TeecResult; 333c7de5349SHisping Lin } 334c7de5349SHisping Lin 335*34f2e8f6SHisping Lin static void trusty_notify_always_use_security(void) 336*34f2e8f6SHisping Lin { 337*34f2e8f6SHisping Lin #if defined(CONFIG_OPTEE_V2) && defined(CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION) 338*34f2e8f6SHisping Lin TEEC_Result TeecResult; 339*34f2e8f6SHisping Lin TEEC_Context TeecContext; 340*34f2e8f6SHisping Lin TEEC_Session TeecSession; 341*34f2e8f6SHisping Lin uint32_t ErrorOrigin; 342*34f2e8f6SHisping Lin TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 343*34f2e8f6SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 344*34f2e8f6SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 345*34f2e8f6SHisping Lin TEEC_Operation TeecOperation = {0}; 346*34f2e8f6SHisping Lin 347*34f2e8f6SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 348*34f2e8f6SHisping Lin if (TeecResult != TEEC_SUCCESS) 349*34f2e8f6SHisping Lin return; 350*34f2e8f6SHisping Lin 351*34f2e8f6SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 352*34f2e8f6SHisping Lin if (TeecResult != TEEC_SUCCESS) 353*34f2e8f6SHisping Lin return; 354*34f2e8f6SHisping Lin 355*34f2e8f6SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 356*34f2e8f6SHisping Lin &TeecSession, 357*34f2e8f6SHisping Lin TeecUuid, 358*34f2e8f6SHisping Lin TEEC_LOGIN_PUBLIC, 359*34f2e8f6SHisping Lin NULL, 360*34f2e8f6SHisping Lin NULL, 361*34f2e8f6SHisping Lin &ErrorOrigin); 362*34f2e8f6SHisping Lin if (TeecResult != TEEC_SUCCESS) 363*34f2e8f6SHisping Lin return; 364*34f2e8f6SHisping Lin 365*34f2e8f6SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE, 366*34f2e8f6SHisping Lin TEEC_NONE, 367*34f2e8f6SHisping Lin TEEC_NONE, 368*34f2e8f6SHisping Lin TEEC_NONE); 369*34f2e8f6SHisping Lin 370*34f2e8f6SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 371*34f2e8f6SHisping Lin 9, 372*34f2e8f6SHisping Lin &TeecOperation, 373*34f2e8f6SHisping Lin &ErrorOrigin); 374*34f2e8f6SHisping Lin if (TeecResult != TEEC_SUCCESS) 375*34f2e8f6SHisping Lin debug("notify always use security fail! please update optee!"); 376*34f2e8f6SHisping Lin 377*34f2e8f6SHisping Lin TEEC_CloseSession(&TeecSession); 378*34f2e8f6SHisping Lin TEEC_FinalizeContext(&TeecContext); 379*34f2e8f6SHisping Lin 380*34f2e8f6SHisping Lin return; 381*34f2e8f6SHisping Lin #endif 382*34f2e8f6SHisping Lin } 383*34f2e8f6SHisping Lin 384c7de5349SHisping Lin uint32_t trusty_read_rollback_index(uint32_t slot, uint64_t *value) 385c7de5349SHisping Lin { 386c7de5349SHisping Lin char hs[9]; 387c7de5349SHisping Lin 388c7de5349SHisping Lin b2hs((uint8_t *)&slot, (uint8_t *)hs, 4, 9); 389c7de5349SHisping Lin 390c7de5349SHisping Lin return trusty_base_read_security_data(hs, 8, (uint8_t *)value, 8); 391c7de5349SHisping Lin } 392c7de5349SHisping Lin 393ae8ec5e1SHisping Lin uint32_t trusty_write_rollback_index(uint32_t slot, uint64_t value) 394ae8ec5e1SHisping Lin { 395c7de5349SHisping Lin char hs[9]; 3963251364cSHisping Lin 397c7de5349SHisping Lin b2hs((uint8_t *)&slot, (uint8_t *)hs, 4, 9); 398ae8ec5e1SHisping Lin 399c7de5349SHisping Lin return trusty_base_write_security_data(hs, 8, (uint8_t *)&value, 8); 400ae8ec5e1SHisping Lin } 401ae8ec5e1SHisping Lin 402ae8ec5e1SHisping Lin uint32_t trusty_read_permanent_attributes(uint8_t *attributes, uint32_t size) 403ae8ec5e1SHisping Lin { 404c7de5349SHisping Lin return trusty_base_read_security_data("attributes", 405c7de5349SHisping Lin sizeof("attributes"), attributes, size); 406ae8ec5e1SHisping Lin } 407ae8ec5e1SHisping Lin 408ae8ec5e1SHisping Lin uint32_t trusty_write_permanent_attributes(uint8_t *attributes, uint32_t size) 409ae8ec5e1SHisping Lin { 410c7de5349SHisping Lin return trusty_base_write_security_data("attributes", 411c7de5349SHisping Lin sizeof("attributes"), attributes, size); 4126651d4c0SJason Zhu } 413ae8ec5e1SHisping Lin 414c7de5349SHisping Lin uint32_t trusty_read_permanent_attributes_flag(uint8_t *attributes) 415c7de5349SHisping Lin { 416c7de5349SHisping Lin return trusty_base_read_security_data("attributes_flag", 417c7de5349SHisping Lin sizeof("attributes_flag"), attributes, 1); 418c7de5349SHisping Lin } 419ae8ec5e1SHisping Lin 420c7de5349SHisping Lin uint32_t trusty_write_permanent_attributes_flag(uint8_t attributes) 421c7de5349SHisping Lin { 422c7de5349SHisping Lin return trusty_base_write_security_data("attributes_flag", 423c7de5349SHisping Lin sizeof("attributes_flag"), &attributes, 1); 424ae8ec5e1SHisping Lin } 425ae8ec5e1SHisping Lin 426564654ebSJason Zhu uint32_t trusty_read_permanent_attributes_cer(uint8_t *attributes, 427564654ebSJason Zhu uint32_t size) 428564654ebSJason Zhu { 429c7de5349SHisping Lin return trusty_base_read_security_data("rsacer", 430c7de5349SHisping Lin sizeof("rsacer"), attributes, size); 431564654ebSJason Zhu } 432564654ebSJason Zhu 433564654ebSJason Zhu uint32_t trusty_write_permanent_attributes_cer(uint8_t *attributes, 434564654ebSJason Zhu uint32_t size) 435564654ebSJason Zhu { 436c7de5349SHisping Lin return trusty_base_write_security_data("rsacer", 437c7de5349SHisping Lin sizeof("rsacer"), attributes, size); 438564654ebSJason Zhu } 439564654ebSJason Zhu 440ae8ec5e1SHisping Lin uint32_t trusty_read_lock_state(uint8_t *lock_state) 441ae8ec5e1SHisping Lin { 442c7de5349SHisping Lin return trusty_base_read_security_data("lock_state", 443c7de5349SHisping Lin sizeof("lock_state"), lock_state, 1); 444ae8ec5e1SHisping Lin } 445ae8ec5e1SHisping Lin 446ae8ec5e1SHisping Lin uint32_t trusty_write_lock_state(uint8_t lock_state) 447ae8ec5e1SHisping Lin { 448c7de5349SHisping Lin return trusty_base_write_security_data("lock_state", 449c7de5349SHisping Lin sizeof("lock_state"), &lock_state, 1); 450ae8ec5e1SHisping Lin } 451ae8ec5e1SHisping Lin 452ae8ec5e1SHisping Lin uint32_t trusty_read_flash_lock_state(uint8_t *flash_lock_state) 453ae8ec5e1SHisping Lin { 454c7de5349SHisping Lin return trusty_base_read_security_data("flash_lock_state", 455c7de5349SHisping Lin sizeof("flash_lock_state"), flash_lock_state, 1); 456c7de5349SHisping Lin } 457c7de5349SHisping Lin 458c7de5349SHisping Lin uint32_t trusty_write_flash_lock_state(uint8_t flash_lock_state) 459c7de5349SHisping Lin { 460c7de5349SHisping Lin return trusty_base_write_security_data("flash_lock_state", 461c7de5349SHisping Lin sizeof("flash_lock_state"), &flash_lock_state, 1); 462c7de5349SHisping Lin } 463c7de5349SHisping Lin 464c7de5349SHisping Lin static uint32_t trusty_base_end_efuse_or_otp(void) 465c7de5349SHisping Lin { 466ae8ec5e1SHisping Lin TEEC_Result TeecResult; 467ae8ec5e1SHisping Lin TEEC_Context TeecContext; 468ae8ec5e1SHisping Lin TEEC_Session TeecSession; 469ae8ec5e1SHisping Lin uint32_t ErrorOrigin; 470c7de5349SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 471c7de5349SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 472c7de5349SHisping Lin 473ae8ec5e1SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 474ae8ec5e1SHisping Lin TEEC_Operation TeecOperation = {0}; 475ae8ec5e1SHisping Lin 476f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 477f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 478f4e1db95SHisping Lin return TeecResult; 479ae8ec5e1SHisping Lin 480ae8ec5e1SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 481f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 482f4e1db95SHisping Lin return TeecResult; 483ae8ec5e1SHisping Lin 484ae8ec5e1SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 485ae8ec5e1SHisping Lin &TeecSession, 486ae8ec5e1SHisping Lin TeecUuid, 487ae8ec5e1SHisping Lin TEEC_LOGIN_PUBLIC, 488ae8ec5e1SHisping Lin NULL, 489c7de5349SHisping Lin NULL, 490ae8ec5e1SHisping Lin &ErrorOrigin); 491f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 492f4e1db95SHisping Lin return TeecResult; 493ae8ec5e1SHisping Lin 494c7de5349SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE, 495c7de5349SHisping Lin TEEC_NONE, 496ae8ec5e1SHisping Lin TEEC_NONE, 497ae8ec5e1SHisping Lin TEEC_NONE); 498ae8ec5e1SHisping Lin 499ae8ec5e1SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 500c7de5349SHisping Lin STORAGE_CMD_UBOOT_END_OTP, 501ae8ec5e1SHisping Lin &TeecOperation, 502ae8ec5e1SHisping Lin &ErrorOrigin); 503c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 504c7de5349SHisping Lin goto exit; 505f4e1db95SHisping Lin exit: 506ae8ec5e1SHisping Lin TEEC_CloseSession(&TeecSession); 50746b2a054SHisping Lin TEEC_FinalizeContext(&TeecContext); 508ae8ec5e1SHisping Lin 509ae8ec5e1SHisping Lin return TeecResult; 510ae8ec5e1SHisping Lin } 511ae8ec5e1SHisping Lin 512c7de5349SHisping Lin static uint32_t trusty_base_efuse_or_otp_operation(uint32_t cmd, 513c7de5349SHisping Lin uint8_t is_write, 514c7de5349SHisping Lin uint32_t *buf, 515c7de5349SHisping Lin uint32_t length) 516ae8ec5e1SHisping Lin { 517ae8ec5e1SHisping Lin TEEC_Result TeecResult; 518ae8ec5e1SHisping Lin TEEC_Context TeecContext; 519ae8ec5e1SHisping Lin TEEC_Session TeecSession; 520ae8ec5e1SHisping Lin uint32_t ErrorOrigin; 521c7de5349SHisping Lin 522c7de5349SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 523c7de5349SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 524ae8ec5e1SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 525ae8ec5e1SHisping Lin TEEC_Operation TeecOperation = {0}; 526ae8ec5e1SHisping Lin 527f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 528f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 529f4e1db95SHisping Lin return TeecResult; 530ae8ec5e1SHisping Lin 531ae8ec5e1SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 532f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 533f4e1db95SHisping Lin return TeecResult; 534ae8ec5e1SHisping Lin 535ae8ec5e1SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 536ae8ec5e1SHisping Lin &TeecSession, 537ae8ec5e1SHisping Lin TeecUuid, 538ae8ec5e1SHisping Lin TEEC_LOGIN_PUBLIC, 539ae8ec5e1SHisping Lin NULL, 540c7de5349SHisping Lin NULL, 541ae8ec5e1SHisping Lin &ErrorOrigin); 542f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 543f4e1db95SHisping Lin return TeecResult; 544ae8ec5e1SHisping Lin 545ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 546ae8ec5e1SHisping Lin 547c7de5349SHisping Lin SharedMem0.size = length * sizeof(uint32_t); 548ae8ec5e1SHisping Lin SharedMem0.flags = 0; 549ae8ec5e1SHisping Lin 550ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 551f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 552f4e1db95SHisping Lin goto exit; 553ae8ec5e1SHisping Lin 554ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 555ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 556ae8ec5e1SHisping Lin 557c7de5349SHisping Lin if (is_write) { 558c7de5349SHisping Lin memcpy(SharedMem0.buffer, buf, SharedMem0.size); 559ae8ec5e1SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 560c7de5349SHisping Lin TEEC_NONE, 561ae8ec5e1SHisping Lin TEEC_NONE, 562ae8ec5e1SHisping Lin TEEC_NONE); 563ae8ec5e1SHisping Lin 564c7de5349SHisping Lin } else { 565c7de5349SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT, 566c7de5349SHisping Lin TEEC_NONE, 567c7de5349SHisping Lin TEEC_NONE, 568c7de5349SHisping Lin TEEC_NONE); 569c7de5349SHisping Lin } 570c7de5349SHisping Lin 571ae8ec5e1SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 572c7de5349SHisping Lin cmd, 573ae8ec5e1SHisping Lin &TeecOperation, 574ae8ec5e1SHisping Lin &ErrorOrigin); 575f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 576f4e1db95SHisping Lin goto exit; 577c7de5349SHisping Lin 578c7de5349SHisping Lin if (!is_write) 579c7de5349SHisping Lin memcpy(buf, SharedMem0.buffer, SharedMem0.size); 580c7de5349SHisping Lin 581f4e1db95SHisping Lin exit: 582ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 583ae8ec5e1SHisping Lin TEEC_CloseSession(&TeecSession); 58446b2a054SHisping Lin TEEC_FinalizeContext(&TeecContext); 585ae8ec5e1SHisping Lin 586ae8ec5e1SHisping Lin return TeecResult; 587ae8ec5e1SHisping Lin } 588ae8ec5e1SHisping Lin 5896ef445a4SHisping Lin uint32_t trusty_read_attribute_hash(uint32_t *buf, uint32_t length) 5906ef445a4SHisping Lin { 591c7de5349SHisping Lin return trusty_base_efuse_or_otp_operation(STORAGE_CMD_READ_ATTRIBUTE_HASH, 592c7de5349SHisping Lin false, buf, length); 5936ef445a4SHisping Lin } 5946ef445a4SHisping Lin 5956ef445a4SHisping Lin uint32_t trusty_write_attribute_hash(uint32_t *buf, uint32_t length) 5966ef445a4SHisping Lin { 597c7de5349SHisping Lin return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_ATTRIBUTE_HASH, 598c7de5349SHisping Lin true, buf, length); 59916539616SHisping Lin } 60016539616SHisping Lin 60116539616SHisping Lin uint32_t trusty_notify_optee_uboot_end(void) 60216539616SHisping Lin { 60316539616SHisping Lin TEEC_Result res; 604c7de5349SHisping Lin 605c7de5349SHisping Lin res = trusty_base_end_security_data(); 606c7de5349SHisping Lin res |= trusty_base_end_efuse_or_otp(); 60716539616SHisping Lin return res; 60816539616SHisping Lin } 6092cd27853SHisping Lin 6102cd27853SHisping Lin uint32_t trusty_read_vbootkey_hash(uint32_t *buf, uint32_t length) 6112cd27853SHisping Lin { 612c7de5349SHisping Lin return trusty_base_efuse_or_otp_operation(STORAGE_CMD_READ_VBOOTKEY_HASH, 613c7de5349SHisping Lin false, buf, length); 6142cd27853SHisping Lin } 615c7de5349SHisping Lin 6162cd27853SHisping Lin uint32_t trusty_write_vbootkey_hash(uint32_t *buf, uint32_t length) 6172cd27853SHisping Lin { 618c7de5349SHisping Lin return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_VBOOTKEY_HASH, 619c7de5349SHisping Lin true, buf, length); 6202cd27853SHisping Lin } 621095e2a82SHisping Lin 622468df3b2SHisping Lin uint32_t trusty_read_vbootkey_enable_flag(uint8_t *flag) 623468df3b2SHisping Lin { 624468df3b2SHisping Lin uint32_t bootflag; 625c7de5349SHisping Lin TEEC_Result TeecResult; 626468df3b2SHisping Lin 627f07e1686SHisping Lin *flag = 0; 628f07e1686SHisping Lin 629c7de5349SHisping Lin TeecResult = trusty_base_efuse_or_otp_operation(STORAGE_CMD_READ_ENABLE_FLAG, 630c7de5349SHisping Lin false, &bootflag, 1); 631468df3b2SHisping Lin 632468df3b2SHisping Lin if (TeecResult == TEEC_SUCCESS) { 6330202ee8aSHisping Lin #if defined(CONFIG_ROCKCHIP_RK3288) 6340202ee8aSHisping Lin if (bootflag == 0x00000001) 6350202ee8aSHisping Lin *flag = 1; 6360202ee8aSHisping Lin #else 637468df3b2SHisping Lin if (bootflag == 0x000000FF) 638468df3b2SHisping Lin *flag = 1; 6390202ee8aSHisping Lin #endif 640468df3b2SHisping Lin } 641095e2a82SHisping Lin return TeecResult; 642095e2a82SHisping Lin } 6434aa61755SAndy Ye 6441ef63c75SHisping Lin uint32_t trusty_write_ta_encryption_key(uint32_t *buf, uint32_t length) 6451ef63c75SHisping Lin { 6461ef63c75SHisping Lin return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_TA_ENCRYPTION_KEY, 6471ef63c75SHisping Lin true, buf, length); 6481ef63c75SHisping Lin } 6491ef63c75SHisping Lin 650fbf29bfbSHisping Lin uint32_t trusty_check_security_level_flag(uint8_t flag) 651fbf29bfbSHisping Lin { 652fbf29bfbSHisping Lin uint32_t levelflag; 653fbf29bfbSHisping Lin 654fbf29bfbSHisping Lin levelflag = flag; 655fbf29bfbSHisping Lin return trusty_base_efuse_or_otp_operation(STORAGE_CMD_CHECK_SECURITY_LEVEL_FLAG, 656fbf29bfbSHisping Lin true, &levelflag, 1); 657fbf29bfbSHisping Lin } 658fbf29bfbSHisping Lin 659f39d4289SHisping Lin uint32_t trusty_write_oem_huk(uint32_t *buf, uint32_t length) 660f39d4289SHisping Lin { 661f39d4289SHisping Lin return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_OEM_HUK, 662f39d4289SHisping Lin true, buf, length); 663f39d4289SHisping Lin } 664f39d4289SHisping Lin 665*34f2e8f6SHisping Lin static void trusty_select_security_level(void) 6667504da74SHisping Lin { 6677504da74SHisping Lin #if (CONFIG_OPTEE_SECURITY_LEVEL > 0) 6687504da74SHisping Lin TEEC_Result TeecResult; 6697504da74SHisping Lin 6707504da74SHisping Lin TeecResult = trusty_check_security_level_flag(CONFIG_OPTEE_SECURITY_LEVEL); 6717504da74SHisping Lin if (TeecResult == TEE_ERROR_CANCEL) { 6727504da74SHisping Lin run_command("download", 0); 6737504da74SHisping Lin return; 6747504da74SHisping Lin } 6757504da74SHisping Lin 6767504da74SHisping Lin if (TeecResult == TEEC_SUCCESS) 6777504da74SHisping Lin debug("optee select security level success!"); 6787504da74SHisping Lin else 6797504da74SHisping Lin panic("optee select security level fail!"); 6807504da74SHisping Lin 6817504da74SHisping Lin return; 6827504da74SHisping Lin #endif 6837504da74SHisping Lin } 6847504da74SHisping Lin 68551ac7005SHisping Lin void optee_client_init(void) 68651ac7005SHisping Lin { 68751ac7005SHisping Lin trusty_select_security_level(); 688*34f2e8f6SHisping Lin trusty_notify_always_use_security(); 68951ac7005SHisping Lin } 69051ac7005SHisping Lin 691d5913350SHisping Lin uint32_t trusty_write_oem_ns_otp(uint32_t byte_off, uint8_t *byte_buf, uint32_t byte_len) 692d5913350SHisping Lin { 693d5913350SHisping Lin TEEC_Result TeecResult; 694d5913350SHisping Lin TEEC_Context TeecContext; 695d5913350SHisping Lin TEEC_Session TeecSession; 696d5913350SHisping Lin uint32_t ErrorOrigin; 697d5913350SHisping Lin 698d5913350SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 699d5913350SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 700d5913350SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 701d5913350SHisping Lin TEEC_Operation TeecOperation = {0}; 702d5913350SHisping Lin 703d5913350SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 704d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 705d5913350SHisping Lin return TeecResult; 706d5913350SHisping Lin 707d5913350SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 708d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 709d5913350SHisping Lin return TeecResult; 710d5913350SHisping Lin 711d5913350SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 712d5913350SHisping Lin &TeecSession, 713d5913350SHisping Lin TeecUuid, 714d5913350SHisping Lin TEEC_LOGIN_PUBLIC, 715d5913350SHisping Lin NULL, 716d5913350SHisping Lin NULL, 717d5913350SHisping Lin &ErrorOrigin); 718d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 719d5913350SHisping Lin return TeecResult; 720d5913350SHisping Lin 721d5913350SHisping Lin TeecOperation.params[0].value.a = byte_off; 722d5913350SHisping Lin 723d5913350SHisping Lin TEEC_SharedMemory SharedMem = {0}; 724d5913350SHisping Lin 725d5913350SHisping Lin SharedMem.size = byte_len; 726d5913350SHisping Lin SharedMem.flags = 0; 727d5913350SHisping Lin 728d5913350SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem); 729d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 730d5913350SHisping Lin goto exit; 731d5913350SHisping Lin 732d5913350SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem.buffer; 733d5913350SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem.size; 734d5913350SHisping Lin 735d5913350SHisping Lin memcpy(SharedMem.buffer, byte_buf, SharedMem.size); 736d5913350SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 737d5913350SHisping Lin TEEC_MEMREF_TEMP_INPUT, 738d5913350SHisping Lin TEEC_NONE, 739d5913350SHisping Lin TEEC_NONE); 740d5913350SHisping Lin 741d5913350SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 742d5913350SHisping Lin STORAGE_CMD_WRITE_OEM_NS_OTP, 743d5913350SHisping Lin &TeecOperation, 744d5913350SHisping Lin &ErrorOrigin); 745d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 746d5913350SHisping Lin goto exit; 747d5913350SHisping Lin 748d5913350SHisping Lin exit: 749d5913350SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem); 750d5913350SHisping Lin TEEC_CloseSession(&TeecSession); 751d5913350SHisping Lin TEEC_FinalizeContext(&TeecContext); 752d5913350SHisping Lin 753d5913350SHisping Lin return TeecResult; 754d5913350SHisping Lin } 755d5913350SHisping Lin 756d5913350SHisping Lin uint32_t trusty_read_oem_ns_otp(uint32_t byte_off, uint8_t *byte_buf, uint32_t byte_len) 757d5913350SHisping Lin { 758d5913350SHisping Lin TEEC_Result TeecResult; 759d5913350SHisping Lin TEEC_Context TeecContext; 760d5913350SHisping Lin TEEC_Session TeecSession; 761d5913350SHisping Lin uint32_t ErrorOrigin; 762d5913350SHisping Lin 763d5913350SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 764d5913350SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 765d5913350SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 766d5913350SHisping Lin TEEC_Operation TeecOperation = {0}; 767d5913350SHisping Lin 768d5913350SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 769d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 770d5913350SHisping Lin return TeecResult; 771d5913350SHisping Lin 772d5913350SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 773d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 774d5913350SHisping Lin return TeecResult; 775d5913350SHisping Lin 776d5913350SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 777d5913350SHisping Lin &TeecSession, 778d5913350SHisping Lin TeecUuid, 779d5913350SHisping Lin TEEC_LOGIN_PUBLIC, 780d5913350SHisping Lin NULL, 781d5913350SHisping Lin NULL, 782d5913350SHisping Lin &ErrorOrigin); 783d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 784d5913350SHisping Lin return TeecResult; 785d5913350SHisping Lin 786d5913350SHisping Lin TeecOperation.params[0].value.a = byte_off; 787d5913350SHisping Lin 788d5913350SHisping Lin TEEC_SharedMemory SharedMem = {0}; 789d5913350SHisping Lin 790d5913350SHisping Lin SharedMem.size = byte_len; 791d5913350SHisping Lin SharedMem.flags = 0; 792d5913350SHisping Lin 793d5913350SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem); 794d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 795d5913350SHisping Lin goto exit; 796d5913350SHisping Lin 797d5913350SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem.buffer; 798d5913350SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem.size; 799d5913350SHisping Lin 800d5913350SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 801d5913350SHisping Lin TEEC_MEMREF_TEMP_OUTPUT, 802d5913350SHisping Lin TEEC_NONE, 803d5913350SHisping Lin TEEC_NONE); 804d5913350SHisping Lin 805d5913350SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 806d5913350SHisping Lin STORAGE_CMD_READ_OEM_NS_OTP, 807d5913350SHisping Lin &TeecOperation, 808d5913350SHisping Lin &ErrorOrigin); 809d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 810d5913350SHisping Lin goto exit; 811d5913350SHisping Lin 812d5913350SHisping Lin memcpy(byte_buf, SharedMem.buffer, SharedMem.size); 813d5913350SHisping Lin 814d5913350SHisping Lin exit: 815d5913350SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem); 816d5913350SHisping Lin TEEC_CloseSession(&TeecSession); 817d5913350SHisping Lin TEEC_FinalizeContext(&TeecContext); 818d5913350SHisping Lin 819d5913350SHisping Lin return TeecResult; 820d5913350SHisping Lin } 821d5913350SHisping Lin 82290e849a0Sxb.wang uint32_t trusty_write_oem_otp_key(enum RK_OEM_OTP_KEYID key_id, 823bb1ba6acSHisping Lin uint8_t *byte_buf, uint32_t byte_len) 824bb1ba6acSHisping Lin { 825bb1ba6acSHisping Lin TEEC_Result TeecResult; 826bb1ba6acSHisping Lin TEEC_Context TeecContext; 827bb1ba6acSHisping Lin TEEC_Session TeecSession; 828bb1ba6acSHisping Lin uint32_t ErrorOrigin; 829bb1ba6acSHisping Lin 830bb1ba6acSHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 831bb1ba6acSHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 832bb1ba6acSHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 833bb1ba6acSHisping Lin TEEC_Operation TeecOperation = {0}; 834bb1ba6acSHisping Lin 835bb1ba6acSHisping Lin TeecResult = OpteeClientApiLibInitialize(); 836bb1ba6acSHisping Lin if (TeecResult != TEEC_SUCCESS) 837bb1ba6acSHisping Lin return TeecResult; 838bb1ba6acSHisping Lin 839bb1ba6acSHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 840bb1ba6acSHisping Lin if (TeecResult != TEEC_SUCCESS) 841bb1ba6acSHisping Lin return TeecResult; 842bb1ba6acSHisping Lin 843bb1ba6acSHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 844bb1ba6acSHisping Lin &TeecSession, 845bb1ba6acSHisping Lin TeecUuid, 846bb1ba6acSHisping Lin TEEC_LOGIN_PUBLIC, 847bb1ba6acSHisping Lin NULL, 848bb1ba6acSHisping Lin NULL, 849bb1ba6acSHisping Lin &ErrorOrigin); 850bb1ba6acSHisping Lin if (TeecResult != TEEC_SUCCESS) 851bb1ba6acSHisping Lin return TeecResult; 852bb1ba6acSHisping Lin 853bb1ba6acSHisping Lin TeecOperation.params[0].value.a = key_id; 854bb1ba6acSHisping Lin 855bb1ba6acSHisping Lin TEEC_SharedMemory SharedMem = {0}; 856bb1ba6acSHisping Lin 857bb1ba6acSHisping Lin SharedMem.size = byte_len; 858bb1ba6acSHisping Lin SharedMem.flags = 0; 859bb1ba6acSHisping Lin 860bb1ba6acSHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem); 861bb1ba6acSHisping Lin if (TeecResult != TEEC_SUCCESS) 862bb1ba6acSHisping Lin goto exit; 863bb1ba6acSHisping Lin 864bb1ba6acSHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem.buffer; 865bb1ba6acSHisping Lin TeecOperation.params[1].tmpref.size = SharedMem.size; 866bb1ba6acSHisping Lin 867bb1ba6acSHisping Lin memcpy(SharedMem.buffer, byte_buf, SharedMem.size); 868bb1ba6acSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 869bb1ba6acSHisping Lin TEEC_MEMREF_TEMP_INPUT, 870bb1ba6acSHisping Lin TEEC_NONE, 871bb1ba6acSHisping Lin TEEC_NONE); 872bb1ba6acSHisping Lin 873bb1ba6acSHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 87490e849a0Sxb.wang STORAGE_CMD_WRITE_OEM_OTP_KEY, 875bb1ba6acSHisping Lin &TeecOperation, 876bb1ba6acSHisping Lin &ErrorOrigin); 877bb1ba6acSHisping Lin if (TeecResult != TEEC_SUCCESS) 878bb1ba6acSHisping Lin goto exit; 879bb1ba6acSHisping Lin 880bb1ba6acSHisping Lin exit: 881bb1ba6acSHisping Lin TEEC_ReleaseSharedMemory(&SharedMem); 882bb1ba6acSHisping Lin TEEC_CloseSession(&TeecSession); 883bb1ba6acSHisping Lin TEEC_FinalizeContext(&TeecContext); 884bb1ba6acSHisping Lin 885bb1ba6acSHisping Lin return TeecResult; 886bb1ba6acSHisping Lin } 887bb1ba6acSHisping Lin 8889deb34f6SHisping Lin uint32_t trusty_oem_otp_key_is_written(enum RK_OEM_OTP_KEYID key_id, uint8_t *value) 8899deb34f6SHisping Lin { 8909deb34f6SHisping Lin TEEC_Result TeecResult; 8919deb34f6SHisping Lin TEEC_Context TeecContext; 8929deb34f6SHisping Lin TEEC_Session TeecSession; 8939deb34f6SHisping Lin uint32_t ErrorOrigin; 8949deb34f6SHisping Lin 8959deb34f6SHisping Lin *value = 0xFF; 8969deb34f6SHisping Lin 8979deb34f6SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 8989deb34f6SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 8999deb34f6SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 9009deb34f6SHisping Lin TEEC_Operation TeecOperation = {0}; 9019deb34f6SHisping Lin 9029deb34f6SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 9039deb34f6SHisping Lin if (TeecResult != TEEC_SUCCESS) 9049deb34f6SHisping Lin return TeecResult; 9059deb34f6SHisping Lin 9069deb34f6SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 9079deb34f6SHisping Lin if (TeecResult != TEEC_SUCCESS) 9089deb34f6SHisping Lin return TeecResult; 9099deb34f6SHisping Lin 9109deb34f6SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 9119deb34f6SHisping Lin &TeecSession, 9129deb34f6SHisping Lin TeecUuid, 9139deb34f6SHisping Lin TEEC_LOGIN_PUBLIC, 9149deb34f6SHisping Lin NULL, 9159deb34f6SHisping Lin NULL, 9169deb34f6SHisping Lin &ErrorOrigin); 9179deb34f6SHisping Lin if (TeecResult != TEEC_SUCCESS) 9189deb34f6SHisping Lin return TeecResult; 9199deb34f6SHisping Lin 9209deb34f6SHisping Lin TeecOperation.params[0].value.a = key_id; 9219deb34f6SHisping Lin 9229deb34f6SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INOUT, 9239deb34f6SHisping Lin TEEC_NONE, 9249deb34f6SHisping Lin TEEC_NONE, 9259deb34f6SHisping Lin TEEC_NONE); 9269deb34f6SHisping Lin 9279deb34f6SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 9289deb34f6SHisping Lin STORAGE_CMD_OEM_OTP_KEY_IS_WRITTEN, 9299deb34f6SHisping Lin &TeecOperation, 9309deb34f6SHisping Lin &ErrorOrigin); 9319deb34f6SHisping Lin if (TeecResult == TEEC_SUCCESS) 9329deb34f6SHisping Lin *value = TeecOperation.params[0].value.b; 9339deb34f6SHisping Lin 9349deb34f6SHisping Lin TEEC_CloseSession(&TeecSession); 9359deb34f6SHisping Lin TEEC_FinalizeContext(&TeecContext); 9369deb34f6SHisping Lin 9379deb34f6SHisping Lin return TeecResult; 9389deb34f6SHisping Lin } 9399deb34f6SHisping Lin 94090e849a0Sxb.wang uint32_t trusty_set_oem_hr_otp_read_lock(enum RK_OEM_OTP_KEYID key_id) 941a405238aSHisping Lin { 942a405238aSHisping Lin TEEC_Result TeecResult; 943a405238aSHisping Lin TEEC_Context TeecContext; 944a405238aSHisping Lin TEEC_Session TeecSession; 945a405238aSHisping Lin uint32_t ErrorOrigin; 946a405238aSHisping Lin 947a405238aSHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 948a405238aSHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 949a405238aSHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 950a405238aSHisping Lin TEEC_Operation TeecOperation = {0}; 951a405238aSHisping Lin 952a405238aSHisping Lin TeecResult = OpteeClientApiLibInitialize(); 953a405238aSHisping Lin if (TeecResult != TEEC_SUCCESS) 954a405238aSHisping Lin return TeecResult; 955a405238aSHisping Lin 956a405238aSHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 957a405238aSHisping Lin if (TeecResult != TEEC_SUCCESS) 958a405238aSHisping Lin return TeecResult; 959a405238aSHisping Lin 960a405238aSHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 961a405238aSHisping Lin &TeecSession, 962a405238aSHisping Lin TeecUuid, 963a405238aSHisping Lin TEEC_LOGIN_PUBLIC, 964a405238aSHisping Lin NULL, 965a405238aSHisping Lin NULL, 966a405238aSHisping Lin &ErrorOrigin); 967a405238aSHisping Lin if (TeecResult != TEEC_SUCCESS) 968a405238aSHisping Lin return TeecResult; 969a405238aSHisping Lin 970a405238aSHisping Lin TeecOperation.params[0].value.a = key_id; 971a405238aSHisping Lin 972a405238aSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 973a405238aSHisping Lin TEEC_NONE, 974a405238aSHisping Lin TEEC_NONE, 975a405238aSHisping Lin TEEC_NONE); 976a405238aSHisping Lin 977a405238aSHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 978a405238aSHisping Lin STORAGE_CMD_SET_OEM_HR_OTP_READ_LOCK, 979a405238aSHisping Lin &TeecOperation, 980a405238aSHisping Lin &ErrorOrigin); 981a405238aSHisping Lin if (TeecResult != TEEC_SUCCESS) 982a405238aSHisping Lin goto exit; 983a405238aSHisping Lin 984a405238aSHisping Lin exit: 985a405238aSHisping Lin TEEC_CloseSession(&TeecSession); 986a405238aSHisping Lin TEEC_FinalizeContext(&TeecContext); 987a405238aSHisping Lin 988a405238aSHisping Lin return TeecResult; 989a405238aSHisping Lin } 990a405238aSHisping Lin 9912f8c34bdSxb.wang uint32_t trusty_oem_otp_key_cipher(enum RK_OEM_OTP_KEYID key_id, rk_cipher_config *config, 9922f8c34bdSxb.wang uint32_t src_phys_addr, uint32_t dst_phys_addr, 9932f8c34bdSxb.wang uint32_t len) 994fc3694d6Sxb.wang { 995fc3694d6Sxb.wang TEEC_Result TeecResult; 996fc3694d6Sxb.wang TEEC_Context TeecContext; 997fc3694d6Sxb.wang TEEC_Session TeecSession; 998fc3694d6Sxb.wang TEEC_Operation TeecOperation = {0}; 999fc3694d6Sxb.wang uint32_t ErrorOrigin; 1000fc3694d6Sxb.wang TEEC_UUID uuid = RK_CRYPTO_SERVICE_UUID; 1001fc3694d6Sxb.wang TEEC_SharedMemory SharedMem_config = {0}; 1002fc3694d6Sxb.wang 10032f8c34bdSxb.wang if (key_id != RK_OEM_OTP_KEY0 && 10042f8c34bdSxb.wang key_id != RK_OEM_OTP_KEY1 && 10052f8c34bdSxb.wang key_id != RK_OEM_OTP_KEY2 && 10062f8c34bdSxb.wang key_id != RK_OEM_OTP_KEY3 && 10072f8c34bdSxb.wang key_id != RK_OEM_OTP_KEY_FW) 1008fc3694d6Sxb.wang return TEEC_ERROR_BAD_PARAMETERS; 1009fc3694d6Sxb.wang 10102f8c34bdSxb.wang if (!config) 1011fc3694d6Sxb.wang return TEEC_ERROR_BAD_PARAMETERS; 1012fc3694d6Sxb.wang 1013fc3694d6Sxb.wang if (config->algo != RK_ALGO_AES && config->algo != RK_ALGO_SM4) 1014fc3694d6Sxb.wang return TEEC_ERROR_BAD_PARAMETERS; 1015fc3694d6Sxb.wang 1016fc3694d6Sxb.wang if (config->mode >= RK_CIPHER_MODE_XTS) 1017fc3694d6Sxb.wang return TEEC_ERROR_BAD_PARAMETERS; 1018fc3694d6Sxb.wang 1019fc3694d6Sxb.wang if (config->operation != RK_MODE_ENCRYPT && 1020fc3694d6Sxb.wang config->operation != RK_MODE_DECRYPT) 1021fc3694d6Sxb.wang return TEEC_ERROR_BAD_PARAMETERS; 1022fc3694d6Sxb.wang 1023fc3694d6Sxb.wang if (config->key_len != 16 && 1024fc3694d6Sxb.wang config->key_len != 24 && 1025fc3694d6Sxb.wang config->key_len != 32) 1026fc3694d6Sxb.wang return TEEC_ERROR_BAD_PARAMETERS; 1027fc3694d6Sxb.wang 10282f8c34bdSxb.wang if (key_id == RK_OEM_OTP_KEY_FW && config->key_len != 16) 10292f8c34bdSxb.wang return TEEC_ERROR_BAD_PARAMETERS; 10302f8c34bdSxb.wang 10312f8c34bdSxb.wang #if defined(CONFIG_ROCKCHIP_RV1126) 10322f8c34bdSxb.wang if (config->key_len == 24) 10332f8c34bdSxb.wang return TEEC_ERROR_BAD_PARAMETERS; 10342f8c34bdSxb.wang #endif 10352f8c34bdSxb.wang 1036fc3694d6Sxb.wang if (len % AES_BLOCK_SIZE || 1037fc3694d6Sxb.wang len == 0) 1038fc3694d6Sxb.wang return TEEC_ERROR_BAD_PARAMETERS; 1039fc3694d6Sxb.wang 10402f8c34bdSxb.wang if (!src_phys_addr || !dst_phys_addr) 10412f8c34bdSxb.wang return TEEC_ERROR_BAD_PARAMETERS; 10422f8c34bdSxb.wang 1043fc3694d6Sxb.wang TeecResult = OpteeClientApiLibInitialize(); 1044fc3694d6Sxb.wang if (TeecResult != TEEC_SUCCESS) 1045fc3694d6Sxb.wang return TeecResult; 1046fc3694d6Sxb.wang 1047fc3694d6Sxb.wang TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1048fc3694d6Sxb.wang if (TeecResult != TEEC_SUCCESS) 1049fc3694d6Sxb.wang return TeecResult; 1050fc3694d6Sxb.wang 1051fc3694d6Sxb.wang TeecResult = TEEC_OpenSession(&TeecContext, 1052fc3694d6Sxb.wang &TeecSession, 1053fc3694d6Sxb.wang &uuid, 1054fc3694d6Sxb.wang TEEC_LOGIN_PUBLIC, 1055fc3694d6Sxb.wang NULL, 1056fc3694d6Sxb.wang NULL, 1057fc3694d6Sxb.wang &ErrorOrigin); 1058fc3694d6Sxb.wang if (TeecResult != TEEC_SUCCESS) 1059fc3694d6Sxb.wang goto exit; 1060fc3694d6Sxb.wang 1061fc3694d6Sxb.wang SharedMem_config.size = sizeof(rk_cipher_config); 1062fc3694d6Sxb.wang TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem_config); 1063fc3694d6Sxb.wang if (TeecResult != TEEC_SUCCESS) 1064fc3694d6Sxb.wang goto exit; 1065fc3694d6Sxb.wang 1066fc3694d6Sxb.wang memcpy(SharedMem_config.buffer, config, sizeof(rk_cipher_config)); 1067fc3694d6Sxb.wang TeecOperation.params[0].value.a = key_id; 1068fc3694d6Sxb.wang TeecOperation.params[1].tmpref.buffer = SharedMem_config.buffer; 1069fc3694d6Sxb.wang TeecOperation.params[1].tmpref.size = SharedMem_config.size; 10702f8c34bdSxb.wang TeecOperation.params[2].value.a = src_phys_addr; 10712f8c34bdSxb.wang TeecOperation.params[2].value.b = len; 10722f8c34bdSxb.wang TeecOperation.params[3].value.a = dst_phys_addr; 1073fc3694d6Sxb.wang TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 1074fc3694d6Sxb.wang TEEC_MEMREF_TEMP_INPUT, 10752f8c34bdSxb.wang TEEC_VALUE_INPUT, 10762f8c34bdSxb.wang TEEC_VALUE_INPUT); 10772f8c34bdSxb.wang 10782f8c34bdSxb.wang crypto_flush_cacheline(src_phys_addr, len); 10792f8c34bdSxb.wang crypto_flush_cacheline(dst_phys_addr, len); 10802f8c34bdSxb.wang 1081fc3694d6Sxb.wang TeecResult = TEEC_InvokeCommand(&TeecSession, 10822f8c34bdSxb.wang CRYPTO_SERVICE_CMD_OEM_OTP_KEY_PHYS_CIPHER, 1083fc3694d6Sxb.wang &TeecOperation, 1084fc3694d6Sxb.wang &ErrorOrigin); 1085fc3694d6Sxb.wang 1086a900eef3SHisping Lin crypto_invalidate_cacheline(dst_phys_addr, len); 1087a900eef3SHisping Lin 1088fc3694d6Sxb.wang exit: 1089fc3694d6Sxb.wang TEEC_ReleaseSharedMemory(&SharedMem_config); 1090fc3694d6Sxb.wang TEEC_CloseSession(&TeecSession); 1091fc3694d6Sxb.wang TEEC_FinalizeContext(&TeecContext); 1092fc3694d6Sxb.wang return TeecResult; 1093fc3694d6Sxb.wang } 1094fc3694d6Sxb.wang 10954aa61755SAndy Ye uint32_t trusty_attest_dh(uint8_t *dh, uint32_t *dh_size) 10964aa61755SAndy Ye { 10974aa61755SAndy Ye TEEC_Result TeecResult; 10984aa61755SAndy Ye TEEC_Context TeecContext; 10994aa61755SAndy Ye TEEC_Session TeecSession; 11004aa61755SAndy Ye uint32_t ErrorOrigin; 11014aa61755SAndy Ye TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6, 11024aa61755SAndy Ye { 0xa8, 0x69, 0x9c, 0xe6, 11034aa61755SAndy Ye 0x88, 0x6c, 0x5d, 0x5d 11044aa61755SAndy Ye } 11054aa61755SAndy Ye }; 11064aa61755SAndy Ye TEEC_UUID *TeecUuid = &tempuuid; 11074aa61755SAndy Ye TEEC_Operation TeecOperation = {0}; 11083251364cSHisping Lin struct blk_desc *dev_desc; 11093251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 11106651d4c0SJason Zhu if (!dev_desc) { 11116651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 11126651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 11136651d4c0SJason Zhu } 11144aa61755SAndy Ye 1115f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 1116f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1117f4e1db95SHisping Lin return TeecResult; 11184aa61755SAndy Ye 11194aa61755SAndy Ye TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1120f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1121f4e1db95SHisping Lin return TeecResult; 11224aa61755SAndy Ye 11233251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 11243251364cSHisping Lin TEEC_NONE, 11253251364cSHisping Lin TEEC_NONE, 11263251364cSHisping Lin TEEC_NONE); 11273251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 1128b9a7e756SHisping Lin if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0) 1129b9a7e756SHisping Lin TeecOperation.params[0].value.a = 1; 1130b9a7e756SHisping Lin else 1131b9a7e756SHisping Lin TeecOperation.params[0].value.a = 0; 1132b9a7e756SHisping Lin 11333251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 11343251364cSHisping Lin TeecOperation.params[0].value.a = 0; 11353251364cSHisping Lin #endif 11363251364cSHisping Lin 11374aa61755SAndy Ye TeecResult = TEEC_OpenSession(&TeecContext, 11384aa61755SAndy Ye &TeecSession, 11394aa61755SAndy Ye TeecUuid, 11404aa61755SAndy Ye TEEC_LOGIN_PUBLIC, 11414aa61755SAndy Ye NULL, 11423251364cSHisping Lin &TeecOperation, 11434aa61755SAndy Ye &ErrorOrigin); 1144f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1145f4e1db95SHisping Lin return TeecResult; 11464aa61755SAndy Ye 11474aa61755SAndy Ye TEEC_SharedMemory SharedMem0 = {0}; 11484aa61755SAndy Ye 11494aa61755SAndy Ye SharedMem0.size = *dh_size; 11504aa61755SAndy Ye SharedMem0.flags = 0; 11514aa61755SAndy Ye 11524aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 1153f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1154f4e1db95SHisping Lin goto exit; 11554aa61755SAndy Ye 11564aa61755SAndy Ye TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 11574aa61755SAndy Ye TeecOperation.params[0].tmpref.size = SharedMem0.size; 11584aa61755SAndy Ye 11594aa61755SAndy Ye TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, 11604aa61755SAndy Ye TEEC_NONE, 11614aa61755SAndy Ye TEEC_NONE, 11624aa61755SAndy Ye TEEC_NONE); 11634aa61755SAndy Ye 11644aa61755SAndy Ye TeecResult = TEEC_InvokeCommand(&TeecSession, 11654aa61755SAndy Ye 143, 11664aa61755SAndy Ye &TeecOperation, 11674aa61755SAndy Ye &ErrorOrigin); 1168f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1169f4e1db95SHisping Lin goto exit; 11704aa61755SAndy Ye 11714aa61755SAndy Ye *dh_size = TeecOperation.params[0].tmpref.size; 11724aa61755SAndy Ye memcpy(dh, SharedMem0.buffer, SharedMem0.size); 1173f4e1db95SHisping Lin exit: 11744aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem0); 11754aa61755SAndy Ye TEEC_CloseSession(&TeecSession); 1176f4e1db95SHisping Lin TEEC_FinalizeContext(&TeecContext); 11774aa61755SAndy Ye 11784aa61755SAndy Ye return TeecResult; 11794aa61755SAndy Ye } 11804aa61755SAndy Ye 11814aa61755SAndy Ye uint32_t trusty_attest_uuid(uint8_t *uuid, uint32_t *uuid_size) 11824aa61755SAndy Ye { 11834aa61755SAndy Ye TEEC_Result TeecResult; 11844aa61755SAndy Ye TEEC_Context TeecContext; 11854aa61755SAndy Ye TEEC_Session TeecSession; 11864aa61755SAndy Ye uint32_t ErrorOrigin; 11874aa61755SAndy Ye TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6, 11884aa61755SAndy Ye { 0xa8, 0x69, 0x9c, 0xe6, 11894aa61755SAndy Ye 0x88, 0x6c, 0x5d, 0x5d 11904aa61755SAndy Ye } 11914aa61755SAndy Ye }; 11924aa61755SAndy Ye TEEC_UUID *TeecUuid = &tempuuid; 11934aa61755SAndy Ye TEEC_Operation TeecOperation = {0}; 11943251364cSHisping Lin struct blk_desc *dev_desc; 11953251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 11966651d4c0SJason Zhu if (!dev_desc) { 11976651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 11986651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 11996651d4c0SJason Zhu } 12004aa61755SAndy Ye 1201f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 1202f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1203f4e1db95SHisping Lin return TeecResult; 12044aa61755SAndy Ye 12054aa61755SAndy Ye TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1206f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1207f4e1db95SHisping Lin return TeecResult; 12084aa61755SAndy Ye 12093251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 12103251364cSHisping Lin TEEC_NONE, 12113251364cSHisping Lin TEEC_NONE, 12123251364cSHisping Lin TEEC_NONE); 12133251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 1214b9a7e756SHisping Lin if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0) 1215b9a7e756SHisping Lin TeecOperation.params[0].value.a = 1; 1216b9a7e756SHisping Lin else 1217b9a7e756SHisping Lin TeecOperation.params[0].value.a = 0; 1218b9a7e756SHisping Lin 12193251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 12203251364cSHisping Lin TeecOperation.params[0].value.a = 0; 12213251364cSHisping Lin #endif 12223251364cSHisping Lin 12234aa61755SAndy Ye TeecResult = TEEC_OpenSession(&TeecContext, 12244aa61755SAndy Ye &TeecSession, 12254aa61755SAndy Ye TeecUuid, 12264aa61755SAndy Ye TEEC_LOGIN_PUBLIC, 12274aa61755SAndy Ye NULL, 12283251364cSHisping Lin &TeecOperation, 12294aa61755SAndy Ye &ErrorOrigin); 1230f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1231f4e1db95SHisping Lin return TeecResult; 12324aa61755SAndy Ye 12334aa61755SAndy Ye TEEC_SharedMemory SharedMem0 = {0}; 12344aa61755SAndy Ye 12354aa61755SAndy Ye SharedMem0.size = *uuid_size; 12364aa61755SAndy Ye SharedMem0.flags = 0; 12374aa61755SAndy Ye 12384aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 1239f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1240f4e1db95SHisping Lin goto exit; 12414aa61755SAndy Ye 12424aa61755SAndy Ye TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 12434aa61755SAndy Ye TeecOperation.params[0].tmpref.size = SharedMem0.size; 12444aa61755SAndy Ye 12454aa61755SAndy Ye TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, 12464aa61755SAndy Ye TEEC_NONE, 12474aa61755SAndy Ye TEEC_NONE, 12484aa61755SAndy Ye TEEC_NONE); 12494aa61755SAndy Ye 12504aa61755SAndy Ye TeecResult = TEEC_InvokeCommand(&TeecSession, 12514aa61755SAndy Ye 144, 12524aa61755SAndy Ye &TeecOperation, 12534aa61755SAndy Ye &ErrorOrigin); 1254f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1255f4e1db95SHisping Lin goto exit; 12564aa61755SAndy Ye 12574aa61755SAndy Ye *uuid_size = TeecOperation.params[0].tmpref.size; 12584aa61755SAndy Ye memcpy(uuid, SharedMem0.buffer, SharedMem0.size); 1259f4e1db95SHisping Lin exit: 12604aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem0); 12614aa61755SAndy Ye TEEC_CloseSession(&TeecSession); 1262f4e1db95SHisping Lin TEEC_FinalizeContext(&TeecContext); 12634aa61755SAndy Ye 12644aa61755SAndy Ye return TeecResult; 12654aa61755SAndy Ye } 12664aa61755SAndy Ye 12674aa61755SAndy Ye uint32_t trusty_attest_get_ca(uint8_t *operation_start, 12684aa61755SAndy Ye uint32_t *operation_size, 12694aa61755SAndy Ye uint8_t *out, 12704aa61755SAndy Ye uint32_t *out_len) 12714aa61755SAndy Ye { 12724aa61755SAndy Ye TEEC_Result TeecResult; 12734aa61755SAndy Ye TEEC_Context TeecContext; 12744aa61755SAndy Ye TEEC_Session TeecSession; 12754aa61755SAndy Ye uint32_t ErrorOrigin; 12764aa61755SAndy Ye 12774aa61755SAndy Ye TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6, 12784aa61755SAndy Ye { 0xa8, 0x69, 0x9c, 0xe6, 12794aa61755SAndy Ye 0x88, 0x6c, 0x5d, 0x5d 12804aa61755SAndy Ye } 12814aa61755SAndy Ye }; 12824aa61755SAndy Ye 12834aa61755SAndy Ye TEEC_UUID *TeecUuid = &tempuuid; 12844aa61755SAndy Ye TEEC_Operation TeecOperation = {0}; 12853251364cSHisping Lin struct blk_desc *dev_desc; 12863251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 12876651d4c0SJason Zhu if (!dev_desc) { 12886651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 12896651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 12906651d4c0SJason Zhu } 12914aa61755SAndy Ye 1292f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 1293f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1294f4e1db95SHisping Lin return TeecResult; 12954aa61755SAndy Ye 12964aa61755SAndy Ye TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1297f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1298f4e1db95SHisping Lin return TeecResult; 12994aa61755SAndy Ye 13003251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 13013251364cSHisping Lin TEEC_NONE, 13023251364cSHisping Lin TEEC_NONE, 13033251364cSHisping Lin TEEC_NONE); 13043251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 1305b9a7e756SHisping Lin if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0) 1306b9a7e756SHisping Lin TeecOperation.params[0].value.a = 1; 1307b9a7e756SHisping Lin else 1308b9a7e756SHisping Lin TeecOperation.params[0].value.a = 0; 1309b9a7e756SHisping Lin 13103251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 13113251364cSHisping Lin TeecOperation.params[0].value.a = 0; 13123251364cSHisping Lin #endif 13133251364cSHisping Lin 13144aa61755SAndy Ye TeecResult = TEEC_OpenSession(&TeecContext, 13154aa61755SAndy Ye &TeecSession, 13164aa61755SAndy Ye TeecUuid, 13174aa61755SAndy Ye TEEC_LOGIN_PUBLIC, 13184aa61755SAndy Ye NULL, 13193251364cSHisping Lin &TeecOperation, 13204aa61755SAndy Ye &ErrorOrigin); 1321f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1322f4e1db95SHisping Lin return TeecResult; 13234aa61755SAndy Ye 13244aa61755SAndy Ye TEEC_SharedMemory SharedMem0 = {0}; 13254aa61755SAndy Ye 13264aa61755SAndy Ye SharedMem0.size = *operation_size; 13274aa61755SAndy Ye SharedMem0.flags = 0; 13284aa61755SAndy Ye 13294aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 1330f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1331f4e1db95SHisping Lin goto exit; 13324aa61755SAndy Ye 13334aa61755SAndy Ye memcpy(SharedMem0.buffer, operation_start, SharedMem0.size); 13344aa61755SAndy Ye 13354aa61755SAndy Ye TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 13364aa61755SAndy Ye TeecOperation.params[0].tmpref.size = SharedMem0.size; 13374aa61755SAndy Ye 13384aa61755SAndy Ye TEEC_SharedMemory SharedMem1 = {0}; 13394aa61755SAndy Ye 13404aa61755SAndy Ye SharedMem1.size = *out_len; 13414aa61755SAndy Ye SharedMem1.flags = 0; 13424aa61755SAndy Ye 13434aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 1344f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1345f4e1db95SHisping Lin goto exit; 13464aa61755SAndy Ye 13474aa61755SAndy Ye TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 13484aa61755SAndy Ye TeecOperation.params[1].tmpref.size = SharedMem1.size; 13494aa61755SAndy Ye 13504aa61755SAndy Ye TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, 13514aa61755SAndy Ye TEEC_MEMREF_TEMP_INOUT, 13524aa61755SAndy Ye TEEC_NONE, 13534aa61755SAndy Ye TEEC_NONE); 13544aa61755SAndy Ye 13554aa61755SAndy Ye TeecResult = TEEC_InvokeCommand(&TeecSession, 13564aa61755SAndy Ye 145, 13574aa61755SAndy Ye &TeecOperation, 13584aa61755SAndy Ye &ErrorOrigin); 1359f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1360f4e1db95SHisping Lin goto exit; 13614aa61755SAndy Ye 13624aa61755SAndy Ye *out_len = TeecOperation.params[1].tmpref.size; 13634aa61755SAndy Ye memcpy(out, SharedMem1.buffer, SharedMem1.size); 1364f4e1db95SHisping Lin exit: 13654aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem0); 13664aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem1); 1367f4e1db95SHisping Lin TEEC_CloseSession(&TeecSession); 1368f4e1db95SHisping Lin TEEC_FinalizeContext(&TeecContext); 13694aa61755SAndy Ye 13704aa61755SAndy Ye return TeecResult; 13714aa61755SAndy Ye } 13724aa61755SAndy Ye 13734aa61755SAndy Ye uint32_t trusty_attest_set_ca(uint8_t *ca_response, uint32_t *ca_response_size) 13744aa61755SAndy Ye { 13754aa61755SAndy Ye TEEC_Result TeecResult; 13764aa61755SAndy Ye TEEC_Context TeecContext; 13774aa61755SAndy Ye TEEC_Session TeecSession; 13784aa61755SAndy Ye uint32_t ErrorOrigin; 13794aa61755SAndy Ye TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6, 13804aa61755SAndy Ye { 0xa8, 0x69, 0x9c, 0xe6, 13814aa61755SAndy Ye 0x88, 0x6c, 0x5d, 0x5d 13824aa61755SAndy Ye } 13834aa61755SAndy Ye }; 13844aa61755SAndy Ye TEEC_UUID *TeecUuid = &tempuuid; 13854aa61755SAndy Ye TEEC_Operation TeecOperation = {0}; 13863251364cSHisping Lin struct blk_desc *dev_desc; 13873251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 13886651d4c0SJason Zhu if (!dev_desc) { 13896651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 13906651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 13916651d4c0SJason Zhu } 1392f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 1393f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1394f4e1db95SHisping Lin return TeecResult; 13954aa61755SAndy Ye 13964aa61755SAndy Ye TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1397f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1398f4e1db95SHisping Lin return TeecResult; 13994aa61755SAndy Ye 14003251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 14013251364cSHisping Lin TEEC_NONE, 14023251364cSHisping Lin TEEC_NONE, 14033251364cSHisping Lin TEEC_NONE); 14043251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 1405b9a7e756SHisping Lin if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0) 1406b9a7e756SHisping Lin TeecOperation.params[0].value.a = 1; 1407b9a7e756SHisping Lin else 1408b9a7e756SHisping Lin TeecOperation.params[0].value.a = 0; 1409b9a7e756SHisping Lin 14103251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 14113251364cSHisping Lin TeecOperation.params[0].value.a = 0; 14123251364cSHisping Lin #endif 14133251364cSHisping Lin 14144aa61755SAndy Ye TeecResult = TEEC_OpenSession(&TeecContext, 14154aa61755SAndy Ye &TeecSession, 14164aa61755SAndy Ye TeecUuid, 14174aa61755SAndy Ye TEEC_LOGIN_PUBLIC, 14184aa61755SAndy Ye NULL, 14193251364cSHisping Lin &TeecOperation, 14204aa61755SAndy Ye &ErrorOrigin); 1421f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1422f4e1db95SHisping Lin return TeecResult; 14234aa61755SAndy Ye 14244aa61755SAndy Ye TEEC_SharedMemory SharedMem0 = {0}; 14254aa61755SAndy Ye 14264aa61755SAndy Ye SharedMem0.size = *ca_response_size; 14274aa61755SAndy Ye SharedMem0.flags = 0; 14284aa61755SAndy Ye 14294aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 1430f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1431f4e1db95SHisping Lin goto exit; 14324aa61755SAndy Ye 14334aa61755SAndy Ye memcpy(SharedMem0.buffer, ca_response, SharedMem0.size); 14344aa61755SAndy Ye 14354aa61755SAndy Ye TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 14364aa61755SAndy Ye TeecOperation.params[0].tmpref.size = SharedMem0.size; 14374aa61755SAndy Ye 14384aa61755SAndy Ye TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, 14394aa61755SAndy Ye TEEC_NONE, 14404aa61755SAndy Ye TEEC_NONE, 14414aa61755SAndy Ye TEEC_NONE); 14424aa61755SAndy Ye 14434aa61755SAndy Ye TeecResult = TEEC_InvokeCommand(&TeecSession, 14444aa61755SAndy Ye 146, 14454aa61755SAndy Ye &TeecOperation, 14464aa61755SAndy Ye &ErrorOrigin); 1447f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1448f4e1db95SHisping Lin goto exit; 1449f4e1db95SHisping Lin exit: 14504aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem0); 14514aa61755SAndy Ye TEEC_CloseSession(&TeecSession); 1452f4e1db95SHisping Lin TEEC_FinalizeContext(&TeecContext); 14534aa61755SAndy Ye 14544aa61755SAndy Ye return TeecResult; 14554aa61755SAndy Ye } 1456