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 361ac64e8aSHisping Lin #define STORAGE_CMD_WRITE_OEM_ENCRYPT_DATA 24 37fc383442SHisping Lin #define STORAGE_CMD_OEM_ENCRYPT_DATA_IS_WRITTEN 25 38ae8ec5e1SHisping Lin 392f8c34bdSxb.wang #define CRYPTO_SERVICE_CMD_OEM_OTP_KEY_PHYS_CIPHER 0x00000002 40fc3694d6Sxb.wang 41fc3694d6Sxb.wang #define RK_CRYPTO_SERVICE_UUID { 0x0cacdb5d, 0x4fea, 0x466c, \ 42fc3694d6Sxb.wang { 0x97, 0x16, 0x3d, 0x54, 0x16, 0x52, 0x83, 0x0f } } 43fc3694d6Sxb.wang 44ae8ec5e1SHisping Lin static uint8_t b2hs_add_base(uint8_t in) 45ae8ec5e1SHisping Lin { 46ae8ec5e1SHisping Lin if (in > 9) 47ae8ec5e1SHisping Lin return in + 55; 48ae8ec5e1SHisping Lin else 49ae8ec5e1SHisping Lin return in + 48; 50ae8ec5e1SHisping Lin } 51ae8ec5e1SHisping Lin 52c7de5349SHisping Lin static uint32_t b2hs(uint8_t *b, uint8_t *hs, uint32_t blen, uint32_t hslen) 53ae8ec5e1SHisping Lin { 54ae8ec5e1SHisping Lin uint32_t i = 0; 55ae8ec5e1SHisping Lin 56ae8ec5e1SHisping Lin if (blen * 2 + 1 > hslen) 57ae8ec5e1SHisping Lin return 0; 58ae8ec5e1SHisping Lin 59ae8ec5e1SHisping Lin for (; i < blen; i++) { 60ae8ec5e1SHisping Lin hs[i * 2 + 1] = b2hs_add_base(b[i] & 0xf); 61ae8ec5e1SHisping Lin hs[i * 2] = b2hs_add_base(b[i] >> 4); 62ae8ec5e1SHisping Lin } 63ae8ec5e1SHisping Lin hs[blen * 2] = 0; 64ae8ec5e1SHisping Lin 65ae8ec5e1SHisping Lin return blen * 2; 66ae8ec5e1SHisping Lin } 67ae8ec5e1SHisping Lin 682f8c34bdSxb.wang static void crypto_flush_cacheline(uint32_t addr, uint32_t size) 692f8c34bdSxb.wang { 702f8c34bdSxb.wang ulong alignment = CONFIG_SYS_CACHELINE_SIZE; 712f8c34bdSxb.wang ulong aligned_input, aligned_len; 722f8c34bdSxb.wang 732f8c34bdSxb.wang if (!addr || !size) 742f8c34bdSxb.wang return; 752f8c34bdSxb.wang 762f8c34bdSxb.wang /* Must flush dcache before crypto DMA fetch data region */ 772f8c34bdSxb.wang aligned_input = round_down(addr, alignment); 782f8c34bdSxb.wang aligned_len = round_up(size + (addr - aligned_input), alignment); 792f8c34bdSxb.wang flush_cache(aligned_input, aligned_len); 802f8c34bdSxb.wang } 812f8c34bdSxb.wang 82a900eef3SHisping Lin static void crypto_invalidate_cacheline(uint32_t addr, uint32_t size) 83a900eef3SHisping Lin { 84a900eef3SHisping Lin ulong alignment = CONFIG_SYS_CACHELINE_SIZE; 85a900eef3SHisping Lin ulong aligned_input, aligned_len; 86a900eef3SHisping Lin 87a900eef3SHisping Lin if (!addr || !size) 88a900eef3SHisping Lin return; 89a900eef3SHisping Lin 90a900eef3SHisping Lin /* Must invalidate dcache after crypto DMA write data region */ 91a900eef3SHisping Lin aligned_input = round_down(addr, alignment); 92a900eef3SHisping Lin aligned_len = round_up(size + (addr - aligned_input), alignment); 93a900eef3SHisping Lin invalidate_dcache_range(aligned_input, aligned_input + aligned_len); 94a900eef3SHisping Lin } 95a900eef3SHisping Lin 96c7de5349SHisping Lin static uint32_t trusty_base_write_security_data(char *filename, 97c7de5349SHisping Lin uint32_t filename_size, 98c7de5349SHisping Lin uint8_t *data, 99c7de5349SHisping Lin uint32_t data_size) 100ae8ec5e1SHisping Lin { 101ae8ec5e1SHisping Lin TEEC_Result TeecResult; 102ae8ec5e1SHisping Lin TEEC_Context TeecContext; 103ae8ec5e1SHisping Lin TEEC_Session TeecSession; 104ae8ec5e1SHisping Lin uint32_t ErrorOrigin; 105ae8ec5e1SHisping Lin TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 106ae8ec5e1SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 107ae8ec5e1SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 108ae8ec5e1SHisping Lin TEEC_Operation TeecOperation = {0}; 1093251364cSHisping Lin struct blk_desc *dev_desc; 1103251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 1116651d4c0SJason Zhu if (!dev_desc) { 1126651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 1136651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 1146651d4c0SJason Zhu } 1153251364cSHisping Lin 116f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 117f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 118f4e1db95SHisping Lin return TeecResult; 119ae8ec5e1SHisping Lin 120ae8ec5e1SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 121f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 122f4e1db95SHisping Lin return TeecResult; 123ae8ec5e1SHisping Lin 1243251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 1253251364cSHisping Lin TEEC_NONE, 1263251364cSHisping Lin TEEC_NONE, 1273251364cSHisping Lin TEEC_NONE); 1283251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 129f3c7fe23SHisping Lin if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)//emmc 130f3c7fe23SHisping Lin TeecOperation.params[0].value.a = 1; 131f3c7fe23SHisping Lin else if (dev_desc->if_type == IF_TYPE_SCSI)//ufs 132b9a7e756SHisping Lin TeecOperation.params[0].value.a = 1; 133b9a7e756SHisping Lin else 134b9a7e756SHisping Lin TeecOperation.params[0].value.a = 0; 135f3c7fe23SHisping Lin 1363251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 1373251364cSHisping Lin TeecOperation.params[0].value.a = 0; 1383251364cSHisping Lin #endif 1393251364cSHisping Lin 140ae8ec5e1SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 141ae8ec5e1SHisping Lin &TeecSession, 142ae8ec5e1SHisping Lin TeecUuid, 143ae8ec5e1SHisping Lin TEEC_LOGIN_PUBLIC, 144ae8ec5e1SHisping Lin NULL, 1453251364cSHisping Lin &TeecOperation, 146ae8ec5e1SHisping Lin &ErrorOrigin); 147f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 148f4e1db95SHisping Lin return TeecResult; 149ae8ec5e1SHisping Lin 150ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 151ae8ec5e1SHisping Lin 152c7de5349SHisping Lin SharedMem0.size = filename_size; 153ae8ec5e1SHisping Lin SharedMem0.flags = 0; 154ae8ec5e1SHisping Lin 155ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 156f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 157f4e1db95SHisping Lin goto exit; 158ae8ec5e1SHisping Lin 159c7de5349SHisping Lin memcpy(SharedMem0.buffer, filename, SharedMem0.size); 160ae8ec5e1SHisping Lin 161ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem1 = {0}; 162ae8ec5e1SHisping Lin 163c7de5349SHisping Lin SharedMem1.size = data_size; 164c7de5349SHisping Lin SharedMem1.flags = 0; 165c7de5349SHisping Lin 166c7de5349SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 167c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 168c7de5349SHisping Lin goto exit; 169c7de5349SHisping Lin 170c7de5349SHisping Lin memcpy(SharedMem1.buffer, data, SharedMem1.size); 171c7de5349SHisping Lin 172c7de5349SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 173c7de5349SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 174c7de5349SHisping Lin 175c7de5349SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 176c7de5349SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem1.size; 177c7de5349SHisping Lin 178c7de5349SHisping Lin 179c7de5349SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 180c7de5349SHisping Lin TEEC_MEMREF_TEMP_INOUT, 181c7de5349SHisping Lin TEEC_NONE, 182c7de5349SHisping Lin TEEC_NONE); 183c7de5349SHisping Lin 184c7de5349SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 185c7de5349SHisping Lin 1, 186c7de5349SHisping Lin &TeecOperation, 187c7de5349SHisping Lin &ErrorOrigin); 188c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 189c7de5349SHisping Lin goto exit; 190c7de5349SHisping Lin exit: 191c7de5349SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 192c7de5349SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem1); 193c7de5349SHisping Lin TEEC_CloseSession(&TeecSession); 194c7de5349SHisping Lin TEEC_FinalizeContext(&TeecContext); 195c7de5349SHisping Lin 196c7de5349SHisping Lin return TeecResult; 197c7de5349SHisping Lin } 198c7de5349SHisping Lin 199c7de5349SHisping Lin static uint32_t trusty_base_read_security_data(char *filename, 200c7de5349SHisping Lin uint32_t filename_size, 201c7de5349SHisping Lin uint8_t *data, 202c7de5349SHisping Lin uint32_t data_size) 203c7de5349SHisping Lin { 204c7de5349SHisping Lin TEEC_Result TeecResult; 205c7de5349SHisping Lin TEEC_Context TeecContext; 206c7de5349SHisping Lin TEEC_Session TeecSession; 207c7de5349SHisping Lin uint32_t ErrorOrigin; 208c7de5349SHisping Lin TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 209c7de5349SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 210c7de5349SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 211c7de5349SHisping Lin TEEC_Operation TeecOperation = {0}; 212c7de5349SHisping Lin 213c7de5349SHisping Lin struct blk_desc *dev_desc; 214c7de5349SHisping Lin dev_desc = rockchip_get_bootdev(); 215c7de5349SHisping Lin if (!dev_desc) { 216c7de5349SHisping Lin printf("%s: dev_desc is NULL!\n", __func__); 217c7de5349SHisping Lin return -TEEC_ERROR_GENERIC; 218c7de5349SHisping Lin } 219c7de5349SHisping Lin 220c7de5349SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 221c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 222c7de5349SHisping Lin return TeecResult; 223c7de5349SHisping Lin 224c7de5349SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 225c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 226c7de5349SHisping Lin return TeecResult; 227c7de5349SHisping Lin 228c7de5349SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 229c7de5349SHisping Lin TEEC_NONE, 230c7de5349SHisping Lin TEEC_NONE, 231c7de5349SHisping Lin TEEC_NONE); 232c7de5349SHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 233f3c7fe23SHisping Lin if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)//emmc 234f3c7fe23SHisping Lin TeecOperation.params[0].value.a = 1; 235f3c7fe23SHisping Lin else if (dev_desc->if_type == IF_TYPE_SCSI)//ufs 236c7de5349SHisping Lin TeecOperation.params[0].value.a = 1; 237c7de5349SHisping Lin else 238c7de5349SHisping Lin TeecOperation.params[0].value.a = 0; 239f3c7fe23SHisping Lin 240c7de5349SHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 241c7de5349SHisping Lin TeecOperation.params[0].value.a = 0; 242c7de5349SHisping Lin #endif 243c7de5349SHisping Lin 244c7de5349SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 245c7de5349SHisping Lin &TeecSession, 246c7de5349SHisping Lin TeecUuid, 247c7de5349SHisping Lin TEEC_LOGIN_PUBLIC, 248c7de5349SHisping Lin NULL, 249c7de5349SHisping Lin &TeecOperation, 250c7de5349SHisping Lin &ErrorOrigin); 251c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 252c7de5349SHisping Lin return TeecResult; 253c7de5349SHisping Lin 254c7de5349SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 255c7de5349SHisping Lin 256c7de5349SHisping Lin SharedMem0.size = filename_size; 257c7de5349SHisping Lin SharedMem0.flags = 0; 258c7de5349SHisping Lin 259c7de5349SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 260c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 261c7de5349SHisping Lin goto exit; 262c7de5349SHisping Lin 263c7de5349SHisping Lin memcpy(SharedMem0.buffer, filename, SharedMem0.size); 264c7de5349SHisping Lin 265c7de5349SHisping Lin TEEC_SharedMemory SharedMem1 = {0}; 266c7de5349SHisping Lin 267c7de5349SHisping Lin SharedMem1.size = data_size; 268ae8ec5e1SHisping Lin SharedMem1.flags = 0; 269ae8ec5e1SHisping Lin 270ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 271f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 272f4e1db95SHisping Lin goto exit; 273ae8ec5e1SHisping Lin 274ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 275ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 276ae8ec5e1SHisping Lin 277ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 278ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem1.size; 279ae8ec5e1SHisping Lin 280ae8ec5e1SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 281ae8ec5e1SHisping Lin TEEC_MEMREF_TEMP_INOUT, 282ae8ec5e1SHisping Lin TEEC_NONE, 283ae8ec5e1SHisping Lin TEEC_NONE); 284ae8ec5e1SHisping Lin 285ae8ec5e1SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 286ae8ec5e1SHisping Lin 0, 287ae8ec5e1SHisping Lin &TeecOperation, 288ae8ec5e1SHisping Lin &ErrorOrigin); 28946b2a054SHisping Lin if (TeecResult == TEEC_SUCCESS) 290c7de5349SHisping Lin memcpy(data, SharedMem1.buffer, SharedMem1.size); 291f4e1db95SHisping Lin exit: 292ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 293ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem1); 294ae8ec5e1SHisping Lin TEEC_CloseSession(&TeecSession); 29546b2a054SHisping Lin TEEC_FinalizeContext(&TeecContext); 296ae8ec5e1SHisping Lin 297ae8ec5e1SHisping Lin return TeecResult; 298ae8ec5e1SHisping Lin } 299ae8ec5e1SHisping Lin 300c7de5349SHisping Lin static uint32_t trusty_base_end_security_data(void) 301c7de5349SHisping Lin { 302c7de5349SHisping Lin TEEC_Result TeecResult; 303c7de5349SHisping Lin TEEC_Context TeecContext; 304c7de5349SHisping Lin TEEC_Session TeecSession; 305c7de5349SHisping Lin uint32_t ErrorOrigin; 306c7de5349SHisping Lin TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 307c7de5349SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 308c7de5349SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 309c7de5349SHisping Lin TEEC_Operation TeecOperation = {0}; 310c7de5349SHisping Lin 311c7de5349SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 312c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 313c7de5349SHisping Lin return TeecResult; 314c7de5349SHisping Lin 315c7de5349SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 316c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 317c7de5349SHisping Lin return TeecResult; 318c7de5349SHisping Lin 319c7de5349SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 320c7de5349SHisping Lin &TeecSession, 321c7de5349SHisping Lin TeecUuid, 322c7de5349SHisping Lin TEEC_LOGIN_PUBLIC, 323c7de5349SHisping Lin NULL, 324c7de5349SHisping Lin NULL, 325c7de5349SHisping Lin &ErrorOrigin); 326c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 327c7de5349SHisping Lin return TeecResult; 328c7de5349SHisping Lin 329c7de5349SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE, 330c7de5349SHisping Lin TEEC_NONE, 331c7de5349SHisping Lin TEEC_NONE, 332c7de5349SHisping Lin TEEC_NONE); 333c7de5349SHisping Lin 334c7de5349SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 335c7de5349SHisping Lin 2, 336c7de5349SHisping Lin &TeecOperation, 337c7de5349SHisping Lin &ErrorOrigin); 338c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 339c7de5349SHisping Lin goto exit; 340c7de5349SHisping Lin exit: 341c7de5349SHisping Lin TEEC_CloseSession(&TeecSession); 342c7de5349SHisping Lin TEEC_FinalizeContext(&TeecContext); 343c7de5349SHisping Lin 344c7de5349SHisping Lin return TeecResult; 345c7de5349SHisping Lin } 346c7de5349SHisping Lin 34734f2e8f6SHisping Lin static void trusty_notify_always_use_security(void) 34834f2e8f6SHisping Lin { 34934f2e8f6SHisping Lin #if defined(CONFIG_OPTEE_V2) && defined(CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION) 35034f2e8f6SHisping Lin TEEC_Result TeecResult; 35134f2e8f6SHisping Lin TEEC_Context TeecContext; 35234f2e8f6SHisping Lin TEEC_Session TeecSession; 35334f2e8f6SHisping Lin uint32_t ErrorOrigin; 35434f2e8f6SHisping Lin TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 35534f2e8f6SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 35634f2e8f6SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 35734f2e8f6SHisping Lin TEEC_Operation TeecOperation = {0}; 35834f2e8f6SHisping Lin 35934f2e8f6SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 36034f2e8f6SHisping Lin if (TeecResult != TEEC_SUCCESS) 36134f2e8f6SHisping Lin return; 36234f2e8f6SHisping Lin 36334f2e8f6SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 36434f2e8f6SHisping Lin if (TeecResult != TEEC_SUCCESS) 36534f2e8f6SHisping Lin return; 36634f2e8f6SHisping Lin 36734f2e8f6SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 36834f2e8f6SHisping Lin &TeecSession, 36934f2e8f6SHisping Lin TeecUuid, 37034f2e8f6SHisping Lin TEEC_LOGIN_PUBLIC, 37134f2e8f6SHisping Lin NULL, 37234f2e8f6SHisping Lin NULL, 37334f2e8f6SHisping Lin &ErrorOrigin); 37434f2e8f6SHisping Lin if (TeecResult != TEEC_SUCCESS) 37534f2e8f6SHisping Lin return; 37634f2e8f6SHisping Lin 37734f2e8f6SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE, 37834f2e8f6SHisping Lin TEEC_NONE, 37934f2e8f6SHisping Lin TEEC_NONE, 38034f2e8f6SHisping Lin TEEC_NONE); 38134f2e8f6SHisping Lin 38234f2e8f6SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 38334f2e8f6SHisping Lin 9, 38434f2e8f6SHisping Lin &TeecOperation, 38534f2e8f6SHisping Lin &ErrorOrigin); 38634f2e8f6SHisping Lin if (TeecResult != TEEC_SUCCESS) 38734f2e8f6SHisping Lin debug("notify always use security fail! please update optee!"); 38834f2e8f6SHisping Lin 38934f2e8f6SHisping Lin TEEC_CloseSession(&TeecSession); 39034f2e8f6SHisping Lin TEEC_FinalizeContext(&TeecContext); 39134f2e8f6SHisping Lin 39234f2e8f6SHisping Lin return; 39334f2e8f6SHisping Lin #endif 39434f2e8f6SHisping Lin } 39534f2e8f6SHisping Lin 396c7de5349SHisping Lin uint32_t trusty_read_rollback_index(uint32_t slot, uint64_t *value) 397c7de5349SHisping Lin { 398c7de5349SHisping Lin char hs[9]; 399c7de5349SHisping Lin 400c7de5349SHisping Lin b2hs((uint8_t *)&slot, (uint8_t *)hs, 4, 9); 401c7de5349SHisping Lin 402c7de5349SHisping Lin return trusty_base_read_security_data(hs, 8, (uint8_t *)value, 8); 403c7de5349SHisping Lin } 404c7de5349SHisping Lin 405ae8ec5e1SHisping Lin uint32_t trusty_write_rollback_index(uint32_t slot, uint64_t value) 406ae8ec5e1SHisping Lin { 407c7de5349SHisping Lin char hs[9]; 4083251364cSHisping Lin 409c7de5349SHisping Lin b2hs((uint8_t *)&slot, (uint8_t *)hs, 4, 9); 410ae8ec5e1SHisping Lin 411c7de5349SHisping Lin return trusty_base_write_security_data(hs, 8, (uint8_t *)&value, 8); 412ae8ec5e1SHisping Lin } 413ae8ec5e1SHisping Lin 414ae8ec5e1SHisping Lin uint32_t trusty_read_permanent_attributes(uint8_t *attributes, uint32_t size) 415ae8ec5e1SHisping Lin { 416c7de5349SHisping Lin return trusty_base_read_security_data("attributes", 417c7de5349SHisping Lin sizeof("attributes"), attributes, size); 418ae8ec5e1SHisping Lin } 419ae8ec5e1SHisping Lin 420ae8ec5e1SHisping Lin uint32_t trusty_write_permanent_attributes(uint8_t *attributes, uint32_t size) 421ae8ec5e1SHisping Lin { 422c7de5349SHisping Lin return trusty_base_write_security_data("attributes", 423c7de5349SHisping Lin sizeof("attributes"), attributes, size); 4246651d4c0SJason Zhu } 425ae8ec5e1SHisping Lin 426c7de5349SHisping Lin uint32_t trusty_read_permanent_attributes_flag(uint8_t *attributes) 427c7de5349SHisping Lin { 428c7de5349SHisping Lin return trusty_base_read_security_data("attributes_flag", 429c7de5349SHisping Lin sizeof("attributes_flag"), attributes, 1); 430c7de5349SHisping Lin } 431ae8ec5e1SHisping Lin 432c7de5349SHisping Lin uint32_t trusty_write_permanent_attributes_flag(uint8_t attributes) 433c7de5349SHisping Lin { 434c7de5349SHisping Lin return trusty_base_write_security_data("attributes_flag", 435c7de5349SHisping Lin sizeof("attributes_flag"), &attributes, 1); 436ae8ec5e1SHisping Lin } 437ae8ec5e1SHisping Lin 438564654ebSJason Zhu uint32_t trusty_read_permanent_attributes_cer(uint8_t *attributes, 439564654ebSJason Zhu uint32_t size) 440564654ebSJason Zhu { 441c7de5349SHisping Lin return trusty_base_read_security_data("rsacer", 442c7de5349SHisping Lin sizeof("rsacer"), attributes, size); 443564654ebSJason Zhu } 444564654ebSJason Zhu 445564654ebSJason Zhu uint32_t trusty_write_permanent_attributes_cer(uint8_t *attributes, 446564654ebSJason Zhu uint32_t size) 447564654ebSJason Zhu { 448c7de5349SHisping Lin return trusty_base_write_security_data("rsacer", 449c7de5349SHisping Lin sizeof("rsacer"), attributes, size); 450564654ebSJason Zhu } 451564654ebSJason Zhu 452ae8ec5e1SHisping Lin uint32_t trusty_read_lock_state(uint8_t *lock_state) 453ae8ec5e1SHisping Lin { 454c7de5349SHisping Lin return trusty_base_read_security_data("lock_state", 455c7de5349SHisping Lin sizeof("lock_state"), lock_state, 1); 456ae8ec5e1SHisping Lin } 457ae8ec5e1SHisping Lin 458ae8ec5e1SHisping Lin uint32_t trusty_write_lock_state(uint8_t lock_state) 459ae8ec5e1SHisping Lin { 460c7de5349SHisping Lin return trusty_base_write_security_data("lock_state", 461c7de5349SHisping Lin sizeof("lock_state"), &lock_state, 1); 462ae8ec5e1SHisping Lin } 463ae8ec5e1SHisping Lin 464ae8ec5e1SHisping Lin uint32_t trusty_read_flash_lock_state(uint8_t *flash_lock_state) 465ae8ec5e1SHisping Lin { 466c7de5349SHisping Lin return trusty_base_read_security_data("flash_lock_state", 467c7de5349SHisping Lin sizeof("flash_lock_state"), flash_lock_state, 1); 468c7de5349SHisping Lin } 469c7de5349SHisping Lin 470c7de5349SHisping Lin uint32_t trusty_write_flash_lock_state(uint8_t flash_lock_state) 471c7de5349SHisping Lin { 472c7de5349SHisping Lin return trusty_base_write_security_data("flash_lock_state", 473c7de5349SHisping Lin sizeof("flash_lock_state"), &flash_lock_state, 1); 474c7de5349SHisping Lin } 475c7de5349SHisping Lin 476c7de5349SHisping Lin static uint32_t trusty_base_end_efuse_or_otp(void) 477c7de5349SHisping Lin { 478ae8ec5e1SHisping Lin TEEC_Result TeecResult; 479ae8ec5e1SHisping Lin TEEC_Context TeecContext; 480ae8ec5e1SHisping Lin TEEC_Session TeecSession; 481ae8ec5e1SHisping Lin uint32_t ErrorOrigin; 482c7de5349SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 483c7de5349SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 484c7de5349SHisping Lin 485ae8ec5e1SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 486ae8ec5e1SHisping Lin TEEC_Operation TeecOperation = {0}; 487ae8ec5e1SHisping Lin 488f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 489f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 490f4e1db95SHisping Lin return TeecResult; 491ae8ec5e1SHisping Lin 492ae8ec5e1SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 493f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 494f4e1db95SHisping Lin return TeecResult; 495ae8ec5e1SHisping Lin 496ae8ec5e1SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 497ae8ec5e1SHisping Lin &TeecSession, 498ae8ec5e1SHisping Lin TeecUuid, 499ae8ec5e1SHisping Lin TEEC_LOGIN_PUBLIC, 500ae8ec5e1SHisping Lin NULL, 501c7de5349SHisping Lin NULL, 502ae8ec5e1SHisping Lin &ErrorOrigin); 503f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 504f4e1db95SHisping Lin return TeecResult; 505ae8ec5e1SHisping Lin 506c7de5349SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE, 507c7de5349SHisping Lin TEEC_NONE, 508ae8ec5e1SHisping Lin TEEC_NONE, 509ae8ec5e1SHisping Lin TEEC_NONE); 510ae8ec5e1SHisping Lin 511ae8ec5e1SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 512c7de5349SHisping Lin STORAGE_CMD_UBOOT_END_OTP, 513ae8ec5e1SHisping Lin &TeecOperation, 514ae8ec5e1SHisping Lin &ErrorOrigin); 515c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 516c7de5349SHisping Lin goto exit; 517f4e1db95SHisping Lin exit: 518ae8ec5e1SHisping Lin TEEC_CloseSession(&TeecSession); 51946b2a054SHisping Lin TEEC_FinalizeContext(&TeecContext); 520ae8ec5e1SHisping Lin 521ae8ec5e1SHisping Lin return TeecResult; 522ae8ec5e1SHisping Lin } 523ae8ec5e1SHisping Lin 524c7de5349SHisping Lin static uint32_t trusty_base_efuse_or_otp_operation(uint32_t cmd, 525c7de5349SHisping Lin uint8_t is_write, 526c7de5349SHisping Lin uint32_t *buf, 527c7de5349SHisping Lin uint32_t length) 528ae8ec5e1SHisping Lin { 529ae8ec5e1SHisping Lin TEEC_Result TeecResult; 530ae8ec5e1SHisping Lin TEEC_Context TeecContext; 531ae8ec5e1SHisping Lin TEEC_Session TeecSession; 532ae8ec5e1SHisping Lin uint32_t ErrorOrigin; 533c7de5349SHisping Lin 534c7de5349SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 535c7de5349SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 536ae8ec5e1SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 537ae8ec5e1SHisping Lin TEEC_Operation TeecOperation = {0}; 538ae8ec5e1SHisping Lin 539f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 540f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 541f4e1db95SHisping Lin return TeecResult; 542ae8ec5e1SHisping Lin 543ae8ec5e1SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 544f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 545f4e1db95SHisping Lin return TeecResult; 546ae8ec5e1SHisping Lin 547ae8ec5e1SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 548ae8ec5e1SHisping Lin &TeecSession, 549ae8ec5e1SHisping Lin TeecUuid, 550ae8ec5e1SHisping Lin TEEC_LOGIN_PUBLIC, 551ae8ec5e1SHisping Lin NULL, 552c7de5349SHisping Lin NULL, 553ae8ec5e1SHisping Lin &ErrorOrigin); 554f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 555f4e1db95SHisping Lin return TeecResult; 556ae8ec5e1SHisping Lin 557ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 558ae8ec5e1SHisping Lin 559c7de5349SHisping Lin SharedMem0.size = length * sizeof(uint32_t); 560ae8ec5e1SHisping Lin SharedMem0.flags = 0; 561ae8ec5e1SHisping Lin 562ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 563f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 564f4e1db95SHisping Lin goto exit; 565ae8ec5e1SHisping Lin 566ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 567ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 568ae8ec5e1SHisping Lin 569c7de5349SHisping Lin if (is_write) { 570c7de5349SHisping Lin memcpy(SharedMem0.buffer, buf, SharedMem0.size); 571ae8ec5e1SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 572c7de5349SHisping Lin TEEC_NONE, 573ae8ec5e1SHisping Lin TEEC_NONE, 574ae8ec5e1SHisping Lin TEEC_NONE); 575ae8ec5e1SHisping Lin 576c7de5349SHisping Lin } else { 577c7de5349SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT, 578c7de5349SHisping Lin TEEC_NONE, 579c7de5349SHisping Lin TEEC_NONE, 580c7de5349SHisping Lin TEEC_NONE); 581c7de5349SHisping Lin } 582c7de5349SHisping Lin 583ae8ec5e1SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 584c7de5349SHisping Lin cmd, 585ae8ec5e1SHisping Lin &TeecOperation, 586ae8ec5e1SHisping Lin &ErrorOrigin); 587f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 588f4e1db95SHisping Lin goto exit; 589c7de5349SHisping Lin 590c7de5349SHisping Lin if (!is_write) 591c7de5349SHisping Lin memcpy(buf, SharedMem0.buffer, SharedMem0.size); 592c7de5349SHisping Lin 593f4e1db95SHisping Lin exit: 594ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 595ae8ec5e1SHisping Lin TEEC_CloseSession(&TeecSession); 59646b2a054SHisping Lin TEEC_FinalizeContext(&TeecContext); 597ae8ec5e1SHisping Lin 598ae8ec5e1SHisping Lin return TeecResult; 599ae8ec5e1SHisping Lin } 600ae8ec5e1SHisping Lin 6016ef445a4SHisping Lin uint32_t trusty_read_attribute_hash(uint32_t *buf, uint32_t length) 6026ef445a4SHisping Lin { 603c7de5349SHisping Lin return trusty_base_efuse_or_otp_operation(STORAGE_CMD_READ_ATTRIBUTE_HASH, 604c7de5349SHisping Lin false, buf, length); 6056ef445a4SHisping Lin } 6066ef445a4SHisping Lin 6076ef445a4SHisping Lin uint32_t trusty_write_attribute_hash(uint32_t *buf, uint32_t length) 6086ef445a4SHisping Lin { 609c7de5349SHisping Lin return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_ATTRIBUTE_HASH, 610c7de5349SHisping Lin true, buf, length); 61116539616SHisping Lin } 61216539616SHisping Lin 61316539616SHisping Lin uint32_t trusty_notify_optee_uboot_end(void) 61416539616SHisping Lin { 61516539616SHisping Lin TEEC_Result res; 616c7de5349SHisping Lin 617c7de5349SHisping Lin res = trusty_base_end_security_data(); 618c7de5349SHisping Lin res |= trusty_base_end_efuse_or_otp(); 61916539616SHisping Lin return res; 62016539616SHisping Lin } 6212cd27853SHisping Lin 6222cd27853SHisping Lin uint32_t trusty_read_vbootkey_hash(uint32_t *buf, uint32_t length) 6232cd27853SHisping Lin { 624c7de5349SHisping Lin return trusty_base_efuse_or_otp_operation(STORAGE_CMD_READ_VBOOTKEY_HASH, 625c7de5349SHisping Lin false, buf, length); 6262cd27853SHisping Lin } 627c7de5349SHisping Lin 6282cd27853SHisping Lin uint32_t trusty_write_vbootkey_hash(uint32_t *buf, uint32_t length) 6292cd27853SHisping Lin { 630c7de5349SHisping Lin return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_VBOOTKEY_HASH, 631c7de5349SHisping Lin true, buf, length); 6322cd27853SHisping Lin } 633095e2a82SHisping Lin 634468df3b2SHisping Lin uint32_t trusty_read_vbootkey_enable_flag(uint8_t *flag) 635468df3b2SHisping Lin { 636468df3b2SHisping Lin uint32_t bootflag; 637c7de5349SHisping Lin TEEC_Result TeecResult; 638468df3b2SHisping Lin 639f07e1686SHisping Lin *flag = 0; 640f07e1686SHisping Lin 641c7de5349SHisping Lin TeecResult = trusty_base_efuse_or_otp_operation(STORAGE_CMD_READ_ENABLE_FLAG, 642c7de5349SHisping Lin false, &bootflag, 1); 643468df3b2SHisping Lin 644468df3b2SHisping Lin if (TeecResult == TEEC_SUCCESS) { 6450202ee8aSHisping Lin #if defined(CONFIG_ROCKCHIP_RK3288) 6460202ee8aSHisping Lin if (bootflag == 0x00000001) 6470202ee8aSHisping Lin *flag = 1; 6480202ee8aSHisping Lin #else 649468df3b2SHisping Lin if (bootflag == 0x000000FF) 650468df3b2SHisping Lin *flag = 1; 6510202ee8aSHisping Lin #endif 652468df3b2SHisping Lin } 653095e2a82SHisping Lin return TeecResult; 654095e2a82SHisping Lin } 6554aa61755SAndy Ye 6561ef63c75SHisping Lin uint32_t trusty_write_ta_encryption_key(uint32_t *buf, uint32_t length) 6571ef63c75SHisping Lin { 6581ef63c75SHisping Lin return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_TA_ENCRYPTION_KEY, 6591ef63c75SHisping Lin true, buf, length); 6601ef63c75SHisping Lin } 6611ef63c75SHisping Lin 66210f41197SHisping Lin uint32_t trusty_ta_encryption_key_is_written(uint8_t *value) 66310f41197SHisping Lin { 66410f41197SHisping Lin TEEC_Result TeecResult; 66510f41197SHisping Lin TEEC_Context TeecContext; 66610f41197SHisping Lin TEEC_Session TeecSession; 66710f41197SHisping Lin uint32_t ErrorOrigin; 66810f41197SHisping Lin 66910f41197SHisping Lin *value = 0; 67010f41197SHisping Lin 67110f41197SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 67210f41197SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 67310f41197SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 67410f41197SHisping Lin TEEC_Operation TeecOperation = {0}; 67510f41197SHisping Lin 67610f41197SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 67710f41197SHisping Lin if (TeecResult != TEEC_SUCCESS) 67810f41197SHisping Lin return TeecResult; 67910f41197SHisping Lin 68010f41197SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 68110f41197SHisping Lin if (TeecResult != TEEC_SUCCESS) 68210f41197SHisping Lin return TeecResult; 68310f41197SHisping Lin 68410f41197SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 68510f41197SHisping Lin &TeecSession, 68610f41197SHisping Lin TeecUuid, 68710f41197SHisping Lin TEEC_LOGIN_PUBLIC, 68810f41197SHisping Lin NULL, 68910f41197SHisping Lin NULL, 69010f41197SHisping Lin &ErrorOrigin); 69110f41197SHisping Lin if (TeecResult != TEEC_SUCCESS) 69210f41197SHisping Lin return TeecResult; 69310f41197SHisping Lin 69410f41197SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_OUTPUT, 69510f41197SHisping Lin TEEC_NONE, 69610f41197SHisping Lin TEEC_NONE, 69710f41197SHisping Lin TEEC_NONE); 69810f41197SHisping Lin 69910f41197SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 70010f41197SHisping Lin STORAGE_CMD_TA_ENCRYPTION_KEY_IS_WRITTEN, 70110f41197SHisping Lin &TeecOperation, 70210f41197SHisping Lin &ErrorOrigin); 70310f41197SHisping Lin if (TeecResult == TEEC_SUCCESS) 70410f41197SHisping Lin *value = TeecOperation.params[0].value.a; 70510f41197SHisping Lin 70610f41197SHisping Lin TEEC_CloseSession(&TeecSession); 70710f41197SHisping Lin TEEC_FinalizeContext(&TeecContext); 70810f41197SHisping Lin 70910f41197SHisping Lin return TeecResult; 71010f41197SHisping Lin } 71110f41197SHisping Lin 7121ac64e8aSHisping Lin uint32_t trusty_write_oem_encrypt_data(uint32_t *buf, uint32_t length) 7131ac64e8aSHisping Lin { 7141ac64e8aSHisping Lin return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_OEM_ENCRYPT_DATA, 7151ac64e8aSHisping Lin true, buf, length); 7161ac64e8aSHisping Lin } 7171ac64e8aSHisping Lin 718fc383442SHisping Lin uint32_t trusty_oem_encrypt_data_is_written(uint8_t *value) 719fc383442SHisping Lin { 720fc383442SHisping Lin TEEC_Result TeecResult; 721fc383442SHisping Lin TEEC_Context TeecContext; 722fc383442SHisping Lin TEEC_Session TeecSession; 723fc383442SHisping Lin uint32_t ErrorOrigin; 724fc383442SHisping Lin 725fc383442SHisping Lin *value = 0; 726fc383442SHisping Lin 727fc383442SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 728fc383442SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 729fc383442SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 730fc383442SHisping Lin TEEC_Operation TeecOperation = {0}; 731fc383442SHisping Lin 732fc383442SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 733fc383442SHisping Lin if (TeecResult != TEEC_SUCCESS) 734fc383442SHisping Lin return TeecResult; 735fc383442SHisping Lin 736fc383442SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 737fc383442SHisping Lin if (TeecResult != TEEC_SUCCESS) 738fc383442SHisping Lin return TeecResult; 739fc383442SHisping Lin 740fc383442SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 741fc383442SHisping Lin &TeecSession, 742fc383442SHisping Lin TeecUuid, 743fc383442SHisping Lin TEEC_LOGIN_PUBLIC, 744fc383442SHisping Lin NULL, 745fc383442SHisping Lin NULL, 746fc383442SHisping Lin &ErrorOrigin); 747fc383442SHisping Lin if (TeecResult != TEEC_SUCCESS) 748fc383442SHisping Lin return TeecResult; 749fc383442SHisping Lin 750fc383442SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_OUTPUT, 751fc383442SHisping Lin TEEC_NONE, 752fc383442SHisping Lin TEEC_NONE, 753fc383442SHisping Lin TEEC_NONE); 754fc383442SHisping Lin 755fc383442SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 756fc383442SHisping Lin STORAGE_CMD_OEM_ENCRYPT_DATA_IS_WRITTEN, 757fc383442SHisping Lin &TeecOperation, 758fc383442SHisping Lin &ErrorOrigin); 759fc383442SHisping Lin if (TeecResult == TEEC_SUCCESS) 760fc383442SHisping Lin *value = TeecOperation.params[0].value.a; 761fc383442SHisping Lin 762fc383442SHisping Lin TEEC_CloseSession(&TeecSession); 763fc383442SHisping Lin TEEC_FinalizeContext(&TeecContext); 764fc383442SHisping Lin 765fc383442SHisping Lin return TeecResult; 766fc383442SHisping Lin } 767fc383442SHisping Lin 768fbf29bfbSHisping Lin uint32_t trusty_check_security_level_flag(uint8_t flag) 769fbf29bfbSHisping Lin { 770fbf29bfbSHisping Lin uint32_t levelflag; 771fbf29bfbSHisping Lin 772fbf29bfbSHisping Lin levelflag = flag; 773fbf29bfbSHisping Lin return trusty_base_efuse_or_otp_operation(STORAGE_CMD_CHECK_SECURITY_LEVEL_FLAG, 774fbf29bfbSHisping Lin true, &levelflag, 1); 775fbf29bfbSHisping Lin } 776fbf29bfbSHisping Lin 777f39d4289SHisping Lin uint32_t trusty_write_oem_huk(uint32_t *buf, uint32_t length) 778f39d4289SHisping Lin { 779f39d4289SHisping Lin return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_OEM_HUK, 780f39d4289SHisping Lin true, buf, length); 781f39d4289SHisping Lin } 782f39d4289SHisping Lin 78334f2e8f6SHisping Lin static void trusty_select_security_level(void) 7847504da74SHisping Lin { 785*b2858095SHisping Lin #ifdef CONFIG_OPTEE_SECURITY_LEVEL 7867504da74SHisping Lin TEEC_Result TeecResult; 7877504da74SHisping Lin 7887504da74SHisping Lin TeecResult = trusty_check_security_level_flag(CONFIG_OPTEE_SECURITY_LEVEL); 7897504da74SHisping Lin if (TeecResult == TEE_ERROR_CANCEL) { 7907504da74SHisping Lin run_command("download", 0); 7917504da74SHisping Lin return; 7927504da74SHisping Lin } 7937504da74SHisping Lin 7947504da74SHisping Lin if (TeecResult == TEEC_SUCCESS) 7957504da74SHisping Lin debug("optee select security level success!"); 796*b2858095SHisping Lin else if (TeecResult == TEEC_ERROR_NOT_SUPPORTED) 797*b2858095SHisping Lin debug("optee not support security level!"); 7987504da74SHisping Lin else 7997504da74SHisping Lin panic("optee select security level fail!"); 8007504da74SHisping Lin 8017504da74SHisping Lin return; 8027504da74SHisping Lin #endif 8037504da74SHisping Lin } 8047504da74SHisping Lin 80551ac7005SHisping Lin void optee_client_init(void) 80651ac7005SHisping Lin { 80751ac7005SHisping Lin trusty_select_security_level(); 80834f2e8f6SHisping Lin trusty_notify_always_use_security(); 80951ac7005SHisping Lin } 81051ac7005SHisping Lin 811d5913350SHisping Lin uint32_t trusty_write_oem_ns_otp(uint32_t byte_off, uint8_t *byte_buf, uint32_t byte_len) 812d5913350SHisping Lin { 813d5913350SHisping Lin TEEC_Result TeecResult; 814d5913350SHisping Lin TEEC_Context TeecContext; 815d5913350SHisping Lin TEEC_Session TeecSession; 816d5913350SHisping Lin uint32_t ErrorOrigin; 817d5913350SHisping Lin 818d5913350SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 819d5913350SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 820d5913350SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 821d5913350SHisping Lin TEEC_Operation TeecOperation = {0}; 822d5913350SHisping Lin 823d5913350SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 824d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 825d5913350SHisping Lin return TeecResult; 826d5913350SHisping Lin 827d5913350SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 828d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 829d5913350SHisping Lin return TeecResult; 830d5913350SHisping Lin 831d5913350SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 832d5913350SHisping Lin &TeecSession, 833d5913350SHisping Lin TeecUuid, 834d5913350SHisping Lin TEEC_LOGIN_PUBLIC, 835d5913350SHisping Lin NULL, 836d5913350SHisping Lin NULL, 837d5913350SHisping Lin &ErrorOrigin); 838d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 839d5913350SHisping Lin return TeecResult; 840d5913350SHisping Lin 841d5913350SHisping Lin TeecOperation.params[0].value.a = byte_off; 842d5913350SHisping Lin 843d5913350SHisping Lin TEEC_SharedMemory SharedMem = {0}; 844d5913350SHisping Lin 845d5913350SHisping Lin SharedMem.size = byte_len; 846d5913350SHisping Lin SharedMem.flags = 0; 847d5913350SHisping Lin 848d5913350SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem); 849d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 850d5913350SHisping Lin goto exit; 851d5913350SHisping Lin 852d5913350SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem.buffer; 853d5913350SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem.size; 854d5913350SHisping Lin 855d5913350SHisping Lin memcpy(SharedMem.buffer, byte_buf, SharedMem.size); 856d5913350SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 857d5913350SHisping Lin TEEC_MEMREF_TEMP_INPUT, 858d5913350SHisping Lin TEEC_NONE, 859d5913350SHisping Lin TEEC_NONE); 860d5913350SHisping Lin 861d5913350SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 862d5913350SHisping Lin STORAGE_CMD_WRITE_OEM_NS_OTP, 863d5913350SHisping Lin &TeecOperation, 864d5913350SHisping Lin &ErrorOrigin); 865d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 866d5913350SHisping Lin goto exit; 867d5913350SHisping Lin 868d5913350SHisping Lin exit: 869d5913350SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem); 870d5913350SHisping Lin TEEC_CloseSession(&TeecSession); 871d5913350SHisping Lin TEEC_FinalizeContext(&TeecContext); 872d5913350SHisping Lin 873d5913350SHisping Lin return TeecResult; 874d5913350SHisping Lin } 875d5913350SHisping Lin 876d5913350SHisping Lin uint32_t trusty_read_oem_ns_otp(uint32_t byte_off, uint8_t *byte_buf, uint32_t byte_len) 877d5913350SHisping Lin { 878d5913350SHisping Lin TEEC_Result TeecResult; 879d5913350SHisping Lin TEEC_Context TeecContext; 880d5913350SHisping Lin TEEC_Session TeecSession; 881d5913350SHisping Lin uint32_t ErrorOrigin; 882d5913350SHisping Lin 883d5913350SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 884d5913350SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 885d5913350SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 886d5913350SHisping Lin TEEC_Operation TeecOperation = {0}; 887d5913350SHisping Lin 888d5913350SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 889d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 890d5913350SHisping Lin return TeecResult; 891d5913350SHisping Lin 892d5913350SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 893d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 894d5913350SHisping Lin return TeecResult; 895d5913350SHisping Lin 896d5913350SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 897d5913350SHisping Lin &TeecSession, 898d5913350SHisping Lin TeecUuid, 899d5913350SHisping Lin TEEC_LOGIN_PUBLIC, 900d5913350SHisping Lin NULL, 901d5913350SHisping Lin NULL, 902d5913350SHisping Lin &ErrorOrigin); 903d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 904d5913350SHisping Lin return TeecResult; 905d5913350SHisping Lin 906d5913350SHisping Lin TeecOperation.params[0].value.a = byte_off; 907d5913350SHisping Lin 908d5913350SHisping Lin TEEC_SharedMemory SharedMem = {0}; 909d5913350SHisping Lin 910d5913350SHisping Lin SharedMem.size = byte_len; 911d5913350SHisping Lin SharedMem.flags = 0; 912d5913350SHisping Lin 913d5913350SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem); 914d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 915d5913350SHisping Lin goto exit; 916d5913350SHisping Lin 917d5913350SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem.buffer; 918d5913350SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem.size; 919d5913350SHisping Lin 920d5913350SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 921d5913350SHisping Lin TEEC_MEMREF_TEMP_OUTPUT, 922d5913350SHisping Lin TEEC_NONE, 923d5913350SHisping Lin TEEC_NONE); 924d5913350SHisping Lin 925d5913350SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 926d5913350SHisping Lin STORAGE_CMD_READ_OEM_NS_OTP, 927d5913350SHisping Lin &TeecOperation, 928d5913350SHisping Lin &ErrorOrigin); 929d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 930d5913350SHisping Lin goto exit; 931d5913350SHisping Lin 932d5913350SHisping Lin memcpy(byte_buf, SharedMem.buffer, SharedMem.size); 933d5913350SHisping Lin 934d5913350SHisping Lin exit: 935d5913350SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem); 936d5913350SHisping Lin TEEC_CloseSession(&TeecSession); 937d5913350SHisping Lin TEEC_FinalizeContext(&TeecContext); 938d5913350SHisping Lin 939d5913350SHisping Lin return TeecResult; 940d5913350SHisping Lin } 941d5913350SHisping Lin 94290e849a0Sxb.wang uint32_t trusty_write_oem_otp_key(enum RK_OEM_OTP_KEYID key_id, 943bb1ba6acSHisping Lin uint8_t *byte_buf, uint32_t byte_len) 944bb1ba6acSHisping Lin { 945bb1ba6acSHisping Lin TEEC_Result TeecResult; 946bb1ba6acSHisping Lin TEEC_Context TeecContext; 947bb1ba6acSHisping Lin TEEC_Session TeecSession; 948bb1ba6acSHisping Lin uint32_t ErrorOrigin; 949bb1ba6acSHisping Lin 950bb1ba6acSHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 951bb1ba6acSHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 952bb1ba6acSHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 953bb1ba6acSHisping Lin TEEC_Operation TeecOperation = {0}; 954bb1ba6acSHisping Lin 955bb1ba6acSHisping Lin TeecResult = OpteeClientApiLibInitialize(); 956bb1ba6acSHisping Lin if (TeecResult != TEEC_SUCCESS) 957bb1ba6acSHisping Lin return TeecResult; 958bb1ba6acSHisping Lin 959bb1ba6acSHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 960bb1ba6acSHisping Lin if (TeecResult != TEEC_SUCCESS) 961bb1ba6acSHisping Lin return TeecResult; 962bb1ba6acSHisping Lin 963bb1ba6acSHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 964bb1ba6acSHisping Lin &TeecSession, 965bb1ba6acSHisping Lin TeecUuid, 966bb1ba6acSHisping Lin TEEC_LOGIN_PUBLIC, 967bb1ba6acSHisping Lin NULL, 968bb1ba6acSHisping Lin NULL, 969bb1ba6acSHisping Lin &ErrorOrigin); 970bb1ba6acSHisping Lin if (TeecResult != TEEC_SUCCESS) 971bb1ba6acSHisping Lin return TeecResult; 972bb1ba6acSHisping Lin 973bb1ba6acSHisping Lin TeecOperation.params[0].value.a = key_id; 974bb1ba6acSHisping Lin 975bb1ba6acSHisping Lin TEEC_SharedMemory SharedMem = {0}; 976bb1ba6acSHisping Lin 977bb1ba6acSHisping Lin SharedMem.size = byte_len; 978bb1ba6acSHisping Lin SharedMem.flags = 0; 979bb1ba6acSHisping Lin 980bb1ba6acSHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem); 981bb1ba6acSHisping Lin if (TeecResult != TEEC_SUCCESS) 982bb1ba6acSHisping Lin goto exit; 983bb1ba6acSHisping Lin 984bb1ba6acSHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem.buffer; 985bb1ba6acSHisping Lin TeecOperation.params[1].tmpref.size = SharedMem.size; 986bb1ba6acSHisping Lin 987bb1ba6acSHisping Lin memcpy(SharedMem.buffer, byte_buf, SharedMem.size); 988bb1ba6acSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 989bb1ba6acSHisping Lin TEEC_MEMREF_TEMP_INPUT, 990bb1ba6acSHisping Lin TEEC_NONE, 991bb1ba6acSHisping Lin TEEC_NONE); 992bb1ba6acSHisping Lin 993bb1ba6acSHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 99490e849a0Sxb.wang STORAGE_CMD_WRITE_OEM_OTP_KEY, 995bb1ba6acSHisping Lin &TeecOperation, 996bb1ba6acSHisping Lin &ErrorOrigin); 997bb1ba6acSHisping Lin if (TeecResult != TEEC_SUCCESS) 998bb1ba6acSHisping Lin goto exit; 999bb1ba6acSHisping Lin 1000bb1ba6acSHisping Lin exit: 1001bb1ba6acSHisping Lin TEEC_ReleaseSharedMemory(&SharedMem); 1002bb1ba6acSHisping Lin TEEC_CloseSession(&TeecSession); 1003bb1ba6acSHisping Lin TEEC_FinalizeContext(&TeecContext); 1004bb1ba6acSHisping Lin 1005bb1ba6acSHisping Lin return TeecResult; 1006bb1ba6acSHisping Lin } 1007bb1ba6acSHisping Lin 10089deb34f6SHisping Lin uint32_t trusty_oem_otp_key_is_written(enum RK_OEM_OTP_KEYID key_id, uint8_t *value) 10099deb34f6SHisping Lin { 10109deb34f6SHisping Lin TEEC_Result TeecResult; 10119deb34f6SHisping Lin TEEC_Context TeecContext; 10129deb34f6SHisping Lin TEEC_Session TeecSession; 10139deb34f6SHisping Lin uint32_t ErrorOrigin; 10149deb34f6SHisping Lin 10159deb34f6SHisping Lin *value = 0xFF; 10169deb34f6SHisping Lin 10179deb34f6SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 10189deb34f6SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 10199deb34f6SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 10209deb34f6SHisping Lin TEEC_Operation TeecOperation = {0}; 10219deb34f6SHisping Lin 10229deb34f6SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 10239deb34f6SHisping Lin if (TeecResult != TEEC_SUCCESS) 10249deb34f6SHisping Lin return TeecResult; 10259deb34f6SHisping Lin 10269deb34f6SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 10279deb34f6SHisping Lin if (TeecResult != TEEC_SUCCESS) 10289deb34f6SHisping Lin return TeecResult; 10299deb34f6SHisping Lin 10309deb34f6SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 10319deb34f6SHisping Lin &TeecSession, 10329deb34f6SHisping Lin TeecUuid, 10339deb34f6SHisping Lin TEEC_LOGIN_PUBLIC, 10349deb34f6SHisping Lin NULL, 10359deb34f6SHisping Lin NULL, 10369deb34f6SHisping Lin &ErrorOrigin); 10379deb34f6SHisping Lin if (TeecResult != TEEC_SUCCESS) 10389deb34f6SHisping Lin return TeecResult; 10399deb34f6SHisping Lin 10409deb34f6SHisping Lin TeecOperation.params[0].value.a = key_id; 10419deb34f6SHisping Lin 10429deb34f6SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INOUT, 10439deb34f6SHisping Lin TEEC_NONE, 10449deb34f6SHisping Lin TEEC_NONE, 10459deb34f6SHisping Lin TEEC_NONE); 10469deb34f6SHisping Lin 10479deb34f6SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 10489deb34f6SHisping Lin STORAGE_CMD_OEM_OTP_KEY_IS_WRITTEN, 10499deb34f6SHisping Lin &TeecOperation, 10509deb34f6SHisping Lin &ErrorOrigin); 10519deb34f6SHisping Lin if (TeecResult == TEEC_SUCCESS) 10529deb34f6SHisping Lin *value = TeecOperation.params[0].value.b; 10539deb34f6SHisping Lin 10549deb34f6SHisping Lin TEEC_CloseSession(&TeecSession); 10559deb34f6SHisping Lin TEEC_FinalizeContext(&TeecContext); 10569deb34f6SHisping Lin 10579deb34f6SHisping Lin return TeecResult; 10589deb34f6SHisping Lin } 10599deb34f6SHisping Lin 106090e849a0Sxb.wang uint32_t trusty_set_oem_hr_otp_read_lock(enum RK_OEM_OTP_KEYID key_id) 1061a405238aSHisping Lin { 1062a405238aSHisping Lin TEEC_Result TeecResult; 1063a405238aSHisping Lin TEEC_Context TeecContext; 1064a405238aSHisping Lin TEEC_Session TeecSession; 1065a405238aSHisping Lin uint32_t ErrorOrigin; 1066a405238aSHisping Lin 1067a405238aSHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 1068a405238aSHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 1069a405238aSHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 1070a405238aSHisping Lin TEEC_Operation TeecOperation = {0}; 1071a405238aSHisping Lin 1072a405238aSHisping Lin TeecResult = OpteeClientApiLibInitialize(); 1073a405238aSHisping Lin if (TeecResult != TEEC_SUCCESS) 1074a405238aSHisping Lin return TeecResult; 1075a405238aSHisping Lin 1076a405238aSHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1077a405238aSHisping Lin if (TeecResult != TEEC_SUCCESS) 1078a405238aSHisping Lin return TeecResult; 1079a405238aSHisping Lin 1080a405238aSHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 1081a405238aSHisping Lin &TeecSession, 1082a405238aSHisping Lin TeecUuid, 1083a405238aSHisping Lin TEEC_LOGIN_PUBLIC, 1084a405238aSHisping Lin NULL, 1085a405238aSHisping Lin NULL, 1086a405238aSHisping Lin &ErrorOrigin); 1087a405238aSHisping Lin if (TeecResult != TEEC_SUCCESS) 1088a405238aSHisping Lin return TeecResult; 1089a405238aSHisping Lin 1090a405238aSHisping Lin TeecOperation.params[0].value.a = key_id; 1091a405238aSHisping Lin 1092a405238aSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 1093a405238aSHisping Lin TEEC_NONE, 1094a405238aSHisping Lin TEEC_NONE, 1095a405238aSHisping Lin TEEC_NONE); 1096a405238aSHisping Lin 1097a405238aSHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 1098a405238aSHisping Lin STORAGE_CMD_SET_OEM_HR_OTP_READ_LOCK, 1099a405238aSHisping Lin &TeecOperation, 1100a405238aSHisping Lin &ErrorOrigin); 1101a405238aSHisping Lin if (TeecResult != TEEC_SUCCESS) 1102a405238aSHisping Lin goto exit; 1103a405238aSHisping Lin 1104a405238aSHisping Lin exit: 1105a405238aSHisping Lin TEEC_CloseSession(&TeecSession); 1106a405238aSHisping Lin TEEC_FinalizeContext(&TeecContext); 1107a405238aSHisping Lin 1108a405238aSHisping Lin return TeecResult; 1109a405238aSHisping Lin } 1110a405238aSHisping Lin 11112f8c34bdSxb.wang uint32_t trusty_oem_otp_key_cipher(enum RK_OEM_OTP_KEYID key_id, rk_cipher_config *config, 11122f8c34bdSxb.wang uint32_t src_phys_addr, uint32_t dst_phys_addr, 11132f8c34bdSxb.wang uint32_t len) 1114fc3694d6Sxb.wang { 1115fc3694d6Sxb.wang TEEC_Result TeecResult; 1116fc3694d6Sxb.wang TEEC_Context TeecContext; 1117fc3694d6Sxb.wang TEEC_Session TeecSession; 1118fc3694d6Sxb.wang TEEC_Operation TeecOperation = {0}; 1119fc3694d6Sxb.wang uint32_t ErrorOrigin; 1120fc3694d6Sxb.wang TEEC_UUID uuid = RK_CRYPTO_SERVICE_UUID; 1121fc3694d6Sxb.wang TEEC_SharedMemory SharedMem_config = {0}; 1122fc3694d6Sxb.wang 11232f8c34bdSxb.wang if (key_id != RK_OEM_OTP_KEY0 && 11242f8c34bdSxb.wang key_id != RK_OEM_OTP_KEY1 && 11252f8c34bdSxb.wang key_id != RK_OEM_OTP_KEY2 && 11262f8c34bdSxb.wang key_id != RK_OEM_OTP_KEY3 && 11272f8c34bdSxb.wang key_id != RK_OEM_OTP_KEY_FW) 1128fc3694d6Sxb.wang return TEEC_ERROR_BAD_PARAMETERS; 1129fc3694d6Sxb.wang 11302f8c34bdSxb.wang if (!config) 1131fc3694d6Sxb.wang return TEEC_ERROR_BAD_PARAMETERS; 1132fc3694d6Sxb.wang 1133fc3694d6Sxb.wang if (config->algo != RK_ALGO_AES && config->algo != RK_ALGO_SM4) 1134fc3694d6Sxb.wang return TEEC_ERROR_BAD_PARAMETERS; 1135fc3694d6Sxb.wang 1136fc3694d6Sxb.wang if (config->mode >= RK_CIPHER_MODE_XTS) 1137fc3694d6Sxb.wang return TEEC_ERROR_BAD_PARAMETERS; 1138fc3694d6Sxb.wang 1139fc3694d6Sxb.wang if (config->operation != RK_MODE_ENCRYPT && 1140fc3694d6Sxb.wang config->operation != RK_MODE_DECRYPT) 1141fc3694d6Sxb.wang return TEEC_ERROR_BAD_PARAMETERS; 1142fc3694d6Sxb.wang 1143fc3694d6Sxb.wang if (config->key_len != 16 && 1144fc3694d6Sxb.wang config->key_len != 24 && 1145fc3694d6Sxb.wang config->key_len != 32) 1146fc3694d6Sxb.wang return TEEC_ERROR_BAD_PARAMETERS; 1147fc3694d6Sxb.wang 11482f8c34bdSxb.wang if (key_id == RK_OEM_OTP_KEY_FW && config->key_len != 16) 11492f8c34bdSxb.wang return TEEC_ERROR_BAD_PARAMETERS; 11502f8c34bdSxb.wang 11512f8c34bdSxb.wang #if defined(CONFIG_ROCKCHIP_RV1126) 11522f8c34bdSxb.wang if (config->key_len == 24) 11532f8c34bdSxb.wang return TEEC_ERROR_BAD_PARAMETERS; 11542f8c34bdSxb.wang #endif 11552f8c34bdSxb.wang 1156fc3694d6Sxb.wang if (len % AES_BLOCK_SIZE || 1157fc3694d6Sxb.wang len == 0) 1158fc3694d6Sxb.wang return TEEC_ERROR_BAD_PARAMETERS; 1159fc3694d6Sxb.wang 11602f8c34bdSxb.wang if (!src_phys_addr || !dst_phys_addr) 11612f8c34bdSxb.wang return TEEC_ERROR_BAD_PARAMETERS; 11622f8c34bdSxb.wang 1163fc3694d6Sxb.wang TeecResult = OpteeClientApiLibInitialize(); 1164fc3694d6Sxb.wang if (TeecResult != TEEC_SUCCESS) 1165fc3694d6Sxb.wang return TeecResult; 1166fc3694d6Sxb.wang 1167fc3694d6Sxb.wang TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1168fc3694d6Sxb.wang if (TeecResult != TEEC_SUCCESS) 1169fc3694d6Sxb.wang return TeecResult; 1170fc3694d6Sxb.wang 1171fc3694d6Sxb.wang TeecResult = TEEC_OpenSession(&TeecContext, 1172fc3694d6Sxb.wang &TeecSession, 1173fc3694d6Sxb.wang &uuid, 1174fc3694d6Sxb.wang TEEC_LOGIN_PUBLIC, 1175fc3694d6Sxb.wang NULL, 1176fc3694d6Sxb.wang NULL, 1177fc3694d6Sxb.wang &ErrorOrigin); 1178fc3694d6Sxb.wang if (TeecResult != TEEC_SUCCESS) 1179fc3694d6Sxb.wang goto exit; 1180fc3694d6Sxb.wang 1181fc3694d6Sxb.wang SharedMem_config.size = sizeof(rk_cipher_config); 1182fc3694d6Sxb.wang TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem_config); 1183fc3694d6Sxb.wang if (TeecResult != TEEC_SUCCESS) 1184fc3694d6Sxb.wang goto exit; 1185fc3694d6Sxb.wang 1186fc3694d6Sxb.wang memcpy(SharedMem_config.buffer, config, sizeof(rk_cipher_config)); 1187fc3694d6Sxb.wang TeecOperation.params[0].value.a = key_id; 1188fc3694d6Sxb.wang TeecOperation.params[1].tmpref.buffer = SharedMem_config.buffer; 1189fc3694d6Sxb.wang TeecOperation.params[1].tmpref.size = SharedMem_config.size; 11902f8c34bdSxb.wang TeecOperation.params[2].value.a = src_phys_addr; 11912f8c34bdSxb.wang TeecOperation.params[2].value.b = len; 11922f8c34bdSxb.wang TeecOperation.params[3].value.a = dst_phys_addr; 1193fc3694d6Sxb.wang TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 1194fc3694d6Sxb.wang TEEC_MEMREF_TEMP_INPUT, 11952f8c34bdSxb.wang TEEC_VALUE_INPUT, 11962f8c34bdSxb.wang TEEC_VALUE_INPUT); 11972f8c34bdSxb.wang 11982f8c34bdSxb.wang crypto_flush_cacheline(src_phys_addr, len); 11992f8c34bdSxb.wang crypto_flush_cacheline(dst_phys_addr, len); 12002f8c34bdSxb.wang 1201fc3694d6Sxb.wang TeecResult = TEEC_InvokeCommand(&TeecSession, 12022f8c34bdSxb.wang CRYPTO_SERVICE_CMD_OEM_OTP_KEY_PHYS_CIPHER, 1203fc3694d6Sxb.wang &TeecOperation, 1204fc3694d6Sxb.wang &ErrorOrigin); 1205fc3694d6Sxb.wang 1206a900eef3SHisping Lin crypto_invalidate_cacheline(dst_phys_addr, len); 1207a900eef3SHisping Lin 1208fc3694d6Sxb.wang exit: 1209fc3694d6Sxb.wang TEEC_ReleaseSharedMemory(&SharedMem_config); 1210fc3694d6Sxb.wang TEEC_CloseSession(&TeecSession); 1211fc3694d6Sxb.wang TEEC_FinalizeContext(&TeecContext); 1212fc3694d6Sxb.wang return TeecResult; 1213fc3694d6Sxb.wang } 1214fc3694d6Sxb.wang 1215a828eba9SHisping Lin uint32_t trusty_write_oem_hdcp_key(enum RK_HDCP_KEYID key_id, 1216a828eba9SHisping Lin uint8_t *byte_buf, uint32_t byte_len) 1217a828eba9SHisping Lin { 1218a828eba9SHisping Lin TEEC_Result TeecResult; 1219a828eba9SHisping Lin TEEC_Context TeecContext; 1220a828eba9SHisping Lin TEEC_Session TeecSession; 1221a828eba9SHisping Lin uint32_t ErrorOrigin; 1222a828eba9SHisping Lin 1223a828eba9SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 1224a828eba9SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 1225a828eba9SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 1226a828eba9SHisping Lin TEEC_Operation TeecOperation = {0}; 1227a828eba9SHisping Lin 1228a828eba9SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 1229a828eba9SHisping Lin if (TeecResult != TEEC_SUCCESS) 1230a828eba9SHisping Lin return TeecResult; 1231a828eba9SHisping Lin 1232a828eba9SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1233a828eba9SHisping Lin if (TeecResult != TEEC_SUCCESS) 1234a828eba9SHisping Lin return TeecResult; 1235a828eba9SHisping Lin 1236a828eba9SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 1237a828eba9SHisping Lin &TeecSession, 1238a828eba9SHisping Lin TeecUuid, 1239a828eba9SHisping Lin TEEC_LOGIN_PUBLIC, 1240a828eba9SHisping Lin NULL, 1241a828eba9SHisping Lin NULL, 1242a828eba9SHisping Lin &ErrorOrigin); 1243a828eba9SHisping Lin if (TeecResult != TEEC_SUCCESS) 1244a828eba9SHisping Lin return TeecResult; 1245a828eba9SHisping Lin 1246a828eba9SHisping Lin TeecOperation.params[0].value.a = key_id; 1247a828eba9SHisping Lin 1248a828eba9SHisping Lin TEEC_SharedMemory SharedMem = {0}; 1249a828eba9SHisping Lin 1250a828eba9SHisping Lin SharedMem.size = byte_len; 1251a828eba9SHisping Lin SharedMem.flags = 0; 1252a828eba9SHisping Lin 1253a828eba9SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem); 1254a828eba9SHisping Lin if (TeecResult != TEEC_SUCCESS) 1255a828eba9SHisping Lin goto exit; 1256a828eba9SHisping Lin 1257a828eba9SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem.buffer; 1258a828eba9SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem.size; 1259a828eba9SHisping Lin 1260a828eba9SHisping Lin memcpy(SharedMem.buffer, byte_buf, SharedMem.size); 1261a828eba9SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 1262a828eba9SHisping Lin TEEC_MEMREF_TEMP_INPUT, 1263a828eba9SHisping Lin TEEC_NONE, 1264a828eba9SHisping Lin TEEC_NONE); 1265a828eba9SHisping Lin 1266a828eba9SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 1267a828eba9SHisping Lin STORAGE_CMD_WRITE_OEM_HDCP_KEY, 1268a828eba9SHisping Lin &TeecOperation, 1269a828eba9SHisping Lin &ErrorOrigin); 1270a828eba9SHisping Lin if (TeecResult != TEEC_SUCCESS) 1271a828eba9SHisping Lin goto exit; 1272a828eba9SHisping Lin 1273a828eba9SHisping Lin exit: 1274a828eba9SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem); 1275a828eba9SHisping Lin TEEC_CloseSession(&TeecSession); 1276a828eba9SHisping Lin TEEC_FinalizeContext(&TeecContext); 1277a828eba9SHisping Lin 1278a828eba9SHisping Lin return TeecResult; 1279a828eba9SHisping Lin } 1280a828eba9SHisping Lin 1281e8bc2655SHisping Lin uint32_t trusty_oem_hdcp_key_is_written(enum RK_HDCP_KEYID key_id, uint8_t *value) 1282e8bc2655SHisping Lin { 1283e8bc2655SHisping Lin TEEC_Result TeecResult; 1284e8bc2655SHisping Lin TEEC_Context TeecContext; 1285e8bc2655SHisping Lin TEEC_Session TeecSession; 1286e8bc2655SHisping Lin uint32_t ErrorOrigin; 1287e8bc2655SHisping Lin 1288e8bc2655SHisping Lin *value = 0xFF; 1289e8bc2655SHisping Lin 1290e8bc2655SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 1291e8bc2655SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 1292e8bc2655SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 1293e8bc2655SHisping Lin TEEC_Operation TeecOperation = {0}; 1294e8bc2655SHisping Lin 1295e8bc2655SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 1296e8bc2655SHisping Lin if (TeecResult != TEEC_SUCCESS) 1297e8bc2655SHisping Lin return TeecResult; 1298e8bc2655SHisping Lin 1299e8bc2655SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1300e8bc2655SHisping Lin if (TeecResult != TEEC_SUCCESS) 1301e8bc2655SHisping Lin return TeecResult; 1302e8bc2655SHisping Lin 1303e8bc2655SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 1304e8bc2655SHisping Lin &TeecSession, 1305e8bc2655SHisping Lin TeecUuid, 1306e8bc2655SHisping Lin TEEC_LOGIN_PUBLIC, 1307e8bc2655SHisping Lin NULL, 1308e8bc2655SHisping Lin NULL, 1309e8bc2655SHisping Lin &ErrorOrigin); 1310e8bc2655SHisping Lin if (TeecResult != TEEC_SUCCESS) 1311e8bc2655SHisping Lin return TeecResult; 1312e8bc2655SHisping Lin 1313e8bc2655SHisping Lin TeecOperation.params[0].value.a = key_id; 1314e8bc2655SHisping Lin 1315e8bc2655SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INOUT, 1316e8bc2655SHisping Lin TEEC_NONE, 1317e8bc2655SHisping Lin TEEC_NONE, 1318e8bc2655SHisping Lin TEEC_NONE); 1319e8bc2655SHisping Lin 1320e8bc2655SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 1321e8bc2655SHisping Lin STORAGE_CMD_OEM_HDCP_KEY_IS_WRITTEN, 1322e8bc2655SHisping Lin &TeecOperation, 1323e8bc2655SHisping Lin &ErrorOrigin); 1324e8bc2655SHisping Lin if (TeecResult == TEEC_SUCCESS) 1325e8bc2655SHisping Lin *value = TeecOperation.params[0].value.b; 1326e8bc2655SHisping Lin 1327e8bc2655SHisping Lin TEEC_CloseSession(&TeecSession); 1328e8bc2655SHisping Lin TEEC_FinalizeContext(&TeecContext); 1329e8bc2655SHisping Lin 1330e8bc2655SHisping Lin return TeecResult; 1331e8bc2655SHisping Lin } 1332e8bc2655SHisping Lin 1333bfd9cea4SHisping Lin uint32_t trusty_set_oem_hdcp_key_mask(enum RK_HDCP_KEYID key_id) 1334bfd9cea4SHisping Lin { 1335bfd9cea4SHisping Lin TEEC_Result TeecResult; 1336bfd9cea4SHisping Lin TEEC_Context TeecContext; 1337bfd9cea4SHisping Lin TEEC_Session TeecSession; 1338bfd9cea4SHisping Lin uint32_t ErrorOrigin; 1339bfd9cea4SHisping Lin 1340bfd9cea4SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 1341bfd9cea4SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 1342bfd9cea4SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 1343bfd9cea4SHisping Lin TEEC_Operation TeecOperation = {0}; 1344bfd9cea4SHisping Lin 1345bfd9cea4SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 1346bfd9cea4SHisping Lin if (TeecResult != TEEC_SUCCESS) 1347bfd9cea4SHisping Lin return TeecResult; 1348bfd9cea4SHisping Lin 1349bfd9cea4SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1350bfd9cea4SHisping Lin if (TeecResult != TEEC_SUCCESS) 1351bfd9cea4SHisping Lin return TeecResult; 1352bfd9cea4SHisping Lin 1353bfd9cea4SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 1354bfd9cea4SHisping Lin &TeecSession, 1355bfd9cea4SHisping Lin TeecUuid, 1356bfd9cea4SHisping Lin TEEC_LOGIN_PUBLIC, 1357bfd9cea4SHisping Lin NULL, 1358bfd9cea4SHisping Lin NULL, 1359bfd9cea4SHisping Lin &ErrorOrigin); 1360bfd9cea4SHisping Lin if (TeecResult != TEEC_SUCCESS) 1361bfd9cea4SHisping Lin return TeecResult; 1362bfd9cea4SHisping Lin 1363bfd9cea4SHisping Lin TeecOperation.params[0].value.a = key_id; 1364bfd9cea4SHisping Lin 1365bfd9cea4SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 1366bfd9cea4SHisping Lin TEEC_NONE, 1367bfd9cea4SHisping Lin TEEC_NONE, 1368bfd9cea4SHisping Lin TEEC_NONE); 1369bfd9cea4SHisping Lin 1370bfd9cea4SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 1371bfd9cea4SHisping Lin STORAGE_CMD_SET_OEM_HDCP_KEY_MASK, 1372bfd9cea4SHisping Lin &TeecOperation, 1373bfd9cea4SHisping Lin &ErrorOrigin); 1374bfd9cea4SHisping Lin if (TeecResult != TEEC_SUCCESS) 1375bfd9cea4SHisping Lin goto exit; 1376bfd9cea4SHisping Lin 1377bfd9cea4SHisping Lin exit: 1378bfd9cea4SHisping Lin TEEC_CloseSession(&TeecSession); 1379bfd9cea4SHisping Lin TEEC_FinalizeContext(&TeecContext); 1380bfd9cea4SHisping Lin 1381bfd9cea4SHisping Lin return TeecResult; 1382bfd9cea4SHisping Lin } 1383bfd9cea4SHisping Lin 13844d4c5043SHisping Lin uint32_t trusty_oem_user_ta_transfer(void) 13854d4c5043SHisping Lin { 13864d4c5043SHisping Lin TEEC_Result TeecResult; 13874d4c5043SHisping Lin TEEC_Context TeecContext; 13884d4c5043SHisping Lin TEEC_Session TeecSession; 13894d4c5043SHisping Lin uint32_t ErrorOrigin; 13904d4c5043SHisping Lin TEEC_UUID tempuuid = { 0x1db57234, 0xdacd, 0x462d, 13914d4c5043SHisping Lin { 0x9b, 0xb1, 0xae, 0x79, 0xde, 0x44, 0xe2, 0xa5} }; 13924d4c5043SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 13934d4c5043SHisping Lin TEEC_Operation TeecOperation = {0}; 13944d4c5043SHisping Lin const uint8_t transfer_inout[] = "Transfer data test."; 13954d4c5043SHisping Lin 13964d4c5043SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 13974d4c5043SHisping Lin if (TeecResult != TEEC_SUCCESS) 13984d4c5043SHisping Lin return TeecResult; 13994d4c5043SHisping Lin 14004d4c5043SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 14014d4c5043SHisping Lin if (TeecResult != TEEC_SUCCESS) 14024d4c5043SHisping Lin return TeecResult; 14034d4c5043SHisping Lin 14044d4c5043SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE, 14054d4c5043SHisping Lin TEEC_NONE, 14064d4c5043SHisping Lin TEEC_NONE, 14074d4c5043SHisping Lin TEEC_NONE); 14084d4c5043SHisping Lin 14094d4c5043SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 14104d4c5043SHisping Lin &TeecSession, 14114d4c5043SHisping Lin TeecUuid, 14124d4c5043SHisping Lin TEEC_LOGIN_PUBLIC, 14134d4c5043SHisping Lin NULL, 14144d4c5043SHisping Lin &TeecOperation, 14154d4c5043SHisping Lin &ErrorOrigin); 14164d4c5043SHisping Lin if (TeecResult != TEEC_SUCCESS) 14174d4c5043SHisping Lin return TeecResult; 14184d4c5043SHisping Lin 14194d4c5043SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 14204d4c5043SHisping Lin 14214d4c5043SHisping Lin SharedMem0.size = sizeof(transfer_inout); 14224d4c5043SHisping Lin SharedMem0.flags = 0; 14234d4c5043SHisping Lin 14244d4c5043SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 14254d4c5043SHisping Lin if (TeecResult != TEEC_SUCCESS) 14264d4c5043SHisping Lin goto exit; 14274d4c5043SHisping Lin 14284d4c5043SHisping Lin memcpy(SharedMem0.buffer, transfer_inout, SharedMem0.size); 14294d4c5043SHisping Lin 14304d4c5043SHisping Lin TEEC_SharedMemory SharedMem1 = {0}; 14314d4c5043SHisping Lin 14324d4c5043SHisping Lin SharedMem1.size = sizeof(transfer_inout); 14334d4c5043SHisping Lin SharedMem1.flags = 0; 14344d4c5043SHisping Lin 14354d4c5043SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 14364d4c5043SHisping Lin if (TeecResult != TEEC_SUCCESS) 14374d4c5043SHisping Lin goto exit; 14384d4c5043SHisping Lin 14394d4c5043SHisping Lin TeecOperation.params[0].value.a = 66; 14404d4c5043SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem0.buffer; 14414d4c5043SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem0.size; 14424d4c5043SHisping Lin TeecOperation.params[2].tmpref.buffer = SharedMem1.buffer; 14434d4c5043SHisping Lin TeecOperation.params[2].tmpref.size = SharedMem1.size; 14444d4c5043SHisping Lin 14454d4c5043SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INOUT, 14464d4c5043SHisping Lin TEEC_MEMREF_TEMP_INPUT, 14474d4c5043SHisping Lin TEEC_MEMREF_TEMP_OUTPUT, 14484d4c5043SHisping Lin TEEC_NONE); 14494d4c5043SHisping Lin 14504d4c5043SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 14514d4c5043SHisping Lin 102, 14524d4c5043SHisping Lin &TeecOperation, 14534d4c5043SHisping Lin &ErrorOrigin); 14544d4c5043SHisping Lin if (TeecResult != TEEC_SUCCESS) 14554d4c5043SHisping Lin goto exit; 14564d4c5043SHisping Lin 14574d4c5043SHisping Lin //Check the result 14584d4c5043SHisping Lin if (TeecOperation.params[0].value.a == 66 + 1 && 14594d4c5043SHisping Lin TeecOperation.params[0].value.b == TeecOperation.params[0].value.a) 14604d4c5043SHisping Lin printf("test value : Pass!\n"); 14614d4c5043SHisping Lin else 14624d4c5043SHisping Lin printf("test value : Fail! (mismatch values)\n"); 14634d4c5043SHisping Lin 14644d4c5043SHisping Lin if (memcmp(SharedMem1.buffer, transfer_inout, sizeof(transfer_inout)) == 0) 14654d4c5043SHisping Lin printf("test buffer : Pass!\n"); 14664d4c5043SHisping Lin else 14674d4c5043SHisping Lin printf("test buffer : Fail! (mismatch buffer)\n"); 14684d4c5043SHisping Lin 14694d4c5043SHisping Lin exit: 14704d4c5043SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 14714d4c5043SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem1); 14724d4c5043SHisping Lin TEEC_CloseSession(&TeecSession); 14734d4c5043SHisping Lin TEEC_FinalizeContext(&TeecContext); 14744d4c5043SHisping Lin 14754d4c5043SHisping Lin return TeecResult; 14764d4c5043SHisping Lin } 14774d4c5043SHisping Lin 14784d4c5043SHisping Lin uint32_t trusty_oem_user_ta_storage(void) 14794d4c5043SHisping Lin { 14804d4c5043SHisping Lin TEEC_Result TeecResult; 14814d4c5043SHisping Lin TEEC_Context TeecContext; 14824d4c5043SHisping Lin TEEC_Session TeecSession; 14834d4c5043SHisping Lin uint32_t ErrorOrigin; 14844d4c5043SHisping Lin TEEC_UUID tempuuid = { 0x1db57234, 0xdacd, 0x462d, 14854d4c5043SHisping Lin { 0x9b, 0xb1, 0xae, 0x79, 0xde, 0x44, 0xe2, 0xa5} }; 14864d4c5043SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 14874d4c5043SHisping Lin TEEC_Operation TeecOperation = {0}; 14884d4c5043SHisping Lin 14894d4c5043SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 14904d4c5043SHisping Lin if (TeecResult != TEEC_SUCCESS) 14914d4c5043SHisping Lin return TeecResult; 14924d4c5043SHisping Lin 14934d4c5043SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 14944d4c5043SHisping Lin if (TeecResult != TEEC_SUCCESS) 14954d4c5043SHisping Lin return TeecResult; 14964d4c5043SHisping Lin 14974d4c5043SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE, 14984d4c5043SHisping Lin TEEC_NONE, 14994d4c5043SHisping Lin TEEC_NONE, 15004d4c5043SHisping Lin TEEC_NONE); 15014d4c5043SHisping Lin 15024d4c5043SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 15034d4c5043SHisping Lin &TeecSession, 15044d4c5043SHisping Lin TeecUuid, 15054d4c5043SHisping Lin TEEC_LOGIN_PUBLIC, 15064d4c5043SHisping Lin NULL, 15074d4c5043SHisping Lin &TeecOperation, 15084d4c5043SHisping Lin &ErrorOrigin); 15094d4c5043SHisping Lin if (TeecResult != TEEC_SUCCESS) 15104d4c5043SHisping Lin return TeecResult; 15114d4c5043SHisping Lin 15124d4c5043SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE, 15134d4c5043SHisping Lin TEEC_NONE, 15144d4c5043SHisping Lin TEEC_NONE, 15154d4c5043SHisping Lin TEEC_NONE); 15164d4c5043SHisping Lin 15174d4c5043SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 15184d4c5043SHisping Lin 103, 15194d4c5043SHisping Lin &TeecOperation, 15204d4c5043SHisping Lin &ErrorOrigin); 15214d4c5043SHisping Lin if (TeecResult != TEEC_SUCCESS) 15224d4c5043SHisping Lin goto exit; 15234d4c5043SHisping Lin 15244d4c5043SHisping Lin exit: 15254d4c5043SHisping Lin TEEC_CloseSession(&TeecSession); 15264d4c5043SHisping Lin TEEC_FinalizeContext(&TeecContext); 15274d4c5043SHisping Lin 15284d4c5043SHisping Lin return TeecResult; 15294d4c5043SHisping Lin } 15304d4c5043SHisping Lin 15314aa61755SAndy Ye uint32_t trusty_attest_dh(uint8_t *dh, uint32_t *dh_size) 15324aa61755SAndy Ye { 15334aa61755SAndy Ye TEEC_Result TeecResult; 15344aa61755SAndy Ye TEEC_Context TeecContext; 15354aa61755SAndy Ye TEEC_Session TeecSession; 15364aa61755SAndy Ye uint32_t ErrorOrigin; 15374aa61755SAndy Ye TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6, 15384aa61755SAndy Ye { 0xa8, 0x69, 0x9c, 0xe6, 15394aa61755SAndy Ye 0x88, 0x6c, 0x5d, 0x5d 15404aa61755SAndy Ye } 15414aa61755SAndy Ye }; 15424aa61755SAndy Ye TEEC_UUID *TeecUuid = &tempuuid; 15434aa61755SAndy Ye TEEC_Operation TeecOperation = {0}; 15443251364cSHisping Lin struct blk_desc *dev_desc; 15453251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 15466651d4c0SJason Zhu if (!dev_desc) { 15476651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 15486651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 15496651d4c0SJason Zhu } 15504aa61755SAndy Ye 1551f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 1552f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1553f4e1db95SHisping Lin return TeecResult; 15544aa61755SAndy Ye 15554aa61755SAndy Ye TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1556f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1557f4e1db95SHisping Lin return TeecResult; 15584aa61755SAndy Ye 15593251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 15603251364cSHisping Lin TEEC_NONE, 15613251364cSHisping Lin TEEC_NONE, 15623251364cSHisping Lin TEEC_NONE); 15633251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 1564b9a7e756SHisping Lin if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0) 1565b9a7e756SHisping Lin TeecOperation.params[0].value.a = 1; 1566b9a7e756SHisping Lin else 1567b9a7e756SHisping Lin TeecOperation.params[0].value.a = 0; 1568b9a7e756SHisping Lin 15693251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 15703251364cSHisping Lin TeecOperation.params[0].value.a = 0; 15713251364cSHisping Lin #endif 15723251364cSHisping Lin 15734aa61755SAndy Ye TeecResult = TEEC_OpenSession(&TeecContext, 15744aa61755SAndy Ye &TeecSession, 15754aa61755SAndy Ye TeecUuid, 15764aa61755SAndy Ye TEEC_LOGIN_PUBLIC, 15774aa61755SAndy Ye NULL, 15783251364cSHisping Lin &TeecOperation, 15794aa61755SAndy Ye &ErrorOrigin); 1580f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1581f4e1db95SHisping Lin return TeecResult; 15824aa61755SAndy Ye 15834aa61755SAndy Ye TEEC_SharedMemory SharedMem0 = {0}; 15844aa61755SAndy Ye 15854aa61755SAndy Ye SharedMem0.size = *dh_size; 15864aa61755SAndy Ye SharedMem0.flags = 0; 15874aa61755SAndy Ye 15884aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 1589f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1590f4e1db95SHisping Lin goto exit; 15914aa61755SAndy Ye 15924aa61755SAndy Ye TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 15934aa61755SAndy Ye TeecOperation.params[0].tmpref.size = SharedMem0.size; 15944aa61755SAndy Ye 15954aa61755SAndy Ye TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, 15964aa61755SAndy Ye TEEC_NONE, 15974aa61755SAndy Ye TEEC_NONE, 15984aa61755SAndy Ye TEEC_NONE); 15994aa61755SAndy Ye 16004aa61755SAndy Ye TeecResult = TEEC_InvokeCommand(&TeecSession, 16014aa61755SAndy Ye 143, 16024aa61755SAndy Ye &TeecOperation, 16034aa61755SAndy Ye &ErrorOrigin); 1604f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1605f4e1db95SHisping Lin goto exit; 16064aa61755SAndy Ye 16074aa61755SAndy Ye *dh_size = TeecOperation.params[0].tmpref.size; 16084aa61755SAndy Ye memcpy(dh, SharedMem0.buffer, SharedMem0.size); 1609f4e1db95SHisping Lin exit: 16104aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem0); 16114aa61755SAndy Ye TEEC_CloseSession(&TeecSession); 1612f4e1db95SHisping Lin TEEC_FinalizeContext(&TeecContext); 16134aa61755SAndy Ye 16144aa61755SAndy Ye return TeecResult; 16154aa61755SAndy Ye } 16164aa61755SAndy Ye 16174aa61755SAndy Ye uint32_t trusty_attest_uuid(uint8_t *uuid, uint32_t *uuid_size) 16184aa61755SAndy Ye { 16194aa61755SAndy Ye TEEC_Result TeecResult; 16204aa61755SAndy Ye TEEC_Context TeecContext; 16214aa61755SAndy Ye TEEC_Session TeecSession; 16224aa61755SAndy Ye uint32_t ErrorOrigin; 16234aa61755SAndy Ye TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6, 16244aa61755SAndy Ye { 0xa8, 0x69, 0x9c, 0xe6, 16254aa61755SAndy Ye 0x88, 0x6c, 0x5d, 0x5d 16264aa61755SAndy Ye } 16274aa61755SAndy Ye }; 16284aa61755SAndy Ye TEEC_UUID *TeecUuid = &tempuuid; 16294aa61755SAndy Ye TEEC_Operation TeecOperation = {0}; 16303251364cSHisping Lin struct blk_desc *dev_desc; 16313251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 16326651d4c0SJason Zhu if (!dev_desc) { 16336651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 16346651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 16356651d4c0SJason Zhu } 16364aa61755SAndy Ye 1637f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 1638f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1639f4e1db95SHisping Lin return TeecResult; 16404aa61755SAndy Ye 16414aa61755SAndy Ye TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1642f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1643f4e1db95SHisping Lin return TeecResult; 16444aa61755SAndy Ye 16453251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 16463251364cSHisping Lin TEEC_NONE, 16473251364cSHisping Lin TEEC_NONE, 16483251364cSHisping Lin TEEC_NONE); 16493251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 1650b9a7e756SHisping Lin if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0) 1651b9a7e756SHisping Lin TeecOperation.params[0].value.a = 1; 1652b9a7e756SHisping Lin else 1653b9a7e756SHisping Lin TeecOperation.params[0].value.a = 0; 1654b9a7e756SHisping Lin 16553251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 16563251364cSHisping Lin TeecOperation.params[0].value.a = 0; 16573251364cSHisping Lin #endif 16583251364cSHisping Lin 16594aa61755SAndy Ye TeecResult = TEEC_OpenSession(&TeecContext, 16604aa61755SAndy Ye &TeecSession, 16614aa61755SAndy Ye TeecUuid, 16624aa61755SAndy Ye TEEC_LOGIN_PUBLIC, 16634aa61755SAndy Ye NULL, 16643251364cSHisping Lin &TeecOperation, 16654aa61755SAndy Ye &ErrorOrigin); 1666f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1667f4e1db95SHisping Lin return TeecResult; 16684aa61755SAndy Ye 16694aa61755SAndy Ye TEEC_SharedMemory SharedMem0 = {0}; 16704aa61755SAndy Ye 16714aa61755SAndy Ye SharedMem0.size = *uuid_size; 16724aa61755SAndy Ye SharedMem0.flags = 0; 16734aa61755SAndy Ye 16744aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 1675f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1676f4e1db95SHisping Lin goto exit; 16774aa61755SAndy Ye 16784aa61755SAndy Ye TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 16794aa61755SAndy Ye TeecOperation.params[0].tmpref.size = SharedMem0.size; 16804aa61755SAndy Ye 16814aa61755SAndy Ye TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, 16824aa61755SAndy Ye TEEC_NONE, 16834aa61755SAndy Ye TEEC_NONE, 16844aa61755SAndy Ye TEEC_NONE); 16854aa61755SAndy Ye 16864aa61755SAndy Ye TeecResult = TEEC_InvokeCommand(&TeecSession, 16874aa61755SAndy Ye 144, 16884aa61755SAndy Ye &TeecOperation, 16894aa61755SAndy Ye &ErrorOrigin); 1690f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1691f4e1db95SHisping Lin goto exit; 16924aa61755SAndy Ye 16934aa61755SAndy Ye *uuid_size = TeecOperation.params[0].tmpref.size; 16944aa61755SAndy Ye memcpy(uuid, SharedMem0.buffer, SharedMem0.size); 1695f4e1db95SHisping Lin exit: 16964aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem0); 16974aa61755SAndy Ye TEEC_CloseSession(&TeecSession); 1698f4e1db95SHisping Lin TEEC_FinalizeContext(&TeecContext); 16994aa61755SAndy Ye 17004aa61755SAndy Ye return TeecResult; 17014aa61755SAndy Ye } 17024aa61755SAndy Ye 17034aa61755SAndy Ye uint32_t trusty_attest_get_ca(uint8_t *operation_start, 17044aa61755SAndy Ye uint32_t *operation_size, 17054aa61755SAndy Ye uint8_t *out, 17064aa61755SAndy Ye uint32_t *out_len) 17074aa61755SAndy Ye { 17084aa61755SAndy Ye TEEC_Result TeecResult; 17094aa61755SAndy Ye TEEC_Context TeecContext; 17104aa61755SAndy Ye TEEC_Session TeecSession; 17114aa61755SAndy Ye uint32_t ErrorOrigin; 17124aa61755SAndy Ye 17134aa61755SAndy Ye TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6, 17144aa61755SAndy Ye { 0xa8, 0x69, 0x9c, 0xe6, 17154aa61755SAndy Ye 0x88, 0x6c, 0x5d, 0x5d 17164aa61755SAndy Ye } 17174aa61755SAndy Ye }; 17184aa61755SAndy Ye 17194aa61755SAndy Ye TEEC_UUID *TeecUuid = &tempuuid; 17204aa61755SAndy Ye TEEC_Operation TeecOperation = {0}; 17213251364cSHisping Lin struct blk_desc *dev_desc; 17223251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 17236651d4c0SJason Zhu if (!dev_desc) { 17246651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 17256651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 17266651d4c0SJason Zhu } 17274aa61755SAndy Ye 1728f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 1729f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1730f4e1db95SHisping Lin return TeecResult; 17314aa61755SAndy Ye 17324aa61755SAndy Ye TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1733f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1734f4e1db95SHisping Lin return TeecResult; 17354aa61755SAndy Ye 17363251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 17373251364cSHisping Lin TEEC_NONE, 17383251364cSHisping Lin TEEC_NONE, 17393251364cSHisping Lin TEEC_NONE); 17403251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 1741b9a7e756SHisping Lin if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0) 1742b9a7e756SHisping Lin TeecOperation.params[0].value.a = 1; 1743b9a7e756SHisping Lin else 1744b9a7e756SHisping Lin TeecOperation.params[0].value.a = 0; 1745b9a7e756SHisping Lin 17463251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 17473251364cSHisping Lin TeecOperation.params[0].value.a = 0; 17483251364cSHisping Lin #endif 17493251364cSHisping Lin 17504aa61755SAndy Ye TeecResult = TEEC_OpenSession(&TeecContext, 17514aa61755SAndy Ye &TeecSession, 17524aa61755SAndy Ye TeecUuid, 17534aa61755SAndy Ye TEEC_LOGIN_PUBLIC, 17544aa61755SAndy Ye NULL, 17553251364cSHisping Lin &TeecOperation, 17564aa61755SAndy Ye &ErrorOrigin); 1757f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1758f4e1db95SHisping Lin return TeecResult; 17594aa61755SAndy Ye 17604aa61755SAndy Ye TEEC_SharedMemory SharedMem0 = {0}; 17614aa61755SAndy Ye 17624aa61755SAndy Ye SharedMem0.size = *operation_size; 17634aa61755SAndy Ye SharedMem0.flags = 0; 17644aa61755SAndy Ye 17654aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 1766f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1767f4e1db95SHisping Lin goto exit; 17684aa61755SAndy Ye 17694aa61755SAndy Ye memcpy(SharedMem0.buffer, operation_start, SharedMem0.size); 17704aa61755SAndy Ye 17714aa61755SAndy Ye TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 17724aa61755SAndy Ye TeecOperation.params[0].tmpref.size = SharedMem0.size; 17734aa61755SAndy Ye 17744aa61755SAndy Ye TEEC_SharedMemory SharedMem1 = {0}; 17754aa61755SAndy Ye 17764aa61755SAndy Ye SharedMem1.size = *out_len; 17774aa61755SAndy Ye SharedMem1.flags = 0; 17784aa61755SAndy Ye 17794aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 1780f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1781f4e1db95SHisping Lin goto exit; 17824aa61755SAndy Ye 17834aa61755SAndy Ye TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 17844aa61755SAndy Ye TeecOperation.params[1].tmpref.size = SharedMem1.size; 17854aa61755SAndy Ye 17864aa61755SAndy Ye TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, 17874aa61755SAndy Ye TEEC_MEMREF_TEMP_INOUT, 17884aa61755SAndy Ye TEEC_NONE, 17894aa61755SAndy Ye TEEC_NONE); 17904aa61755SAndy Ye 17914aa61755SAndy Ye TeecResult = TEEC_InvokeCommand(&TeecSession, 17924aa61755SAndy Ye 145, 17934aa61755SAndy Ye &TeecOperation, 17944aa61755SAndy Ye &ErrorOrigin); 1795f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1796f4e1db95SHisping Lin goto exit; 17974aa61755SAndy Ye 17984aa61755SAndy Ye *out_len = TeecOperation.params[1].tmpref.size; 17994aa61755SAndy Ye memcpy(out, SharedMem1.buffer, SharedMem1.size); 1800f4e1db95SHisping Lin exit: 18014aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem0); 18024aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem1); 1803f4e1db95SHisping Lin TEEC_CloseSession(&TeecSession); 1804f4e1db95SHisping Lin TEEC_FinalizeContext(&TeecContext); 18054aa61755SAndy Ye 18064aa61755SAndy Ye return TeecResult; 18074aa61755SAndy Ye } 18084aa61755SAndy Ye 18094aa61755SAndy Ye uint32_t trusty_attest_set_ca(uint8_t *ca_response, uint32_t *ca_response_size) 18104aa61755SAndy Ye { 18114aa61755SAndy Ye TEEC_Result TeecResult; 18124aa61755SAndy Ye TEEC_Context TeecContext; 18134aa61755SAndy Ye TEEC_Session TeecSession; 18144aa61755SAndy Ye uint32_t ErrorOrigin; 18154aa61755SAndy Ye TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6, 18164aa61755SAndy Ye { 0xa8, 0x69, 0x9c, 0xe6, 18174aa61755SAndy Ye 0x88, 0x6c, 0x5d, 0x5d 18184aa61755SAndy Ye } 18194aa61755SAndy Ye }; 18204aa61755SAndy Ye TEEC_UUID *TeecUuid = &tempuuid; 18214aa61755SAndy Ye TEEC_Operation TeecOperation = {0}; 18223251364cSHisping Lin struct blk_desc *dev_desc; 18233251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 18246651d4c0SJason Zhu if (!dev_desc) { 18256651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 18266651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 18276651d4c0SJason Zhu } 1828f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 1829f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1830f4e1db95SHisping Lin return TeecResult; 18314aa61755SAndy Ye 18324aa61755SAndy Ye TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1833f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1834f4e1db95SHisping Lin return TeecResult; 18354aa61755SAndy Ye 18363251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 18373251364cSHisping Lin TEEC_NONE, 18383251364cSHisping Lin TEEC_NONE, 18393251364cSHisping Lin TEEC_NONE); 18403251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 1841b9a7e756SHisping Lin if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0) 1842b9a7e756SHisping Lin TeecOperation.params[0].value.a = 1; 1843b9a7e756SHisping Lin else 1844b9a7e756SHisping Lin TeecOperation.params[0].value.a = 0; 1845b9a7e756SHisping Lin 18463251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 18473251364cSHisping Lin TeecOperation.params[0].value.a = 0; 18483251364cSHisping Lin #endif 18493251364cSHisping Lin 18504aa61755SAndy Ye TeecResult = TEEC_OpenSession(&TeecContext, 18514aa61755SAndy Ye &TeecSession, 18524aa61755SAndy Ye TeecUuid, 18534aa61755SAndy Ye TEEC_LOGIN_PUBLIC, 18544aa61755SAndy Ye NULL, 18553251364cSHisping Lin &TeecOperation, 18564aa61755SAndy Ye &ErrorOrigin); 1857f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1858f4e1db95SHisping Lin return TeecResult; 18594aa61755SAndy Ye 18604aa61755SAndy Ye TEEC_SharedMemory SharedMem0 = {0}; 18614aa61755SAndy Ye 18624aa61755SAndy Ye SharedMem0.size = *ca_response_size; 18634aa61755SAndy Ye SharedMem0.flags = 0; 18644aa61755SAndy Ye 18654aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 1866f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1867f4e1db95SHisping Lin goto exit; 18684aa61755SAndy Ye 18694aa61755SAndy Ye memcpy(SharedMem0.buffer, ca_response, SharedMem0.size); 18704aa61755SAndy Ye 18714aa61755SAndy Ye TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 18724aa61755SAndy Ye TeecOperation.params[0].tmpref.size = SharedMem0.size; 18734aa61755SAndy Ye 18744aa61755SAndy Ye TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, 18754aa61755SAndy Ye TEEC_NONE, 18764aa61755SAndy Ye TEEC_NONE, 18774aa61755SAndy Ye TEEC_NONE); 18784aa61755SAndy Ye 18794aa61755SAndy Ye TeecResult = TEEC_InvokeCommand(&TeecSession, 18804aa61755SAndy Ye 146, 18814aa61755SAndy Ye &TeecOperation, 18824aa61755SAndy Ye &ErrorOrigin); 1883f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1884f4e1db95SHisping Lin goto exit; 1885f4e1db95SHisping Lin exit: 18864aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem0); 18874aa61755SAndy Ye TEEC_CloseSession(&TeecSession); 1888f4e1db95SHisping Lin TEEC_FinalizeContext(&TeecContext); 18894aa61755SAndy Ye 18904aa61755SAndy Ye return TeecResult; 18914aa61755SAndy Ye } 1892