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 3210f41197SHisping Lin #define STORAGE_CMD_TA_ENCRYPTION_KEY_IS_WRITTEN 20 33a828eba9SHisping Lin #define STORAGE_CMD_WRITE_OEM_HDCP_KEY 21 34e8bc2655SHisping Lin #define STORAGE_CMD_OEM_HDCP_KEY_IS_WRITTEN 22 35bfd9cea4SHisping Lin #define STORAGE_CMD_SET_OEM_HDCP_KEY_MASK 23 36*1ac64e8aSHisping Lin #define STORAGE_CMD_WRITE_OEM_ENCRYPT_DATA 24 37ae8ec5e1SHisping Lin 382f8c34bdSxb.wang #define CRYPTO_SERVICE_CMD_OEM_OTP_KEY_PHYS_CIPHER 0x00000002 39fc3694d6Sxb.wang 40fc3694d6Sxb.wang #define RK_CRYPTO_SERVICE_UUID { 0x0cacdb5d, 0x4fea, 0x466c, \ 41fc3694d6Sxb.wang { 0x97, 0x16, 0x3d, 0x54, 0x16, 0x52, 0x83, 0x0f } } 42fc3694d6Sxb.wang 43ae8ec5e1SHisping Lin static uint8_t b2hs_add_base(uint8_t in) 44ae8ec5e1SHisping Lin { 45ae8ec5e1SHisping Lin if (in > 9) 46ae8ec5e1SHisping Lin return in + 55; 47ae8ec5e1SHisping Lin else 48ae8ec5e1SHisping Lin return in + 48; 49ae8ec5e1SHisping Lin } 50ae8ec5e1SHisping Lin 51c7de5349SHisping Lin static uint32_t b2hs(uint8_t *b, uint8_t *hs, uint32_t blen, uint32_t hslen) 52ae8ec5e1SHisping Lin { 53ae8ec5e1SHisping Lin uint32_t i = 0; 54ae8ec5e1SHisping Lin 55ae8ec5e1SHisping Lin if (blen * 2 + 1 > hslen) 56ae8ec5e1SHisping Lin return 0; 57ae8ec5e1SHisping Lin 58ae8ec5e1SHisping Lin for (; i < blen; i++) { 59ae8ec5e1SHisping Lin hs[i * 2 + 1] = b2hs_add_base(b[i] & 0xf); 60ae8ec5e1SHisping Lin hs[i * 2] = b2hs_add_base(b[i] >> 4); 61ae8ec5e1SHisping Lin } 62ae8ec5e1SHisping Lin hs[blen * 2] = 0; 63ae8ec5e1SHisping Lin 64ae8ec5e1SHisping Lin return blen * 2; 65ae8ec5e1SHisping Lin } 66ae8ec5e1SHisping Lin 672f8c34bdSxb.wang static void crypto_flush_cacheline(uint32_t addr, uint32_t size) 682f8c34bdSxb.wang { 692f8c34bdSxb.wang ulong alignment = CONFIG_SYS_CACHELINE_SIZE; 702f8c34bdSxb.wang ulong aligned_input, aligned_len; 712f8c34bdSxb.wang 722f8c34bdSxb.wang if (!addr || !size) 732f8c34bdSxb.wang return; 742f8c34bdSxb.wang 752f8c34bdSxb.wang /* Must flush dcache before crypto DMA fetch data region */ 762f8c34bdSxb.wang aligned_input = round_down(addr, alignment); 772f8c34bdSxb.wang aligned_len = round_up(size + (addr - aligned_input), alignment); 782f8c34bdSxb.wang flush_cache(aligned_input, aligned_len); 792f8c34bdSxb.wang } 802f8c34bdSxb.wang 81a900eef3SHisping Lin static void crypto_invalidate_cacheline(uint32_t addr, uint32_t size) 82a900eef3SHisping Lin { 83a900eef3SHisping Lin ulong alignment = CONFIG_SYS_CACHELINE_SIZE; 84a900eef3SHisping Lin ulong aligned_input, aligned_len; 85a900eef3SHisping Lin 86a900eef3SHisping Lin if (!addr || !size) 87a900eef3SHisping Lin return; 88a900eef3SHisping Lin 89a900eef3SHisping Lin /* Must invalidate dcache after crypto DMA write data region */ 90a900eef3SHisping Lin aligned_input = round_down(addr, alignment); 91a900eef3SHisping Lin aligned_len = round_up(size + (addr - aligned_input), alignment); 92a900eef3SHisping Lin invalidate_dcache_range(aligned_input, aligned_input + aligned_len); 93a900eef3SHisping Lin } 94a900eef3SHisping Lin 95c7de5349SHisping Lin static uint32_t trusty_base_write_security_data(char *filename, 96c7de5349SHisping Lin uint32_t filename_size, 97c7de5349SHisping Lin uint8_t *data, 98c7de5349SHisping Lin uint32_t data_size) 99ae8ec5e1SHisping Lin { 100ae8ec5e1SHisping Lin TEEC_Result TeecResult; 101ae8ec5e1SHisping Lin TEEC_Context TeecContext; 102ae8ec5e1SHisping Lin TEEC_Session TeecSession; 103ae8ec5e1SHisping Lin uint32_t ErrorOrigin; 104ae8ec5e1SHisping Lin TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 105ae8ec5e1SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 106ae8ec5e1SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 107ae8ec5e1SHisping Lin TEEC_Operation TeecOperation = {0}; 1083251364cSHisping Lin struct blk_desc *dev_desc; 1093251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 1106651d4c0SJason Zhu if (!dev_desc) { 1116651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 1126651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 1136651d4c0SJason Zhu } 1143251364cSHisping Lin 115f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 116f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 117f4e1db95SHisping Lin return TeecResult; 118ae8ec5e1SHisping Lin 119ae8ec5e1SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 120f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 121f4e1db95SHisping Lin return TeecResult; 122ae8ec5e1SHisping Lin 1233251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 1243251364cSHisping Lin TEEC_NONE, 1253251364cSHisping Lin TEEC_NONE, 1263251364cSHisping Lin TEEC_NONE); 1273251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 128b9a7e756SHisping Lin if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0) 129b9a7e756SHisping Lin TeecOperation.params[0].value.a = 1; 130b9a7e756SHisping Lin else 131b9a7e756SHisping Lin TeecOperation.params[0].value.a = 0; 1323251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 1333251364cSHisping Lin TeecOperation.params[0].value.a = 0; 1343251364cSHisping Lin #endif 1353251364cSHisping Lin 136ae8ec5e1SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 137ae8ec5e1SHisping Lin &TeecSession, 138ae8ec5e1SHisping Lin TeecUuid, 139ae8ec5e1SHisping Lin TEEC_LOGIN_PUBLIC, 140ae8ec5e1SHisping Lin NULL, 1413251364cSHisping Lin &TeecOperation, 142ae8ec5e1SHisping Lin &ErrorOrigin); 143f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 144f4e1db95SHisping Lin return TeecResult; 145ae8ec5e1SHisping Lin 146ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 147ae8ec5e1SHisping Lin 148c7de5349SHisping Lin SharedMem0.size = filename_size; 149ae8ec5e1SHisping Lin SharedMem0.flags = 0; 150ae8ec5e1SHisping Lin 151ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 152f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 153f4e1db95SHisping Lin goto exit; 154ae8ec5e1SHisping Lin 155c7de5349SHisping Lin memcpy(SharedMem0.buffer, filename, SharedMem0.size); 156ae8ec5e1SHisping Lin 157ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem1 = {0}; 158ae8ec5e1SHisping Lin 159c7de5349SHisping Lin SharedMem1.size = data_size; 160c7de5349SHisping Lin SharedMem1.flags = 0; 161c7de5349SHisping Lin 162c7de5349SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 163c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 164c7de5349SHisping Lin goto exit; 165c7de5349SHisping Lin 166c7de5349SHisping Lin memcpy(SharedMem1.buffer, data, SharedMem1.size); 167c7de5349SHisping Lin 168c7de5349SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 169c7de5349SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 170c7de5349SHisping Lin 171c7de5349SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 172c7de5349SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem1.size; 173c7de5349SHisping Lin 174c7de5349SHisping Lin 175c7de5349SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 176c7de5349SHisping Lin TEEC_MEMREF_TEMP_INOUT, 177c7de5349SHisping Lin TEEC_NONE, 178c7de5349SHisping Lin TEEC_NONE); 179c7de5349SHisping Lin 180c7de5349SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 181c7de5349SHisping Lin 1, 182c7de5349SHisping Lin &TeecOperation, 183c7de5349SHisping Lin &ErrorOrigin); 184c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 185c7de5349SHisping Lin goto exit; 186c7de5349SHisping Lin exit: 187c7de5349SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 188c7de5349SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem1); 189c7de5349SHisping Lin TEEC_CloseSession(&TeecSession); 190c7de5349SHisping Lin TEEC_FinalizeContext(&TeecContext); 191c7de5349SHisping Lin 192c7de5349SHisping Lin return TeecResult; 193c7de5349SHisping Lin } 194c7de5349SHisping Lin 195c7de5349SHisping Lin static uint32_t trusty_base_read_security_data(char *filename, 196c7de5349SHisping Lin uint32_t filename_size, 197c7de5349SHisping Lin uint8_t *data, 198c7de5349SHisping Lin uint32_t data_size) 199c7de5349SHisping Lin { 200c7de5349SHisping Lin TEEC_Result TeecResult; 201c7de5349SHisping Lin TEEC_Context TeecContext; 202c7de5349SHisping Lin TEEC_Session TeecSession; 203c7de5349SHisping Lin uint32_t ErrorOrigin; 204c7de5349SHisping Lin TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 205c7de5349SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 206c7de5349SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 207c7de5349SHisping Lin TEEC_Operation TeecOperation = {0}; 208c7de5349SHisping Lin 209c7de5349SHisping Lin struct blk_desc *dev_desc; 210c7de5349SHisping Lin dev_desc = rockchip_get_bootdev(); 211c7de5349SHisping Lin if (!dev_desc) { 212c7de5349SHisping Lin printf("%s: dev_desc is NULL!\n", __func__); 213c7de5349SHisping Lin return -TEEC_ERROR_GENERIC; 214c7de5349SHisping Lin } 215c7de5349SHisping Lin 216c7de5349SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 217c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 218c7de5349SHisping Lin return TeecResult; 219c7de5349SHisping Lin 220c7de5349SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 221c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 222c7de5349SHisping Lin return TeecResult; 223c7de5349SHisping Lin 224c7de5349SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 225c7de5349SHisping Lin TEEC_NONE, 226c7de5349SHisping Lin TEEC_NONE, 227c7de5349SHisping Lin TEEC_NONE); 228c7de5349SHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 229c7de5349SHisping Lin if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0) 230c7de5349SHisping Lin TeecOperation.params[0].value.a = 1; 231c7de5349SHisping Lin else 232c7de5349SHisping Lin TeecOperation.params[0].value.a = 0; 233c7de5349SHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 234c7de5349SHisping Lin TeecOperation.params[0].value.a = 0; 235c7de5349SHisping Lin #endif 236c7de5349SHisping Lin 237c7de5349SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 238c7de5349SHisping Lin &TeecSession, 239c7de5349SHisping Lin TeecUuid, 240c7de5349SHisping Lin TEEC_LOGIN_PUBLIC, 241c7de5349SHisping Lin NULL, 242c7de5349SHisping Lin &TeecOperation, 243c7de5349SHisping Lin &ErrorOrigin); 244c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 245c7de5349SHisping Lin return TeecResult; 246c7de5349SHisping Lin 247c7de5349SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 248c7de5349SHisping Lin 249c7de5349SHisping Lin SharedMem0.size = filename_size; 250c7de5349SHisping Lin SharedMem0.flags = 0; 251c7de5349SHisping Lin 252c7de5349SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 253c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 254c7de5349SHisping Lin goto exit; 255c7de5349SHisping Lin 256c7de5349SHisping Lin memcpy(SharedMem0.buffer, filename, SharedMem0.size); 257c7de5349SHisping Lin 258c7de5349SHisping Lin TEEC_SharedMemory SharedMem1 = {0}; 259c7de5349SHisping Lin 260c7de5349SHisping Lin SharedMem1.size = data_size; 261ae8ec5e1SHisping Lin SharedMem1.flags = 0; 262ae8ec5e1SHisping Lin 263ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 264f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 265f4e1db95SHisping Lin goto exit; 266ae8ec5e1SHisping Lin 267ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 268ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 269ae8ec5e1SHisping Lin 270ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 271ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem1.size; 272ae8ec5e1SHisping Lin 273ae8ec5e1SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 274ae8ec5e1SHisping Lin TEEC_MEMREF_TEMP_INOUT, 275ae8ec5e1SHisping Lin TEEC_NONE, 276ae8ec5e1SHisping Lin TEEC_NONE); 277ae8ec5e1SHisping Lin 278ae8ec5e1SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 279ae8ec5e1SHisping Lin 0, 280ae8ec5e1SHisping Lin &TeecOperation, 281ae8ec5e1SHisping Lin &ErrorOrigin); 28246b2a054SHisping Lin if (TeecResult == TEEC_SUCCESS) 283c7de5349SHisping Lin memcpy(data, SharedMem1.buffer, SharedMem1.size); 284f4e1db95SHisping Lin exit: 285ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 286ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem1); 287ae8ec5e1SHisping Lin TEEC_CloseSession(&TeecSession); 28846b2a054SHisping Lin TEEC_FinalizeContext(&TeecContext); 289ae8ec5e1SHisping Lin 290ae8ec5e1SHisping Lin return TeecResult; 291ae8ec5e1SHisping Lin } 292ae8ec5e1SHisping Lin 293c7de5349SHisping Lin static uint32_t trusty_base_end_security_data(void) 294c7de5349SHisping Lin { 295c7de5349SHisping Lin TEEC_Result TeecResult; 296c7de5349SHisping Lin TEEC_Context TeecContext; 297c7de5349SHisping Lin TEEC_Session TeecSession; 298c7de5349SHisping Lin uint32_t ErrorOrigin; 299c7de5349SHisping Lin TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 300c7de5349SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 301c7de5349SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 302c7de5349SHisping Lin TEEC_Operation TeecOperation = {0}; 303c7de5349SHisping Lin 304c7de5349SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 305c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 306c7de5349SHisping Lin return TeecResult; 307c7de5349SHisping Lin 308c7de5349SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 309c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 310c7de5349SHisping Lin return TeecResult; 311c7de5349SHisping Lin 312c7de5349SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 313c7de5349SHisping Lin &TeecSession, 314c7de5349SHisping Lin TeecUuid, 315c7de5349SHisping Lin TEEC_LOGIN_PUBLIC, 316c7de5349SHisping Lin NULL, 317c7de5349SHisping Lin NULL, 318c7de5349SHisping Lin &ErrorOrigin); 319c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 320c7de5349SHisping Lin return TeecResult; 321c7de5349SHisping Lin 322c7de5349SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE, 323c7de5349SHisping Lin TEEC_NONE, 324c7de5349SHisping Lin TEEC_NONE, 325c7de5349SHisping Lin TEEC_NONE); 326c7de5349SHisping Lin 327c7de5349SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 328c7de5349SHisping Lin 2, 329c7de5349SHisping Lin &TeecOperation, 330c7de5349SHisping Lin &ErrorOrigin); 331c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 332c7de5349SHisping Lin goto exit; 333c7de5349SHisping Lin exit: 334c7de5349SHisping Lin TEEC_CloseSession(&TeecSession); 335c7de5349SHisping Lin TEEC_FinalizeContext(&TeecContext); 336c7de5349SHisping Lin 337c7de5349SHisping Lin return TeecResult; 338c7de5349SHisping Lin } 339c7de5349SHisping Lin 34034f2e8f6SHisping Lin static void trusty_notify_always_use_security(void) 34134f2e8f6SHisping Lin { 34234f2e8f6SHisping Lin #if defined(CONFIG_OPTEE_V2) && defined(CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION) 34334f2e8f6SHisping Lin TEEC_Result TeecResult; 34434f2e8f6SHisping Lin TEEC_Context TeecContext; 34534f2e8f6SHisping Lin TEEC_Session TeecSession; 34634f2e8f6SHisping Lin uint32_t ErrorOrigin; 34734f2e8f6SHisping Lin TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 34834f2e8f6SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 34934f2e8f6SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 35034f2e8f6SHisping Lin TEEC_Operation TeecOperation = {0}; 35134f2e8f6SHisping Lin 35234f2e8f6SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 35334f2e8f6SHisping Lin if (TeecResult != TEEC_SUCCESS) 35434f2e8f6SHisping Lin return; 35534f2e8f6SHisping Lin 35634f2e8f6SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 35734f2e8f6SHisping Lin if (TeecResult != TEEC_SUCCESS) 35834f2e8f6SHisping Lin return; 35934f2e8f6SHisping Lin 36034f2e8f6SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 36134f2e8f6SHisping Lin &TeecSession, 36234f2e8f6SHisping Lin TeecUuid, 36334f2e8f6SHisping Lin TEEC_LOGIN_PUBLIC, 36434f2e8f6SHisping Lin NULL, 36534f2e8f6SHisping Lin NULL, 36634f2e8f6SHisping Lin &ErrorOrigin); 36734f2e8f6SHisping Lin if (TeecResult != TEEC_SUCCESS) 36834f2e8f6SHisping Lin return; 36934f2e8f6SHisping Lin 37034f2e8f6SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE, 37134f2e8f6SHisping Lin TEEC_NONE, 37234f2e8f6SHisping Lin TEEC_NONE, 37334f2e8f6SHisping Lin TEEC_NONE); 37434f2e8f6SHisping Lin 37534f2e8f6SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 37634f2e8f6SHisping Lin 9, 37734f2e8f6SHisping Lin &TeecOperation, 37834f2e8f6SHisping Lin &ErrorOrigin); 37934f2e8f6SHisping Lin if (TeecResult != TEEC_SUCCESS) 38034f2e8f6SHisping Lin debug("notify always use security fail! please update optee!"); 38134f2e8f6SHisping Lin 38234f2e8f6SHisping Lin TEEC_CloseSession(&TeecSession); 38334f2e8f6SHisping Lin TEEC_FinalizeContext(&TeecContext); 38434f2e8f6SHisping Lin 38534f2e8f6SHisping Lin return; 38634f2e8f6SHisping Lin #endif 38734f2e8f6SHisping Lin } 38834f2e8f6SHisping Lin 389c7de5349SHisping Lin uint32_t trusty_read_rollback_index(uint32_t slot, uint64_t *value) 390c7de5349SHisping Lin { 391c7de5349SHisping Lin char hs[9]; 392c7de5349SHisping Lin 393c7de5349SHisping Lin b2hs((uint8_t *)&slot, (uint8_t *)hs, 4, 9); 394c7de5349SHisping Lin 395c7de5349SHisping Lin return trusty_base_read_security_data(hs, 8, (uint8_t *)value, 8); 396c7de5349SHisping Lin } 397c7de5349SHisping Lin 398ae8ec5e1SHisping Lin uint32_t trusty_write_rollback_index(uint32_t slot, uint64_t value) 399ae8ec5e1SHisping Lin { 400c7de5349SHisping Lin char hs[9]; 4013251364cSHisping Lin 402c7de5349SHisping Lin b2hs((uint8_t *)&slot, (uint8_t *)hs, 4, 9); 403ae8ec5e1SHisping Lin 404c7de5349SHisping Lin return trusty_base_write_security_data(hs, 8, (uint8_t *)&value, 8); 405ae8ec5e1SHisping Lin } 406ae8ec5e1SHisping Lin 407ae8ec5e1SHisping Lin uint32_t trusty_read_permanent_attributes(uint8_t *attributes, uint32_t size) 408ae8ec5e1SHisping Lin { 409c7de5349SHisping Lin return trusty_base_read_security_data("attributes", 410c7de5349SHisping Lin sizeof("attributes"), attributes, size); 411ae8ec5e1SHisping Lin } 412ae8ec5e1SHisping Lin 413ae8ec5e1SHisping Lin uint32_t trusty_write_permanent_attributes(uint8_t *attributes, uint32_t size) 414ae8ec5e1SHisping Lin { 415c7de5349SHisping Lin return trusty_base_write_security_data("attributes", 416c7de5349SHisping Lin sizeof("attributes"), attributes, size); 4176651d4c0SJason Zhu } 418ae8ec5e1SHisping Lin 419c7de5349SHisping Lin uint32_t trusty_read_permanent_attributes_flag(uint8_t *attributes) 420c7de5349SHisping Lin { 421c7de5349SHisping Lin return trusty_base_read_security_data("attributes_flag", 422c7de5349SHisping Lin sizeof("attributes_flag"), attributes, 1); 423c7de5349SHisping Lin } 424ae8ec5e1SHisping Lin 425c7de5349SHisping Lin uint32_t trusty_write_permanent_attributes_flag(uint8_t attributes) 426c7de5349SHisping Lin { 427c7de5349SHisping Lin return trusty_base_write_security_data("attributes_flag", 428c7de5349SHisping Lin sizeof("attributes_flag"), &attributes, 1); 429ae8ec5e1SHisping Lin } 430ae8ec5e1SHisping Lin 431564654ebSJason Zhu uint32_t trusty_read_permanent_attributes_cer(uint8_t *attributes, 432564654ebSJason Zhu uint32_t size) 433564654ebSJason Zhu { 434c7de5349SHisping Lin return trusty_base_read_security_data("rsacer", 435c7de5349SHisping Lin sizeof("rsacer"), attributes, size); 436564654ebSJason Zhu } 437564654ebSJason Zhu 438564654ebSJason Zhu uint32_t trusty_write_permanent_attributes_cer(uint8_t *attributes, 439564654ebSJason Zhu uint32_t size) 440564654ebSJason Zhu { 441c7de5349SHisping Lin return trusty_base_write_security_data("rsacer", 442c7de5349SHisping Lin sizeof("rsacer"), attributes, size); 443564654ebSJason Zhu } 444564654ebSJason Zhu 445ae8ec5e1SHisping Lin uint32_t trusty_read_lock_state(uint8_t *lock_state) 446ae8ec5e1SHisping Lin { 447c7de5349SHisping Lin return trusty_base_read_security_data("lock_state", 448c7de5349SHisping Lin sizeof("lock_state"), lock_state, 1); 449ae8ec5e1SHisping Lin } 450ae8ec5e1SHisping Lin 451ae8ec5e1SHisping Lin uint32_t trusty_write_lock_state(uint8_t lock_state) 452ae8ec5e1SHisping Lin { 453c7de5349SHisping Lin return trusty_base_write_security_data("lock_state", 454c7de5349SHisping Lin sizeof("lock_state"), &lock_state, 1); 455ae8ec5e1SHisping Lin } 456ae8ec5e1SHisping Lin 457ae8ec5e1SHisping Lin uint32_t trusty_read_flash_lock_state(uint8_t *flash_lock_state) 458ae8ec5e1SHisping Lin { 459c7de5349SHisping Lin return trusty_base_read_security_data("flash_lock_state", 460c7de5349SHisping Lin sizeof("flash_lock_state"), flash_lock_state, 1); 461c7de5349SHisping Lin } 462c7de5349SHisping Lin 463c7de5349SHisping Lin uint32_t trusty_write_flash_lock_state(uint8_t flash_lock_state) 464c7de5349SHisping Lin { 465c7de5349SHisping Lin return trusty_base_write_security_data("flash_lock_state", 466c7de5349SHisping Lin sizeof("flash_lock_state"), &flash_lock_state, 1); 467c7de5349SHisping Lin } 468c7de5349SHisping Lin 469c7de5349SHisping Lin static uint32_t trusty_base_end_efuse_or_otp(void) 470c7de5349SHisping Lin { 471ae8ec5e1SHisping Lin TEEC_Result TeecResult; 472ae8ec5e1SHisping Lin TEEC_Context TeecContext; 473ae8ec5e1SHisping Lin TEEC_Session TeecSession; 474ae8ec5e1SHisping Lin uint32_t ErrorOrigin; 475c7de5349SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 476c7de5349SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 477c7de5349SHisping Lin 478ae8ec5e1SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 479ae8ec5e1SHisping Lin TEEC_Operation TeecOperation = {0}; 480ae8ec5e1SHisping Lin 481f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 482f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 483f4e1db95SHisping Lin return TeecResult; 484ae8ec5e1SHisping Lin 485ae8ec5e1SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 486f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 487f4e1db95SHisping Lin return TeecResult; 488ae8ec5e1SHisping Lin 489ae8ec5e1SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 490ae8ec5e1SHisping Lin &TeecSession, 491ae8ec5e1SHisping Lin TeecUuid, 492ae8ec5e1SHisping Lin TEEC_LOGIN_PUBLIC, 493ae8ec5e1SHisping Lin NULL, 494c7de5349SHisping Lin NULL, 495ae8ec5e1SHisping Lin &ErrorOrigin); 496f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 497f4e1db95SHisping Lin return TeecResult; 498ae8ec5e1SHisping Lin 499c7de5349SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE, 500c7de5349SHisping Lin TEEC_NONE, 501ae8ec5e1SHisping Lin TEEC_NONE, 502ae8ec5e1SHisping Lin TEEC_NONE); 503ae8ec5e1SHisping Lin 504ae8ec5e1SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 505c7de5349SHisping Lin STORAGE_CMD_UBOOT_END_OTP, 506ae8ec5e1SHisping Lin &TeecOperation, 507ae8ec5e1SHisping Lin &ErrorOrigin); 508c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 509c7de5349SHisping Lin goto exit; 510f4e1db95SHisping Lin exit: 511ae8ec5e1SHisping Lin TEEC_CloseSession(&TeecSession); 51246b2a054SHisping Lin TEEC_FinalizeContext(&TeecContext); 513ae8ec5e1SHisping Lin 514ae8ec5e1SHisping Lin return TeecResult; 515ae8ec5e1SHisping Lin } 516ae8ec5e1SHisping Lin 517c7de5349SHisping Lin static uint32_t trusty_base_efuse_or_otp_operation(uint32_t cmd, 518c7de5349SHisping Lin uint8_t is_write, 519c7de5349SHisping Lin uint32_t *buf, 520c7de5349SHisping Lin uint32_t length) 521ae8ec5e1SHisping Lin { 522ae8ec5e1SHisping Lin TEEC_Result TeecResult; 523ae8ec5e1SHisping Lin TEEC_Context TeecContext; 524ae8ec5e1SHisping Lin TEEC_Session TeecSession; 525ae8ec5e1SHisping Lin uint32_t ErrorOrigin; 526c7de5349SHisping Lin 527c7de5349SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 528c7de5349SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 529ae8ec5e1SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 530ae8ec5e1SHisping Lin TEEC_Operation TeecOperation = {0}; 531ae8ec5e1SHisping Lin 532f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 533f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 534f4e1db95SHisping Lin return TeecResult; 535ae8ec5e1SHisping Lin 536ae8ec5e1SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 537f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 538f4e1db95SHisping Lin return TeecResult; 539ae8ec5e1SHisping Lin 540ae8ec5e1SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 541ae8ec5e1SHisping Lin &TeecSession, 542ae8ec5e1SHisping Lin TeecUuid, 543ae8ec5e1SHisping Lin TEEC_LOGIN_PUBLIC, 544ae8ec5e1SHisping Lin NULL, 545c7de5349SHisping Lin NULL, 546ae8ec5e1SHisping Lin &ErrorOrigin); 547f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 548f4e1db95SHisping Lin return TeecResult; 549ae8ec5e1SHisping Lin 550ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 551ae8ec5e1SHisping Lin 552c7de5349SHisping Lin SharedMem0.size = length * sizeof(uint32_t); 553ae8ec5e1SHisping Lin SharedMem0.flags = 0; 554ae8ec5e1SHisping Lin 555ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 556f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 557f4e1db95SHisping Lin goto exit; 558ae8ec5e1SHisping Lin 559ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 560ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 561ae8ec5e1SHisping Lin 562c7de5349SHisping Lin if (is_write) { 563c7de5349SHisping Lin memcpy(SharedMem0.buffer, buf, SharedMem0.size); 564ae8ec5e1SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 565c7de5349SHisping Lin TEEC_NONE, 566ae8ec5e1SHisping Lin TEEC_NONE, 567ae8ec5e1SHisping Lin TEEC_NONE); 568ae8ec5e1SHisping Lin 569c7de5349SHisping Lin } else { 570c7de5349SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT, 571c7de5349SHisping Lin TEEC_NONE, 572c7de5349SHisping Lin TEEC_NONE, 573c7de5349SHisping Lin TEEC_NONE); 574c7de5349SHisping Lin } 575c7de5349SHisping Lin 576ae8ec5e1SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 577c7de5349SHisping Lin cmd, 578ae8ec5e1SHisping Lin &TeecOperation, 579ae8ec5e1SHisping Lin &ErrorOrigin); 580f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 581f4e1db95SHisping Lin goto exit; 582c7de5349SHisping Lin 583c7de5349SHisping Lin if (!is_write) 584c7de5349SHisping Lin memcpy(buf, SharedMem0.buffer, SharedMem0.size); 585c7de5349SHisping Lin 586f4e1db95SHisping Lin exit: 587ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 588ae8ec5e1SHisping Lin TEEC_CloseSession(&TeecSession); 58946b2a054SHisping Lin TEEC_FinalizeContext(&TeecContext); 590ae8ec5e1SHisping Lin 591ae8ec5e1SHisping Lin return TeecResult; 592ae8ec5e1SHisping Lin } 593ae8ec5e1SHisping Lin 5946ef445a4SHisping Lin uint32_t trusty_read_attribute_hash(uint32_t *buf, uint32_t length) 5956ef445a4SHisping Lin { 596c7de5349SHisping Lin return trusty_base_efuse_or_otp_operation(STORAGE_CMD_READ_ATTRIBUTE_HASH, 597c7de5349SHisping Lin false, buf, length); 5986ef445a4SHisping Lin } 5996ef445a4SHisping Lin 6006ef445a4SHisping Lin uint32_t trusty_write_attribute_hash(uint32_t *buf, uint32_t length) 6016ef445a4SHisping Lin { 602c7de5349SHisping Lin return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_ATTRIBUTE_HASH, 603c7de5349SHisping Lin true, buf, length); 60416539616SHisping Lin } 60516539616SHisping Lin 60616539616SHisping Lin uint32_t trusty_notify_optee_uboot_end(void) 60716539616SHisping Lin { 60816539616SHisping Lin TEEC_Result res; 609c7de5349SHisping Lin 610c7de5349SHisping Lin res = trusty_base_end_security_data(); 611c7de5349SHisping Lin res |= trusty_base_end_efuse_or_otp(); 61216539616SHisping Lin return res; 61316539616SHisping Lin } 6142cd27853SHisping Lin 6152cd27853SHisping Lin uint32_t trusty_read_vbootkey_hash(uint32_t *buf, uint32_t length) 6162cd27853SHisping Lin { 617c7de5349SHisping Lin return trusty_base_efuse_or_otp_operation(STORAGE_CMD_READ_VBOOTKEY_HASH, 618c7de5349SHisping Lin false, buf, length); 6192cd27853SHisping Lin } 620c7de5349SHisping Lin 6212cd27853SHisping Lin uint32_t trusty_write_vbootkey_hash(uint32_t *buf, uint32_t length) 6222cd27853SHisping Lin { 623c7de5349SHisping Lin return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_VBOOTKEY_HASH, 624c7de5349SHisping Lin true, buf, length); 6252cd27853SHisping Lin } 626095e2a82SHisping Lin 627468df3b2SHisping Lin uint32_t trusty_read_vbootkey_enable_flag(uint8_t *flag) 628468df3b2SHisping Lin { 629468df3b2SHisping Lin uint32_t bootflag; 630c7de5349SHisping Lin TEEC_Result TeecResult; 631468df3b2SHisping Lin 632f07e1686SHisping Lin *flag = 0; 633f07e1686SHisping Lin 634c7de5349SHisping Lin TeecResult = trusty_base_efuse_or_otp_operation(STORAGE_CMD_READ_ENABLE_FLAG, 635c7de5349SHisping Lin false, &bootflag, 1); 636468df3b2SHisping Lin 637468df3b2SHisping Lin if (TeecResult == TEEC_SUCCESS) { 6380202ee8aSHisping Lin #if defined(CONFIG_ROCKCHIP_RK3288) 6390202ee8aSHisping Lin if (bootflag == 0x00000001) 6400202ee8aSHisping Lin *flag = 1; 6410202ee8aSHisping Lin #else 642468df3b2SHisping Lin if (bootflag == 0x000000FF) 643468df3b2SHisping Lin *flag = 1; 6440202ee8aSHisping Lin #endif 645468df3b2SHisping Lin } 646095e2a82SHisping Lin return TeecResult; 647095e2a82SHisping Lin } 6484aa61755SAndy Ye 6491ef63c75SHisping Lin uint32_t trusty_write_ta_encryption_key(uint32_t *buf, uint32_t length) 6501ef63c75SHisping Lin { 6511ef63c75SHisping Lin return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_TA_ENCRYPTION_KEY, 6521ef63c75SHisping Lin true, buf, length); 6531ef63c75SHisping Lin } 6541ef63c75SHisping Lin 65510f41197SHisping Lin uint32_t trusty_ta_encryption_key_is_written(uint8_t *value) 65610f41197SHisping Lin { 65710f41197SHisping Lin TEEC_Result TeecResult; 65810f41197SHisping Lin TEEC_Context TeecContext; 65910f41197SHisping Lin TEEC_Session TeecSession; 66010f41197SHisping Lin uint32_t ErrorOrigin; 66110f41197SHisping Lin 66210f41197SHisping Lin *value = 0; 66310f41197SHisping Lin 66410f41197SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 66510f41197SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 66610f41197SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 66710f41197SHisping Lin TEEC_Operation TeecOperation = {0}; 66810f41197SHisping Lin 66910f41197SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 67010f41197SHisping Lin if (TeecResult != TEEC_SUCCESS) 67110f41197SHisping Lin return TeecResult; 67210f41197SHisping Lin 67310f41197SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 67410f41197SHisping Lin if (TeecResult != TEEC_SUCCESS) 67510f41197SHisping Lin return TeecResult; 67610f41197SHisping Lin 67710f41197SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 67810f41197SHisping Lin &TeecSession, 67910f41197SHisping Lin TeecUuid, 68010f41197SHisping Lin TEEC_LOGIN_PUBLIC, 68110f41197SHisping Lin NULL, 68210f41197SHisping Lin NULL, 68310f41197SHisping Lin &ErrorOrigin); 68410f41197SHisping Lin if (TeecResult != TEEC_SUCCESS) 68510f41197SHisping Lin return TeecResult; 68610f41197SHisping Lin 68710f41197SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_OUTPUT, 68810f41197SHisping Lin TEEC_NONE, 68910f41197SHisping Lin TEEC_NONE, 69010f41197SHisping Lin TEEC_NONE); 69110f41197SHisping Lin 69210f41197SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 69310f41197SHisping Lin STORAGE_CMD_TA_ENCRYPTION_KEY_IS_WRITTEN, 69410f41197SHisping Lin &TeecOperation, 69510f41197SHisping Lin &ErrorOrigin); 69610f41197SHisping Lin if (TeecResult == TEEC_SUCCESS) 69710f41197SHisping Lin *value = TeecOperation.params[0].value.a; 69810f41197SHisping Lin 69910f41197SHisping Lin TEEC_CloseSession(&TeecSession); 70010f41197SHisping Lin TEEC_FinalizeContext(&TeecContext); 70110f41197SHisping Lin 70210f41197SHisping Lin return TeecResult; 70310f41197SHisping Lin } 70410f41197SHisping Lin 705*1ac64e8aSHisping Lin uint32_t trusty_write_oem_encrypt_data(uint32_t *buf, uint32_t length) 706*1ac64e8aSHisping Lin { 707*1ac64e8aSHisping Lin return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_OEM_ENCRYPT_DATA, 708*1ac64e8aSHisping Lin true, buf, length); 709*1ac64e8aSHisping Lin } 710*1ac64e8aSHisping Lin 711fbf29bfbSHisping Lin uint32_t trusty_check_security_level_flag(uint8_t flag) 712fbf29bfbSHisping Lin { 713fbf29bfbSHisping Lin uint32_t levelflag; 714fbf29bfbSHisping Lin 715fbf29bfbSHisping Lin levelflag = flag; 716fbf29bfbSHisping Lin return trusty_base_efuse_or_otp_operation(STORAGE_CMD_CHECK_SECURITY_LEVEL_FLAG, 717fbf29bfbSHisping Lin true, &levelflag, 1); 718fbf29bfbSHisping Lin } 719fbf29bfbSHisping Lin 720f39d4289SHisping Lin uint32_t trusty_write_oem_huk(uint32_t *buf, uint32_t length) 721f39d4289SHisping Lin { 722f39d4289SHisping Lin return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_OEM_HUK, 723f39d4289SHisping Lin true, buf, length); 724f39d4289SHisping Lin } 725f39d4289SHisping Lin 72634f2e8f6SHisping Lin static void trusty_select_security_level(void) 7277504da74SHisping Lin { 7287504da74SHisping Lin #if (CONFIG_OPTEE_SECURITY_LEVEL > 0) 7297504da74SHisping Lin TEEC_Result TeecResult; 7307504da74SHisping Lin 7317504da74SHisping Lin TeecResult = trusty_check_security_level_flag(CONFIG_OPTEE_SECURITY_LEVEL); 7327504da74SHisping Lin if (TeecResult == TEE_ERROR_CANCEL) { 7337504da74SHisping Lin run_command("download", 0); 7347504da74SHisping Lin return; 7357504da74SHisping Lin } 7367504da74SHisping Lin 7377504da74SHisping Lin if (TeecResult == TEEC_SUCCESS) 7387504da74SHisping Lin debug("optee select security level success!"); 7397504da74SHisping Lin else 7407504da74SHisping Lin panic("optee select security level fail!"); 7417504da74SHisping Lin 7427504da74SHisping Lin return; 7437504da74SHisping Lin #endif 7447504da74SHisping Lin } 7457504da74SHisping Lin 74651ac7005SHisping Lin void optee_client_init(void) 74751ac7005SHisping Lin { 74851ac7005SHisping Lin trusty_select_security_level(); 74934f2e8f6SHisping Lin trusty_notify_always_use_security(); 75051ac7005SHisping Lin } 75151ac7005SHisping Lin 752d5913350SHisping Lin uint32_t trusty_write_oem_ns_otp(uint32_t byte_off, uint8_t *byte_buf, uint32_t byte_len) 753d5913350SHisping Lin { 754d5913350SHisping Lin TEEC_Result TeecResult; 755d5913350SHisping Lin TEEC_Context TeecContext; 756d5913350SHisping Lin TEEC_Session TeecSession; 757d5913350SHisping Lin uint32_t ErrorOrigin; 758d5913350SHisping Lin 759d5913350SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 760d5913350SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 761d5913350SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 762d5913350SHisping Lin TEEC_Operation TeecOperation = {0}; 763d5913350SHisping Lin 764d5913350SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 765d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 766d5913350SHisping Lin return TeecResult; 767d5913350SHisping Lin 768d5913350SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 769d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 770d5913350SHisping Lin return TeecResult; 771d5913350SHisping Lin 772d5913350SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 773d5913350SHisping Lin &TeecSession, 774d5913350SHisping Lin TeecUuid, 775d5913350SHisping Lin TEEC_LOGIN_PUBLIC, 776d5913350SHisping Lin NULL, 777d5913350SHisping Lin NULL, 778d5913350SHisping Lin &ErrorOrigin); 779d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 780d5913350SHisping Lin return TeecResult; 781d5913350SHisping Lin 782d5913350SHisping Lin TeecOperation.params[0].value.a = byte_off; 783d5913350SHisping Lin 784d5913350SHisping Lin TEEC_SharedMemory SharedMem = {0}; 785d5913350SHisping Lin 786d5913350SHisping Lin SharedMem.size = byte_len; 787d5913350SHisping Lin SharedMem.flags = 0; 788d5913350SHisping Lin 789d5913350SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem); 790d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 791d5913350SHisping Lin goto exit; 792d5913350SHisping Lin 793d5913350SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem.buffer; 794d5913350SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem.size; 795d5913350SHisping Lin 796d5913350SHisping Lin memcpy(SharedMem.buffer, byte_buf, SharedMem.size); 797d5913350SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 798d5913350SHisping Lin TEEC_MEMREF_TEMP_INPUT, 799d5913350SHisping Lin TEEC_NONE, 800d5913350SHisping Lin TEEC_NONE); 801d5913350SHisping Lin 802d5913350SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 803d5913350SHisping Lin STORAGE_CMD_WRITE_OEM_NS_OTP, 804d5913350SHisping Lin &TeecOperation, 805d5913350SHisping Lin &ErrorOrigin); 806d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 807d5913350SHisping Lin goto exit; 808d5913350SHisping Lin 809d5913350SHisping Lin exit: 810d5913350SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem); 811d5913350SHisping Lin TEEC_CloseSession(&TeecSession); 812d5913350SHisping Lin TEEC_FinalizeContext(&TeecContext); 813d5913350SHisping Lin 814d5913350SHisping Lin return TeecResult; 815d5913350SHisping Lin } 816d5913350SHisping Lin 817d5913350SHisping Lin uint32_t trusty_read_oem_ns_otp(uint32_t byte_off, uint8_t *byte_buf, uint32_t byte_len) 818d5913350SHisping Lin { 819d5913350SHisping Lin TEEC_Result TeecResult; 820d5913350SHisping Lin TEEC_Context TeecContext; 821d5913350SHisping Lin TEEC_Session TeecSession; 822d5913350SHisping Lin uint32_t ErrorOrigin; 823d5913350SHisping Lin 824d5913350SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 825d5913350SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 826d5913350SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 827d5913350SHisping Lin TEEC_Operation TeecOperation = {0}; 828d5913350SHisping Lin 829d5913350SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 830d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 831d5913350SHisping Lin return TeecResult; 832d5913350SHisping Lin 833d5913350SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 834d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 835d5913350SHisping Lin return TeecResult; 836d5913350SHisping Lin 837d5913350SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 838d5913350SHisping Lin &TeecSession, 839d5913350SHisping Lin TeecUuid, 840d5913350SHisping Lin TEEC_LOGIN_PUBLIC, 841d5913350SHisping Lin NULL, 842d5913350SHisping Lin NULL, 843d5913350SHisping Lin &ErrorOrigin); 844d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 845d5913350SHisping Lin return TeecResult; 846d5913350SHisping Lin 847d5913350SHisping Lin TeecOperation.params[0].value.a = byte_off; 848d5913350SHisping Lin 849d5913350SHisping Lin TEEC_SharedMemory SharedMem = {0}; 850d5913350SHisping Lin 851d5913350SHisping Lin SharedMem.size = byte_len; 852d5913350SHisping Lin SharedMem.flags = 0; 853d5913350SHisping Lin 854d5913350SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem); 855d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 856d5913350SHisping Lin goto exit; 857d5913350SHisping Lin 858d5913350SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem.buffer; 859d5913350SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem.size; 860d5913350SHisping Lin 861d5913350SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 862d5913350SHisping Lin TEEC_MEMREF_TEMP_OUTPUT, 863d5913350SHisping Lin TEEC_NONE, 864d5913350SHisping Lin TEEC_NONE); 865d5913350SHisping Lin 866d5913350SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 867d5913350SHisping Lin STORAGE_CMD_READ_OEM_NS_OTP, 868d5913350SHisping Lin &TeecOperation, 869d5913350SHisping Lin &ErrorOrigin); 870d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 871d5913350SHisping Lin goto exit; 872d5913350SHisping Lin 873d5913350SHisping Lin memcpy(byte_buf, SharedMem.buffer, SharedMem.size); 874d5913350SHisping Lin 875d5913350SHisping Lin exit: 876d5913350SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem); 877d5913350SHisping Lin TEEC_CloseSession(&TeecSession); 878d5913350SHisping Lin TEEC_FinalizeContext(&TeecContext); 879d5913350SHisping Lin 880d5913350SHisping Lin return TeecResult; 881d5913350SHisping Lin } 882d5913350SHisping Lin 88390e849a0Sxb.wang uint32_t trusty_write_oem_otp_key(enum RK_OEM_OTP_KEYID key_id, 884bb1ba6acSHisping Lin uint8_t *byte_buf, uint32_t byte_len) 885bb1ba6acSHisping Lin { 886bb1ba6acSHisping Lin TEEC_Result TeecResult; 887bb1ba6acSHisping Lin TEEC_Context TeecContext; 888bb1ba6acSHisping Lin TEEC_Session TeecSession; 889bb1ba6acSHisping Lin uint32_t ErrorOrigin; 890bb1ba6acSHisping Lin 891bb1ba6acSHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 892bb1ba6acSHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 893bb1ba6acSHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 894bb1ba6acSHisping Lin TEEC_Operation TeecOperation = {0}; 895bb1ba6acSHisping Lin 896bb1ba6acSHisping Lin TeecResult = OpteeClientApiLibInitialize(); 897bb1ba6acSHisping Lin if (TeecResult != TEEC_SUCCESS) 898bb1ba6acSHisping Lin return TeecResult; 899bb1ba6acSHisping Lin 900bb1ba6acSHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 901bb1ba6acSHisping Lin if (TeecResult != TEEC_SUCCESS) 902bb1ba6acSHisping Lin return TeecResult; 903bb1ba6acSHisping Lin 904bb1ba6acSHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 905bb1ba6acSHisping Lin &TeecSession, 906bb1ba6acSHisping Lin TeecUuid, 907bb1ba6acSHisping Lin TEEC_LOGIN_PUBLIC, 908bb1ba6acSHisping Lin NULL, 909bb1ba6acSHisping Lin NULL, 910bb1ba6acSHisping Lin &ErrorOrigin); 911bb1ba6acSHisping Lin if (TeecResult != TEEC_SUCCESS) 912bb1ba6acSHisping Lin return TeecResult; 913bb1ba6acSHisping Lin 914bb1ba6acSHisping Lin TeecOperation.params[0].value.a = key_id; 915bb1ba6acSHisping Lin 916bb1ba6acSHisping Lin TEEC_SharedMemory SharedMem = {0}; 917bb1ba6acSHisping Lin 918bb1ba6acSHisping Lin SharedMem.size = byte_len; 919bb1ba6acSHisping Lin SharedMem.flags = 0; 920bb1ba6acSHisping Lin 921bb1ba6acSHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem); 922bb1ba6acSHisping Lin if (TeecResult != TEEC_SUCCESS) 923bb1ba6acSHisping Lin goto exit; 924bb1ba6acSHisping Lin 925bb1ba6acSHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem.buffer; 926bb1ba6acSHisping Lin TeecOperation.params[1].tmpref.size = SharedMem.size; 927bb1ba6acSHisping Lin 928bb1ba6acSHisping Lin memcpy(SharedMem.buffer, byte_buf, SharedMem.size); 929bb1ba6acSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 930bb1ba6acSHisping Lin TEEC_MEMREF_TEMP_INPUT, 931bb1ba6acSHisping Lin TEEC_NONE, 932bb1ba6acSHisping Lin TEEC_NONE); 933bb1ba6acSHisping Lin 934bb1ba6acSHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 93590e849a0Sxb.wang STORAGE_CMD_WRITE_OEM_OTP_KEY, 936bb1ba6acSHisping Lin &TeecOperation, 937bb1ba6acSHisping Lin &ErrorOrigin); 938bb1ba6acSHisping Lin if (TeecResult != TEEC_SUCCESS) 939bb1ba6acSHisping Lin goto exit; 940bb1ba6acSHisping Lin 941bb1ba6acSHisping Lin exit: 942bb1ba6acSHisping Lin TEEC_ReleaseSharedMemory(&SharedMem); 943bb1ba6acSHisping Lin TEEC_CloseSession(&TeecSession); 944bb1ba6acSHisping Lin TEEC_FinalizeContext(&TeecContext); 945bb1ba6acSHisping Lin 946bb1ba6acSHisping Lin return TeecResult; 947bb1ba6acSHisping Lin } 948bb1ba6acSHisping Lin 9499deb34f6SHisping Lin uint32_t trusty_oem_otp_key_is_written(enum RK_OEM_OTP_KEYID key_id, uint8_t *value) 9509deb34f6SHisping Lin { 9519deb34f6SHisping Lin TEEC_Result TeecResult; 9529deb34f6SHisping Lin TEEC_Context TeecContext; 9539deb34f6SHisping Lin TEEC_Session TeecSession; 9549deb34f6SHisping Lin uint32_t ErrorOrigin; 9559deb34f6SHisping Lin 9569deb34f6SHisping Lin *value = 0xFF; 9579deb34f6SHisping Lin 9589deb34f6SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 9599deb34f6SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 9609deb34f6SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 9619deb34f6SHisping Lin TEEC_Operation TeecOperation = {0}; 9629deb34f6SHisping Lin 9639deb34f6SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 9649deb34f6SHisping Lin if (TeecResult != TEEC_SUCCESS) 9659deb34f6SHisping Lin return TeecResult; 9669deb34f6SHisping Lin 9679deb34f6SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 9689deb34f6SHisping Lin if (TeecResult != TEEC_SUCCESS) 9699deb34f6SHisping Lin return TeecResult; 9709deb34f6SHisping Lin 9719deb34f6SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 9729deb34f6SHisping Lin &TeecSession, 9739deb34f6SHisping Lin TeecUuid, 9749deb34f6SHisping Lin TEEC_LOGIN_PUBLIC, 9759deb34f6SHisping Lin NULL, 9769deb34f6SHisping Lin NULL, 9779deb34f6SHisping Lin &ErrorOrigin); 9789deb34f6SHisping Lin if (TeecResult != TEEC_SUCCESS) 9799deb34f6SHisping Lin return TeecResult; 9809deb34f6SHisping Lin 9819deb34f6SHisping Lin TeecOperation.params[0].value.a = key_id; 9829deb34f6SHisping Lin 9839deb34f6SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INOUT, 9849deb34f6SHisping Lin TEEC_NONE, 9859deb34f6SHisping Lin TEEC_NONE, 9869deb34f6SHisping Lin TEEC_NONE); 9879deb34f6SHisping Lin 9889deb34f6SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 9899deb34f6SHisping Lin STORAGE_CMD_OEM_OTP_KEY_IS_WRITTEN, 9909deb34f6SHisping Lin &TeecOperation, 9919deb34f6SHisping Lin &ErrorOrigin); 9929deb34f6SHisping Lin if (TeecResult == TEEC_SUCCESS) 9939deb34f6SHisping Lin *value = TeecOperation.params[0].value.b; 9949deb34f6SHisping Lin 9959deb34f6SHisping Lin TEEC_CloseSession(&TeecSession); 9969deb34f6SHisping Lin TEEC_FinalizeContext(&TeecContext); 9979deb34f6SHisping Lin 9989deb34f6SHisping Lin return TeecResult; 9999deb34f6SHisping Lin } 10009deb34f6SHisping Lin 100190e849a0Sxb.wang uint32_t trusty_set_oem_hr_otp_read_lock(enum RK_OEM_OTP_KEYID key_id) 1002a405238aSHisping Lin { 1003a405238aSHisping Lin TEEC_Result TeecResult; 1004a405238aSHisping Lin TEEC_Context TeecContext; 1005a405238aSHisping Lin TEEC_Session TeecSession; 1006a405238aSHisping Lin uint32_t ErrorOrigin; 1007a405238aSHisping Lin 1008a405238aSHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 1009a405238aSHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 1010a405238aSHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 1011a405238aSHisping Lin TEEC_Operation TeecOperation = {0}; 1012a405238aSHisping Lin 1013a405238aSHisping Lin TeecResult = OpteeClientApiLibInitialize(); 1014a405238aSHisping Lin if (TeecResult != TEEC_SUCCESS) 1015a405238aSHisping Lin return TeecResult; 1016a405238aSHisping Lin 1017a405238aSHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1018a405238aSHisping Lin if (TeecResult != TEEC_SUCCESS) 1019a405238aSHisping Lin return TeecResult; 1020a405238aSHisping Lin 1021a405238aSHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 1022a405238aSHisping Lin &TeecSession, 1023a405238aSHisping Lin TeecUuid, 1024a405238aSHisping Lin TEEC_LOGIN_PUBLIC, 1025a405238aSHisping Lin NULL, 1026a405238aSHisping Lin NULL, 1027a405238aSHisping Lin &ErrorOrigin); 1028a405238aSHisping Lin if (TeecResult != TEEC_SUCCESS) 1029a405238aSHisping Lin return TeecResult; 1030a405238aSHisping Lin 1031a405238aSHisping Lin TeecOperation.params[0].value.a = key_id; 1032a405238aSHisping Lin 1033a405238aSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 1034a405238aSHisping Lin TEEC_NONE, 1035a405238aSHisping Lin TEEC_NONE, 1036a405238aSHisping Lin TEEC_NONE); 1037a405238aSHisping Lin 1038a405238aSHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 1039a405238aSHisping Lin STORAGE_CMD_SET_OEM_HR_OTP_READ_LOCK, 1040a405238aSHisping Lin &TeecOperation, 1041a405238aSHisping Lin &ErrorOrigin); 1042a405238aSHisping Lin if (TeecResult != TEEC_SUCCESS) 1043a405238aSHisping Lin goto exit; 1044a405238aSHisping Lin 1045a405238aSHisping Lin exit: 1046a405238aSHisping Lin TEEC_CloseSession(&TeecSession); 1047a405238aSHisping Lin TEEC_FinalizeContext(&TeecContext); 1048a405238aSHisping Lin 1049a405238aSHisping Lin return TeecResult; 1050a405238aSHisping Lin } 1051a405238aSHisping Lin 10522f8c34bdSxb.wang uint32_t trusty_oem_otp_key_cipher(enum RK_OEM_OTP_KEYID key_id, rk_cipher_config *config, 10532f8c34bdSxb.wang uint32_t src_phys_addr, uint32_t dst_phys_addr, 10542f8c34bdSxb.wang uint32_t len) 1055fc3694d6Sxb.wang { 1056fc3694d6Sxb.wang TEEC_Result TeecResult; 1057fc3694d6Sxb.wang TEEC_Context TeecContext; 1058fc3694d6Sxb.wang TEEC_Session TeecSession; 1059fc3694d6Sxb.wang TEEC_Operation TeecOperation = {0}; 1060fc3694d6Sxb.wang uint32_t ErrorOrigin; 1061fc3694d6Sxb.wang TEEC_UUID uuid = RK_CRYPTO_SERVICE_UUID; 1062fc3694d6Sxb.wang TEEC_SharedMemory SharedMem_config = {0}; 1063fc3694d6Sxb.wang 10642f8c34bdSxb.wang if (key_id != RK_OEM_OTP_KEY0 && 10652f8c34bdSxb.wang key_id != RK_OEM_OTP_KEY1 && 10662f8c34bdSxb.wang key_id != RK_OEM_OTP_KEY2 && 10672f8c34bdSxb.wang key_id != RK_OEM_OTP_KEY3 && 10682f8c34bdSxb.wang key_id != RK_OEM_OTP_KEY_FW) 1069fc3694d6Sxb.wang return TEEC_ERROR_BAD_PARAMETERS; 1070fc3694d6Sxb.wang 10712f8c34bdSxb.wang if (!config) 1072fc3694d6Sxb.wang return TEEC_ERROR_BAD_PARAMETERS; 1073fc3694d6Sxb.wang 1074fc3694d6Sxb.wang if (config->algo != RK_ALGO_AES && config->algo != RK_ALGO_SM4) 1075fc3694d6Sxb.wang return TEEC_ERROR_BAD_PARAMETERS; 1076fc3694d6Sxb.wang 1077fc3694d6Sxb.wang if (config->mode >= RK_CIPHER_MODE_XTS) 1078fc3694d6Sxb.wang return TEEC_ERROR_BAD_PARAMETERS; 1079fc3694d6Sxb.wang 1080fc3694d6Sxb.wang if (config->operation != RK_MODE_ENCRYPT && 1081fc3694d6Sxb.wang config->operation != RK_MODE_DECRYPT) 1082fc3694d6Sxb.wang return TEEC_ERROR_BAD_PARAMETERS; 1083fc3694d6Sxb.wang 1084fc3694d6Sxb.wang if (config->key_len != 16 && 1085fc3694d6Sxb.wang config->key_len != 24 && 1086fc3694d6Sxb.wang config->key_len != 32) 1087fc3694d6Sxb.wang return TEEC_ERROR_BAD_PARAMETERS; 1088fc3694d6Sxb.wang 10892f8c34bdSxb.wang if (key_id == RK_OEM_OTP_KEY_FW && config->key_len != 16) 10902f8c34bdSxb.wang return TEEC_ERROR_BAD_PARAMETERS; 10912f8c34bdSxb.wang 10922f8c34bdSxb.wang #if defined(CONFIG_ROCKCHIP_RV1126) 10932f8c34bdSxb.wang if (config->key_len == 24) 10942f8c34bdSxb.wang return TEEC_ERROR_BAD_PARAMETERS; 10952f8c34bdSxb.wang #endif 10962f8c34bdSxb.wang 1097fc3694d6Sxb.wang if (len % AES_BLOCK_SIZE || 1098fc3694d6Sxb.wang len == 0) 1099fc3694d6Sxb.wang return TEEC_ERROR_BAD_PARAMETERS; 1100fc3694d6Sxb.wang 11012f8c34bdSxb.wang if (!src_phys_addr || !dst_phys_addr) 11022f8c34bdSxb.wang return TEEC_ERROR_BAD_PARAMETERS; 11032f8c34bdSxb.wang 1104fc3694d6Sxb.wang TeecResult = OpteeClientApiLibInitialize(); 1105fc3694d6Sxb.wang if (TeecResult != TEEC_SUCCESS) 1106fc3694d6Sxb.wang return TeecResult; 1107fc3694d6Sxb.wang 1108fc3694d6Sxb.wang TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1109fc3694d6Sxb.wang if (TeecResult != TEEC_SUCCESS) 1110fc3694d6Sxb.wang return TeecResult; 1111fc3694d6Sxb.wang 1112fc3694d6Sxb.wang TeecResult = TEEC_OpenSession(&TeecContext, 1113fc3694d6Sxb.wang &TeecSession, 1114fc3694d6Sxb.wang &uuid, 1115fc3694d6Sxb.wang TEEC_LOGIN_PUBLIC, 1116fc3694d6Sxb.wang NULL, 1117fc3694d6Sxb.wang NULL, 1118fc3694d6Sxb.wang &ErrorOrigin); 1119fc3694d6Sxb.wang if (TeecResult != TEEC_SUCCESS) 1120fc3694d6Sxb.wang goto exit; 1121fc3694d6Sxb.wang 1122fc3694d6Sxb.wang SharedMem_config.size = sizeof(rk_cipher_config); 1123fc3694d6Sxb.wang TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem_config); 1124fc3694d6Sxb.wang if (TeecResult != TEEC_SUCCESS) 1125fc3694d6Sxb.wang goto exit; 1126fc3694d6Sxb.wang 1127fc3694d6Sxb.wang memcpy(SharedMem_config.buffer, config, sizeof(rk_cipher_config)); 1128fc3694d6Sxb.wang TeecOperation.params[0].value.a = key_id; 1129fc3694d6Sxb.wang TeecOperation.params[1].tmpref.buffer = SharedMem_config.buffer; 1130fc3694d6Sxb.wang TeecOperation.params[1].tmpref.size = SharedMem_config.size; 11312f8c34bdSxb.wang TeecOperation.params[2].value.a = src_phys_addr; 11322f8c34bdSxb.wang TeecOperation.params[2].value.b = len; 11332f8c34bdSxb.wang TeecOperation.params[3].value.a = dst_phys_addr; 1134fc3694d6Sxb.wang TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 1135fc3694d6Sxb.wang TEEC_MEMREF_TEMP_INPUT, 11362f8c34bdSxb.wang TEEC_VALUE_INPUT, 11372f8c34bdSxb.wang TEEC_VALUE_INPUT); 11382f8c34bdSxb.wang 11392f8c34bdSxb.wang crypto_flush_cacheline(src_phys_addr, len); 11402f8c34bdSxb.wang crypto_flush_cacheline(dst_phys_addr, len); 11412f8c34bdSxb.wang 1142fc3694d6Sxb.wang TeecResult = TEEC_InvokeCommand(&TeecSession, 11432f8c34bdSxb.wang CRYPTO_SERVICE_CMD_OEM_OTP_KEY_PHYS_CIPHER, 1144fc3694d6Sxb.wang &TeecOperation, 1145fc3694d6Sxb.wang &ErrorOrigin); 1146fc3694d6Sxb.wang 1147a900eef3SHisping Lin crypto_invalidate_cacheline(dst_phys_addr, len); 1148a900eef3SHisping Lin 1149fc3694d6Sxb.wang exit: 1150fc3694d6Sxb.wang TEEC_ReleaseSharedMemory(&SharedMem_config); 1151fc3694d6Sxb.wang TEEC_CloseSession(&TeecSession); 1152fc3694d6Sxb.wang TEEC_FinalizeContext(&TeecContext); 1153fc3694d6Sxb.wang return TeecResult; 1154fc3694d6Sxb.wang } 1155fc3694d6Sxb.wang 1156a828eba9SHisping Lin uint32_t trusty_write_oem_hdcp_key(enum RK_HDCP_KEYID key_id, 1157a828eba9SHisping Lin uint8_t *byte_buf, uint32_t byte_len) 1158a828eba9SHisping Lin { 1159a828eba9SHisping Lin TEEC_Result TeecResult; 1160a828eba9SHisping Lin TEEC_Context TeecContext; 1161a828eba9SHisping Lin TEEC_Session TeecSession; 1162a828eba9SHisping Lin uint32_t ErrorOrigin; 1163a828eba9SHisping Lin 1164a828eba9SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 1165a828eba9SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 1166a828eba9SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 1167a828eba9SHisping Lin TEEC_Operation TeecOperation = {0}; 1168a828eba9SHisping Lin 1169a828eba9SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 1170a828eba9SHisping Lin if (TeecResult != TEEC_SUCCESS) 1171a828eba9SHisping Lin return TeecResult; 1172a828eba9SHisping Lin 1173a828eba9SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1174a828eba9SHisping Lin if (TeecResult != TEEC_SUCCESS) 1175a828eba9SHisping Lin return TeecResult; 1176a828eba9SHisping Lin 1177a828eba9SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 1178a828eba9SHisping Lin &TeecSession, 1179a828eba9SHisping Lin TeecUuid, 1180a828eba9SHisping Lin TEEC_LOGIN_PUBLIC, 1181a828eba9SHisping Lin NULL, 1182a828eba9SHisping Lin NULL, 1183a828eba9SHisping Lin &ErrorOrigin); 1184a828eba9SHisping Lin if (TeecResult != TEEC_SUCCESS) 1185a828eba9SHisping Lin return TeecResult; 1186a828eba9SHisping Lin 1187a828eba9SHisping Lin TeecOperation.params[0].value.a = key_id; 1188a828eba9SHisping Lin 1189a828eba9SHisping Lin TEEC_SharedMemory SharedMem = {0}; 1190a828eba9SHisping Lin 1191a828eba9SHisping Lin SharedMem.size = byte_len; 1192a828eba9SHisping Lin SharedMem.flags = 0; 1193a828eba9SHisping Lin 1194a828eba9SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem); 1195a828eba9SHisping Lin if (TeecResult != TEEC_SUCCESS) 1196a828eba9SHisping Lin goto exit; 1197a828eba9SHisping Lin 1198a828eba9SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem.buffer; 1199a828eba9SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem.size; 1200a828eba9SHisping Lin 1201a828eba9SHisping Lin memcpy(SharedMem.buffer, byte_buf, SharedMem.size); 1202a828eba9SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 1203a828eba9SHisping Lin TEEC_MEMREF_TEMP_INPUT, 1204a828eba9SHisping Lin TEEC_NONE, 1205a828eba9SHisping Lin TEEC_NONE); 1206a828eba9SHisping Lin 1207a828eba9SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 1208a828eba9SHisping Lin STORAGE_CMD_WRITE_OEM_HDCP_KEY, 1209a828eba9SHisping Lin &TeecOperation, 1210a828eba9SHisping Lin &ErrorOrigin); 1211a828eba9SHisping Lin if (TeecResult != TEEC_SUCCESS) 1212a828eba9SHisping Lin goto exit; 1213a828eba9SHisping Lin 1214a828eba9SHisping Lin exit: 1215a828eba9SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem); 1216a828eba9SHisping Lin TEEC_CloseSession(&TeecSession); 1217a828eba9SHisping Lin TEEC_FinalizeContext(&TeecContext); 1218a828eba9SHisping Lin 1219a828eba9SHisping Lin return TeecResult; 1220a828eba9SHisping Lin } 1221a828eba9SHisping Lin 1222e8bc2655SHisping Lin uint32_t trusty_oem_hdcp_key_is_written(enum RK_HDCP_KEYID key_id, uint8_t *value) 1223e8bc2655SHisping Lin { 1224e8bc2655SHisping Lin TEEC_Result TeecResult; 1225e8bc2655SHisping Lin TEEC_Context TeecContext; 1226e8bc2655SHisping Lin TEEC_Session TeecSession; 1227e8bc2655SHisping Lin uint32_t ErrorOrigin; 1228e8bc2655SHisping Lin 1229e8bc2655SHisping Lin *value = 0xFF; 1230e8bc2655SHisping Lin 1231e8bc2655SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 1232e8bc2655SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 1233e8bc2655SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 1234e8bc2655SHisping Lin TEEC_Operation TeecOperation = {0}; 1235e8bc2655SHisping Lin 1236e8bc2655SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 1237e8bc2655SHisping Lin if (TeecResult != TEEC_SUCCESS) 1238e8bc2655SHisping Lin return TeecResult; 1239e8bc2655SHisping Lin 1240e8bc2655SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1241e8bc2655SHisping Lin if (TeecResult != TEEC_SUCCESS) 1242e8bc2655SHisping Lin return TeecResult; 1243e8bc2655SHisping Lin 1244e8bc2655SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 1245e8bc2655SHisping Lin &TeecSession, 1246e8bc2655SHisping Lin TeecUuid, 1247e8bc2655SHisping Lin TEEC_LOGIN_PUBLIC, 1248e8bc2655SHisping Lin NULL, 1249e8bc2655SHisping Lin NULL, 1250e8bc2655SHisping Lin &ErrorOrigin); 1251e8bc2655SHisping Lin if (TeecResult != TEEC_SUCCESS) 1252e8bc2655SHisping Lin return TeecResult; 1253e8bc2655SHisping Lin 1254e8bc2655SHisping Lin TeecOperation.params[0].value.a = key_id; 1255e8bc2655SHisping Lin 1256e8bc2655SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INOUT, 1257e8bc2655SHisping Lin TEEC_NONE, 1258e8bc2655SHisping Lin TEEC_NONE, 1259e8bc2655SHisping Lin TEEC_NONE); 1260e8bc2655SHisping Lin 1261e8bc2655SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 1262e8bc2655SHisping Lin STORAGE_CMD_OEM_HDCP_KEY_IS_WRITTEN, 1263e8bc2655SHisping Lin &TeecOperation, 1264e8bc2655SHisping Lin &ErrorOrigin); 1265e8bc2655SHisping Lin if (TeecResult == TEEC_SUCCESS) 1266e8bc2655SHisping Lin *value = TeecOperation.params[0].value.b; 1267e8bc2655SHisping Lin 1268e8bc2655SHisping Lin TEEC_CloseSession(&TeecSession); 1269e8bc2655SHisping Lin TEEC_FinalizeContext(&TeecContext); 1270e8bc2655SHisping Lin 1271e8bc2655SHisping Lin return TeecResult; 1272e8bc2655SHisping Lin } 1273e8bc2655SHisping Lin 1274bfd9cea4SHisping Lin uint32_t trusty_set_oem_hdcp_key_mask(enum RK_HDCP_KEYID key_id) 1275bfd9cea4SHisping Lin { 1276bfd9cea4SHisping Lin TEEC_Result TeecResult; 1277bfd9cea4SHisping Lin TEEC_Context TeecContext; 1278bfd9cea4SHisping Lin TEEC_Session TeecSession; 1279bfd9cea4SHisping Lin uint32_t ErrorOrigin; 1280bfd9cea4SHisping Lin 1281bfd9cea4SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 1282bfd9cea4SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 1283bfd9cea4SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 1284bfd9cea4SHisping Lin TEEC_Operation TeecOperation = {0}; 1285bfd9cea4SHisping Lin 1286bfd9cea4SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 1287bfd9cea4SHisping Lin if (TeecResult != TEEC_SUCCESS) 1288bfd9cea4SHisping Lin return TeecResult; 1289bfd9cea4SHisping Lin 1290bfd9cea4SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1291bfd9cea4SHisping Lin if (TeecResult != TEEC_SUCCESS) 1292bfd9cea4SHisping Lin return TeecResult; 1293bfd9cea4SHisping Lin 1294bfd9cea4SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 1295bfd9cea4SHisping Lin &TeecSession, 1296bfd9cea4SHisping Lin TeecUuid, 1297bfd9cea4SHisping Lin TEEC_LOGIN_PUBLIC, 1298bfd9cea4SHisping Lin NULL, 1299bfd9cea4SHisping Lin NULL, 1300bfd9cea4SHisping Lin &ErrorOrigin); 1301bfd9cea4SHisping Lin if (TeecResult != TEEC_SUCCESS) 1302bfd9cea4SHisping Lin return TeecResult; 1303bfd9cea4SHisping Lin 1304bfd9cea4SHisping Lin TeecOperation.params[0].value.a = key_id; 1305bfd9cea4SHisping Lin 1306bfd9cea4SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 1307bfd9cea4SHisping Lin TEEC_NONE, 1308bfd9cea4SHisping Lin TEEC_NONE, 1309bfd9cea4SHisping Lin TEEC_NONE); 1310bfd9cea4SHisping Lin 1311bfd9cea4SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 1312bfd9cea4SHisping Lin STORAGE_CMD_SET_OEM_HDCP_KEY_MASK, 1313bfd9cea4SHisping Lin &TeecOperation, 1314bfd9cea4SHisping Lin &ErrorOrigin); 1315bfd9cea4SHisping Lin if (TeecResult != TEEC_SUCCESS) 1316bfd9cea4SHisping Lin goto exit; 1317bfd9cea4SHisping Lin 1318bfd9cea4SHisping Lin exit: 1319bfd9cea4SHisping Lin TEEC_CloseSession(&TeecSession); 1320bfd9cea4SHisping Lin TEEC_FinalizeContext(&TeecContext); 1321bfd9cea4SHisping Lin 1322bfd9cea4SHisping Lin return TeecResult; 1323bfd9cea4SHisping Lin } 1324bfd9cea4SHisping Lin 13254d4c5043SHisping Lin uint32_t trusty_oem_user_ta_transfer(void) 13264d4c5043SHisping Lin { 13274d4c5043SHisping Lin TEEC_Result TeecResult; 13284d4c5043SHisping Lin TEEC_Context TeecContext; 13294d4c5043SHisping Lin TEEC_Session TeecSession; 13304d4c5043SHisping Lin uint32_t ErrorOrigin; 13314d4c5043SHisping Lin TEEC_UUID tempuuid = { 0x1db57234, 0xdacd, 0x462d, 13324d4c5043SHisping Lin { 0x9b, 0xb1, 0xae, 0x79, 0xde, 0x44, 0xe2, 0xa5} }; 13334d4c5043SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 13344d4c5043SHisping Lin TEEC_Operation TeecOperation = {0}; 13354d4c5043SHisping Lin const uint8_t transfer_inout[] = "Transfer data test."; 13364d4c5043SHisping Lin 13374d4c5043SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 13384d4c5043SHisping Lin if (TeecResult != TEEC_SUCCESS) 13394d4c5043SHisping Lin return TeecResult; 13404d4c5043SHisping Lin 13414d4c5043SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 13424d4c5043SHisping Lin if (TeecResult != TEEC_SUCCESS) 13434d4c5043SHisping Lin return TeecResult; 13444d4c5043SHisping Lin 13454d4c5043SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE, 13464d4c5043SHisping Lin TEEC_NONE, 13474d4c5043SHisping Lin TEEC_NONE, 13484d4c5043SHisping Lin TEEC_NONE); 13494d4c5043SHisping Lin 13504d4c5043SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 13514d4c5043SHisping Lin &TeecSession, 13524d4c5043SHisping Lin TeecUuid, 13534d4c5043SHisping Lin TEEC_LOGIN_PUBLIC, 13544d4c5043SHisping Lin NULL, 13554d4c5043SHisping Lin &TeecOperation, 13564d4c5043SHisping Lin &ErrorOrigin); 13574d4c5043SHisping Lin if (TeecResult != TEEC_SUCCESS) 13584d4c5043SHisping Lin return TeecResult; 13594d4c5043SHisping Lin 13604d4c5043SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 13614d4c5043SHisping Lin 13624d4c5043SHisping Lin SharedMem0.size = sizeof(transfer_inout); 13634d4c5043SHisping Lin SharedMem0.flags = 0; 13644d4c5043SHisping Lin 13654d4c5043SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 13664d4c5043SHisping Lin if (TeecResult != TEEC_SUCCESS) 13674d4c5043SHisping Lin goto exit; 13684d4c5043SHisping Lin 13694d4c5043SHisping Lin memcpy(SharedMem0.buffer, transfer_inout, SharedMem0.size); 13704d4c5043SHisping Lin 13714d4c5043SHisping Lin TEEC_SharedMemory SharedMem1 = {0}; 13724d4c5043SHisping Lin 13734d4c5043SHisping Lin SharedMem1.size = sizeof(transfer_inout); 13744d4c5043SHisping Lin SharedMem1.flags = 0; 13754d4c5043SHisping Lin 13764d4c5043SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 13774d4c5043SHisping Lin if (TeecResult != TEEC_SUCCESS) 13784d4c5043SHisping Lin goto exit; 13794d4c5043SHisping Lin 13804d4c5043SHisping Lin TeecOperation.params[0].value.a = 66; 13814d4c5043SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem0.buffer; 13824d4c5043SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem0.size; 13834d4c5043SHisping Lin TeecOperation.params[2].tmpref.buffer = SharedMem1.buffer; 13844d4c5043SHisping Lin TeecOperation.params[2].tmpref.size = SharedMem1.size; 13854d4c5043SHisping Lin 13864d4c5043SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INOUT, 13874d4c5043SHisping Lin TEEC_MEMREF_TEMP_INPUT, 13884d4c5043SHisping Lin TEEC_MEMREF_TEMP_OUTPUT, 13894d4c5043SHisping Lin TEEC_NONE); 13904d4c5043SHisping Lin 13914d4c5043SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 13924d4c5043SHisping Lin 102, 13934d4c5043SHisping Lin &TeecOperation, 13944d4c5043SHisping Lin &ErrorOrigin); 13954d4c5043SHisping Lin if (TeecResult != TEEC_SUCCESS) 13964d4c5043SHisping Lin goto exit; 13974d4c5043SHisping Lin 13984d4c5043SHisping Lin //Check the result 13994d4c5043SHisping Lin if (TeecOperation.params[0].value.a == 66 + 1 && 14004d4c5043SHisping Lin TeecOperation.params[0].value.b == TeecOperation.params[0].value.a) 14014d4c5043SHisping Lin printf("test value : Pass!\n"); 14024d4c5043SHisping Lin else 14034d4c5043SHisping Lin printf("test value : Fail! (mismatch values)\n"); 14044d4c5043SHisping Lin 14054d4c5043SHisping Lin if (memcmp(SharedMem1.buffer, transfer_inout, sizeof(transfer_inout)) == 0) 14064d4c5043SHisping Lin printf("test buffer : Pass!\n"); 14074d4c5043SHisping Lin else 14084d4c5043SHisping Lin printf("test buffer : Fail! (mismatch buffer)\n"); 14094d4c5043SHisping Lin 14104d4c5043SHisping Lin exit: 14114d4c5043SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 14124d4c5043SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem1); 14134d4c5043SHisping Lin TEEC_CloseSession(&TeecSession); 14144d4c5043SHisping Lin TEEC_FinalizeContext(&TeecContext); 14154d4c5043SHisping Lin 14164d4c5043SHisping Lin return TeecResult; 14174d4c5043SHisping Lin } 14184d4c5043SHisping Lin 14194d4c5043SHisping Lin uint32_t trusty_oem_user_ta_storage(void) 14204d4c5043SHisping Lin { 14214d4c5043SHisping Lin TEEC_Result TeecResult; 14224d4c5043SHisping Lin TEEC_Context TeecContext; 14234d4c5043SHisping Lin TEEC_Session TeecSession; 14244d4c5043SHisping Lin uint32_t ErrorOrigin; 14254d4c5043SHisping Lin TEEC_UUID tempuuid = { 0x1db57234, 0xdacd, 0x462d, 14264d4c5043SHisping Lin { 0x9b, 0xb1, 0xae, 0x79, 0xde, 0x44, 0xe2, 0xa5} }; 14274d4c5043SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 14284d4c5043SHisping Lin TEEC_Operation TeecOperation = {0}; 14294d4c5043SHisping Lin 14304d4c5043SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 14314d4c5043SHisping Lin if (TeecResult != TEEC_SUCCESS) 14324d4c5043SHisping Lin return TeecResult; 14334d4c5043SHisping Lin 14344d4c5043SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 14354d4c5043SHisping Lin if (TeecResult != TEEC_SUCCESS) 14364d4c5043SHisping Lin return TeecResult; 14374d4c5043SHisping Lin 14384d4c5043SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE, 14394d4c5043SHisping Lin TEEC_NONE, 14404d4c5043SHisping Lin TEEC_NONE, 14414d4c5043SHisping Lin TEEC_NONE); 14424d4c5043SHisping Lin 14434d4c5043SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 14444d4c5043SHisping Lin &TeecSession, 14454d4c5043SHisping Lin TeecUuid, 14464d4c5043SHisping Lin TEEC_LOGIN_PUBLIC, 14474d4c5043SHisping Lin NULL, 14484d4c5043SHisping Lin &TeecOperation, 14494d4c5043SHisping Lin &ErrorOrigin); 14504d4c5043SHisping Lin if (TeecResult != TEEC_SUCCESS) 14514d4c5043SHisping Lin return TeecResult; 14524d4c5043SHisping Lin 14534d4c5043SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE, 14544d4c5043SHisping Lin TEEC_NONE, 14554d4c5043SHisping Lin TEEC_NONE, 14564d4c5043SHisping Lin TEEC_NONE); 14574d4c5043SHisping Lin 14584d4c5043SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 14594d4c5043SHisping Lin 103, 14604d4c5043SHisping Lin &TeecOperation, 14614d4c5043SHisping Lin &ErrorOrigin); 14624d4c5043SHisping Lin if (TeecResult != TEEC_SUCCESS) 14634d4c5043SHisping Lin goto exit; 14644d4c5043SHisping Lin 14654d4c5043SHisping Lin exit: 14664d4c5043SHisping Lin TEEC_CloseSession(&TeecSession); 14674d4c5043SHisping Lin TEEC_FinalizeContext(&TeecContext); 14684d4c5043SHisping Lin 14694d4c5043SHisping Lin return TeecResult; 14704d4c5043SHisping Lin } 14714d4c5043SHisping Lin 14724aa61755SAndy Ye uint32_t trusty_attest_dh(uint8_t *dh, uint32_t *dh_size) 14734aa61755SAndy Ye { 14744aa61755SAndy Ye TEEC_Result TeecResult; 14754aa61755SAndy Ye TEEC_Context TeecContext; 14764aa61755SAndy Ye TEEC_Session TeecSession; 14774aa61755SAndy Ye uint32_t ErrorOrigin; 14784aa61755SAndy Ye TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6, 14794aa61755SAndy Ye { 0xa8, 0x69, 0x9c, 0xe6, 14804aa61755SAndy Ye 0x88, 0x6c, 0x5d, 0x5d 14814aa61755SAndy Ye } 14824aa61755SAndy Ye }; 14834aa61755SAndy Ye TEEC_UUID *TeecUuid = &tempuuid; 14844aa61755SAndy Ye TEEC_Operation TeecOperation = {0}; 14853251364cSHisping Lin struct blk_desc *dev_desc; 14863251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 14876651d4c0SJason Zhu if (!dev_desc) { 14886651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 14896651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 14906651d4c0SJason Zhu } 14914aa61755SAndy Ye 1492f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 1493f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1494f4e1db95SHisping Lin return TeecResult; 14954aa61755SAndy Ye 14964aa61755SAndy Ye TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1497f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1498f4e1db95SHisping Lin return TeecResult; 14994aa61755SAndy Ye 15003251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 15013251364cSHisping Lin TEEC_NONE, 15023251364cSHisping Lin TEEC_NONE, 15033251364cSHisping Lin TEEC_NONE); 15043251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 1505b9a7e756SHisping Lin if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0) 1506b9a7e756SHisping Lin TeecOperation.params[0].value.a = 1; 1507b9a7e756SHisping Lin else 1508b9a7e756SHisping Lin TeecOperation.params[0].value.a = 0; 1509b9a7e756SHisping Lin 15103251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 15113251364cSHisping Lin TeecOperation.params[0].value.a = 0; 15123251364cSHisping Lin #endif 15133251364cSHisping Lin 15144aa61755SAndy Ye TeecResult = TEEC_OpenSession(&TeecContext, 15154aa61755SAndy Ye &TeecSession, 15164aa61755SAndy Ye TeecUuid, 15174aa61755SAndy Ye TEEC_LOGIN_PUBLIC, 15184aa61755SAndy Ye NULL, 15193251364cSHisping Lin &TeecOperation, 15204aa61755SAndy Ye &ErrorOrigin); 1521f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1522f4e1db95SHisping Lin return TeecResult; 15234aa61755SAndy Ye 15244aa61755SAndy Ye TEEC_SharedMemory SharedMem0 = {0}; 15254aa61755SAndy Ye 15264aa61755SAndy Ye SharedMem0.size = *dh_size; 15274aa61755SAndy Ye SharedMem0.flags = 0; 15284aa61755SAndy Ye 15294aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 1530f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1531f4e1db95SHisping Lin goto exit; 15324aa61755SAndy Ye 15334aa61755SAndy Ye TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 15344aa61755SAndy Ye TeecOperation.params[0].tmpref.size = SharedMem0.size; 15354aa61755SAndy Ye 15364aa61755SAndy Ye TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, 15374aa61755SAndy Ye TEEC_NONE, 15384aa61755SAndy Ye TEEC_NONE, 15394aa61755SAndy Ye TEEC_NONE); 15404aa61755SAndy Ye 15414aa61755SAndy Ye TeecResult = TEEC_InvokeCommand(&TeecSession, 15424aa61755SAndy Ye 143, 15434aa61755SAndy Ye &TeecOperation, 15444aa61755SAndy Ye &ErrorOrigin); 1545f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1546f4e1db95SHisping Lin goto exit; 15474aa61755SAndy Ye 15484aa61755SAndy Ye *dh_size = TeecOperation.params[0].tmpref.size; 15494aa61755SAndy Ye memcpy(dh, SharedMem0.buffer, SharedMem0.size); 1550f4e1db95SHisping Lin exit: 15514aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem0); 15524aa61755SAndy Ye TEEC_CloseSession(&TeecSession); 1553f4e1db95SHisping Lin TEEC_FinalizeContext(&TeecContext); 15544aa61755SAndy Ye 15554aa61755SAndy Ye return TeecResult; 15564aa61755SAndy Ye } 15574aa61755SAndy Ye 15584aa61755SAndy Ye uint32_t trusty_attest_uuid(uint8_t *uuid, uint32_t *uuid_size) 15594aa61755SAndy Ye { 15604aa61755SAndy Ye TEEC_Result TeecResult; 15614aa61755SAndy Ye TEEC_Context TeecContext; 15624aa61755SAndy Ye TEEC_Session TeecSession; 15634aa61755SAndy Ye uint32_t ErrorOrigin; 15644aa61755SAndy Ye TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6, 15654aa61755SAndy Ye { 0xa8, 0x69, 0x9c, 0xe6, 15664aa61755SAndy Ye 0x88, 0x6c, 0x5d, 0x5d 15674aa61755SAndy Ye } 15684aa61755SAndy Ye }; 15694aa61755SAndy Ye TEEC_UUID *TeecUuid = &tempuuid; 15704aa61755SAndy Ye TEEC_Operation TeecOperation = {0}; 15713251364cSHisping Lin struct blk_desc *dev_desc; 15723251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 15736651d4c0SJason Zhu if (!dev_desc) { 15746651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 15756651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 15766651d4c0SJason Zhu } 15774aa61755SAndy Ye 1578f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 1579f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1580f4e1db95SHisping Lin return TeecResult; 15814aa61755SAndy Ye 15824aa61755SAndy Ye TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1583f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1584f4e1db95SHisping Lin return TeecResult; 15854aa61755SAndy Ye 15863251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 15873251364cSHisping Lin TEEC_NONE, 15883251364cSHisping Lin TEEC_NONE, 15893251364cSHisping Lin TEEC_NONE); 15903251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 1591b9a7e756SHisping Lin if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0) 1592b9a7e756SHisping Lin TeecOperation.params[0].value.a = 1; 1593b9a7e756SHisping Lin else 1594b9a7e756SHisping Lin TeecOperation.params[0].value.a = 0; 1595b9a7e756SHisping Lin 15963251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 15973251364cSHisping Lin TeecOperation.params[0].value.a = 0; 15983251364cSHisping Lin #endif 15993251364cSHisping Lin 16004aa61755SAndy Ye TeecResult = TEEC_OpenSession(&TeecContext, 16014aa61755SAndy Ye &TeecSession, 16024aa61755SAndy Ye TeecUuid, 16034aa61755SAndy Ye TEEC_LOGIN_PUBLIC, 16044aa61755SAndy Ye NULL, 16053251364cSHisping Lin &TeecOperation, 16064aa61755SAndy Ye &ErrorOrigin); 1607f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1608f4e1db95SHisping Lin return TeecResult; 16094aa61755SAndy Ye 16104aa61755SAndy Ye TEEC_SharedMemory SharedMem0 = {0}; 16114aa61755SAndy Ye 16124aa61755SAndy Ye SharedMem0.size = *uuid_size; 16134aa61755SAndy Ye SharedMem0.flags = 0; 16144aa61755SAndy Ye 16154aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 1616f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1617f4e1db95SHisping Lin goto exit; 16184aa61755SAndy Ye 16194aa61755SAndy Ye TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 16204aa61755SAndy Ye TeecOperation.params[0].tmpref.size = SharedMem0.size; 16214aa61755SAndy Ye 16224aa61755SAndy Ye TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, 16234aa61755SAndy Ye TEEC_NONE, 16244aa61755SAndy Ye TEEC_NONE, 16254aa61755SAndy Ye TEEC_NONE); 16264aa61755SAndy Ye 16274aa61755SAndy Ye TeecResult = TEEC_InvokeCommand(&TeecSession, 16284aa61755SAndy Ye 144, 16294aa61755SAndy Ye &TeecOperation, 16304aa61755SAndy Ye &ErrorOrigin); 1631f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1632f4e1db95SHisping Lin goto exit; 16334aa61755SAndy Ye 16344aa61755SAndy Ye *uuid_size = TeecOperation.params[0].tmpref.size; 16354aa61755SAndy Ye memcpy(uuid, SharedMem0.buffer, SharedMem0.size); 1636f4e1db95SHisping Lin exit: 16374aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem0); 16384aa61755SAndy Ye TEEC_CloseSession(&TeecSession); 1639f4e1db95SHisping Lin TEEC_FinalizeContext(&TeecContext); 16404aa61755SAndy Ye 16414aa61755SAndy Ye return TeecResult; 16424aa61755SAndy Ye } 16434aa61755SAndy Ye 16444aa61755SAndy Ye uint32_t trusty_attest_get_ca(uint8_t *operation_start, 16454aa61755SAndy Ye uint32_t *operation_size, 16464aa61755SAndy Ye uint8_t *out, 16474aa61755SAndy Ye uint32_t *out_len) 16484aa61755SAndy Ye { 16494aa61755SAndy Ye TEEC_Result TeecResult; 16504aa61755SAndy Ye TEEC_Context TeecContext; 16514aa61755SAndy Ye TEEC_Session TeecSession; 16524aa61755SAndy Ye uint32_t ErrorOrigin; 16534aa61755SAndy Ye 16544aa61755SAndy Ye TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6, 16554aa61755SAndy Ye { 0xa8, 0x69, 0x9c, 0xe6, 16564aa61755SAndy Ye 0x88, 0x6c, 0x5d, 0x5d 16574aa61755SAndy Ye } 16584aa61755SAndy Ye }; 16594aa61755SAndy Ye 16604aa61755SAndy Ye TEEC_UUID *TeecUuid = &tempuuid; 16614aa61755SAndy Ye TEEC_Operation TeecOperation = {0}; 16623251364cSHisping Lin struct blk_desc *dev_desc; 16633251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 16646651d4c0SJason Zhu if (!dev_desc) { 16656651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 16666651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 16676651d4c0SJason Zhu } 16684aa61755SAndy Ye 1669f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 1670f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1671f4e1db95SHisping Lin return TeecResult; 16724aa61755SAndy Ye 16734aa61755SAndy Ye TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1674f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1675f4e1db95SHisping Lin return TeecResult; 16764aa61755SAndy Ye 16773251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 16783251364cSHisping Lin TEEC_NONE, 16793251364cSHisping Lin TEEC_NONE, 16803251364cSHisping Lin TEEC_NONE); 16813251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 1682b9a7e756SHisping Lin if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0) 1683b9a7e756SHisping Lin TeecOperation.params[0].value.a = 1; 1684b9a7e756SHisping Lin else 1685b9a7e756SHisping Lin TeecOperation.params[0].value.a = 0; 1686b9a7e756SHisping Lin 16873251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 16883251364cSHisping Lin TeecOperation.params[0].value.a = 0; 16893251364cSHisping Lin #endif 16903251364cSHisping Lin 16914aa61755SAndy Ye TeecResult = TEEC_OpenSession(&TeecContext, 16924aa61755SAndy Ye &TeecSession, 16934aa61755SAndy Ye TeecUuid, 16944aa61755SAndy Ye TEEC_LOGIN_PUBLIC, 16954aa61755SAndy Ye NULL, 16963251364cSHisping Lin &TeecOperation, 16974aa61755SAndy Ye &ErrorOrigin); 1698f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1699f4e1db95SHisping Lin return TeecResult; 17004aa61755SAndy Ye 17014aa61755SAndy Ye TEEC_SharedMemory SharedMem0 = {0}; 17024aa61755SAndy Ye 17034aa61755SAndy Ye SharedMem0.size = *operation_size; 17044aa61755SAndy Ye SharedMem0.flags = 0; 17054aa61755SAndy Ye 17064aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 1707f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1708f4e1db95SHisping Lin goto exit; 17094aa61755SAndy Ye 17104aa61755SAndy Ye memcpy(SharedMem0.buffer, operation_start, SharedMem0.size); 17114aa61755SAndy Ye 17124aa61755SAndy Ye TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 17134aa61755SAndy Ye TeecOperation.params[0].tmpref.size = SharedMem0.size; 17144aa61755SAndy Ye 17154aa61755SAndy Ye TEEC_SharedMemory SharedMem1 = {0}; 17164aa61755SAndy Ye 17174aa61755SAndy Ye SharedMem1.size = *out_len; 17184aa61755SAndy Ye SharedMem1.flags = 0; 17194aa61755SAndy Ye 17204aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 1721f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1722f4e1db95SHisping Lin goto exit; 17234aa61755SAndy Ye 17244aa61755SAndy Ye TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 17254aa61755SAndy Ye TeecOperation.params[1].tmpref.size = SharedMem1.size; 17264aa61755SAndy Ye 17274aa61755SAndy Ye TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, 17284aa61755SAndy Ye TEEC_MEMREF_TEMP_INOUT, 17294aa61755SAndy Ye TEEC_NONE, 17304aa61755SAndy Ye TEEC_NONE); 17314aa61755SAndy Ye 17324aa61755SAndy Ye TeecResult = TEEC_InvokeCommand(&TeecSession, 17334aa61755SAndy Ye 145, 17344aa61755SAndy Ye &TeecOperation, 17354aa61755SAndy Ye &ErrorOrigin); 1736f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1737f4e1db95SHisping Lin goto exit; 17384aa61755SAndy Ye 17394aa61755SAndy Ye *out_len = TeecOperation.params[1].tmpref.size; 17404aa61755SAndy Ye memcpy(out, SharedMem1.buffer, SharedMem1.size); 1741f4e1db95SHisping Lin exit: 17424aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem0); 17434aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem1); 1744f4e1db95SHisping Lin TEEC_CloseSession(&TeecSession); 1745f4e1db95SHisping Lin TEEC_FinalizeContext(&TeecContext); 17464aa61755SAndy Ye 17474aa61755SAndy Ye return TeecResult; 17484aa61755SAndy Ye } 17494aa61755SAndy Ye 17504aa61755SAndy Ye uint32_t trusty_attest_set_ca(uint8_t *ca_response, uint32_t *ca_response_size) 17514aa61755SAndy Ye { 17524aa61755SAndy Ye TEEC_Result TeecResult; 17534aa61755SAndy Ye TEEC_Context TeecContext; 17544aa61755SAndy Ye TEEC_Session TeecSession; 17554aa61755SAndy Ye uint32_t ErrorOrigin; 17564aa61755SAndy Ye TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6, 17574aa61755SAndy Ye { 0xa8, 0x69, 0x9c, 0xe6, 17584aa61755SAndy Ye 0x88, 0x6c, 0x5d, 0x5d 17594aa61755SAndy Ye } 17604aa61755SAndy Ye }; 17614aa61755SAndy Ye TEEC_UUID *TeecUuid = &tempuuid; 17624aa61755SAndy Ye TEEC_Operation TeecOperation = {0}; 17633251364cSHisping Lin struct blk_desc *dev_desc; 17643251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 17656651d4c0SJason Zhu if (!dev_desc) { 17666651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 17676651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 17686651d4c0SJason Zhu } 1769f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 1770f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1771f4e1db95SHisping Lin return TeecResult; 17724aa61755SAndy Ye 17734aa61755SAndy Ye TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1774f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1775f4e1db95SHisping Lin return TeecResult; 17764aa61755SAndy Ye 17773251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 17783251364cSHisping Lin TEEC_NONE, 17793251364cSHisping Lin TEEC_NONE, 17803251364cSHisping Lin TEEC_NONE); 17813251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 1782b9a7e756SHisping Lin if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0) 1783b9a7e756SHisping Lin TeecOperation.params[0].value.a = 1; 1784b9a7e756SHisping Lin else 1785b9a7e756SHisping Lin TeecOperation.params[0].value.a = 0; 1786b9a7e756SHisping Lin 17873251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 17883251364cSHisping Lin TeecOperation.params[0].value.a = 0; 17893251364cSHisping Lin #endif 17903251364cSHisping Lin 17914aa61755SAndy Ye TeecResult = TEEC_OpenSession(&TeecContext, 17924aa61755SAndy Ye &TeecSession, 17934aa61755SAndy Ye TeecUuid, 17944aa61755SAndy Ye TEEC_LOGIN_PUBLIC, 17954aa61755SAndy Ye NULL, 17963251364cSHisping Lin &TeecOperation, 17974aa61755SAndy Ye &ErrorOrigin); 1798f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1799f4e1db95SHisping Lin return TeecResult; 18004aa61755SAndy Ye 18014aa61755SAndy Ye TEEC_SharedMemory SharedMem0 = {0}; 18024aa61755SAndy Ye 18034aa61755SAndy Ye SharedMem0.size = *ca_response_size; 18044aa61755SAndy Ye SharedMem0.flags = 0; 18054aa61755SAndy Ye 18064aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 1807f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1808f4e1db95SHisping Lin goto exit; 18094aa61755SAndy Ye 18104aa61755SAndy Ye memcpy(SharedMem0.buffer, ca_response, SharedMem0.size); 18114aa61755SAndy Ye 18124aa61755SAndy Ye TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 18134aa61755SAndy Ye TeecOperation.params[0].tmpref.size = SharedMem0.size; 18144aa61755SAndy Ye 18154aa61755SAndy Ye TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, 18164aa61755SAndy Ye TEEC_NONE, 18174aa61755SAndy Ye TEEC_NONE, 18184aa61755SAndy Ye TEEC_NONE); 18194aa61755SAndy Ye 18204aa61755SAndy Ye TeecResult = TEEC_InvokeCommand(&TeecSession, 18214aa61755SAndy Ye 146, 18224aa61755SAndy Ye &TeecOperation, 18234aa61755SAndy Ye &ErrorOrigin); 1824f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1825f4e1db95SHisping Lin goto exit; 1826f4e1db95SHisping Lin exit: 18274aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem0); 18284aa61755SAndy Ye TEEC_CloseSession(&TeecSession); 1829f4e1db95SHisping Lin TEEC_FinalizeContext(&TeecContext); 18304aa61755SAndy Ye 18314aa61755SAndy Ye return TeecResult; 18324aa61755SAndy Ye } 1833