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 38ac6d8253SHisping Lin #define STORAGE_CMD_WRITE_ESCK_KEY 27 39ac6d8253SHisping Lin #define STORAGE_CMD_ESCK_KEY_IS_WRITTEN 28 40ac6d8253SHisping Lin #define STORAGE_CMD_SET_ESCK_KEY_MASK 29 41*11b25801SHisping Lin #define STORAGE_CMD_WRITE_FW_ENCRYPT_KEY 30 42*11b25801SHisping Lin #define STORAGE_CMD_FW_ENCRYPT_KEY_IS_WRITTEN 31 43*11b25801SHisping Lin #define STORAGE_CMD_SET_FW_ENCRYPT_KEY_MASK 32 44ae8ec5e1SHisping Lin 452f8c34bdSxb.wang #define CRYPTO_SERVICE_CMD_OEM_OTP_KEY_PHYS_CIPHER 0x00000002 46fc3694d6Sxb.wang 47fc3694d6Sxb.wang #define RK_CRYPTO_SERVICE_UUID { 0x0cacdb5d, 0x4fea, 0x466c, \ 48fc3694d6Sxb.wang { 0x97, 0x16, 0x3d, 0x54, 0x16, 0x52, 0x83, 0x0f } } 49fc3694d6Sxb.wang 50ae8ec5e1SHisping Lin static uint8_t b2hs_add_base(uint8_t in) 51ae8ec5e1SHisping Lin { 52ae8ec5e1SHisping Lin if (in > 9) 53ae8ec5e1SHisping Lin return in + 55; 54ae8ec5e1SHisping Lin else 55ae8ec5e1SHisping Lin return in + 48; 56ae8ec5e1SHisping Lin } 57ae8ec5e1SHisping Lin 58c7de5349SHisping Lin static uint32_t b2hs(uint8_t *b, uint8_t *hs, uint32_t blen, uint32_t hslen) 59ae8ec5e1SHisping Lin { 60ae8ec5e1SHisping Lin uint32_t i = 0; 61ae8ec5e1SHisping Lin 62ae8ec5e1SHisping Lin if (blen * 2 + 1 > hslen) 63ae8ec5e1SHisping Lin return 0; 64ae8ec5e1SHisping Lin 65ae8ec5e1SHisping Lin for (; i < blen; i++) { 66ae8ec5e1SHisping Lin hs[i * 2 + 1] = b2hs_add_base(b[i] & 0xf); 67ae8ec5e1SHisping Lin hs[i * 2] = b2hs_add_base(b[i] >> 4); 68ae8ec5e1SHisping Lin } 69ae8ec5e1SHisping Lin hs[blen * 2] = 0; 70ae8ec5e1SHisping Lin 71ae8ec5e1SHisping Lin return blen * 2; 72ae8ec5e1SHisping Lin } 73ae8ec5e1SHisping Lin 742f8c34bdSxb.wang static void crypto_flush_cacheline(uint32_t addr, uint32_t size) 752f8c34bdSxb.wang { 762f8c34bdSxb.wang ulong alignment = CONFIG_SYS_CACHELINE_SIZE; 772f8c34bdSxb.wang ulong aligned_input, aligned_len; 782f8c34bdSxb.wang 792f8c34bdSxb.wang if (!addr || !size) 802f8c34bdSxb.wang return; 812f8c34bdSxb.wang 822f8c34bdSxb.wang /* Must flush dcache before crypto DMA fetch data region */ 832f8c34bdSxb.wang aligned_input = round_down(addr, alignment); 842f8c34bdSxb.wang aligned_len = round_up(size + (addr - aligned_input), alignment); 852f8c34bdSxb.wang flush_cache(aligned_input, aligned_len); 862f8c34bdSxb.wang } 872f8c34bdSxb.wang 88a900eef3SHisping Lin static void crypto_invalidate_cacheline(uint32_t addr, uint32_t size) 89a900eef3SHisping Lin { 90a900eef3SHisping Lin ulong alignment = CONFIG_SYS_CACHELINE_SIZE; 91a900eef3SHisping Lin ulong aligned_input, aligned_len; 92a900eef3SHisping Lin 93a900eef3SHisping Lin if (!addr || !size) 94a900eef3SHisping Lin return; 95a900eef3SHisping Lin 96a900eef3SHisping Lin /* Must invalidate dcache after crypto DMA write data region */ 97a900eef3SHisping Lin aligned_input = round_down(addr, alignment); 98a900eef3SHisping Lin aligned_len = round_up(size + (addr - aligned_input), alignment); 99a900eef3SHisping Lin invalidate_dcache_range(aligned_input, aligned_input + aligned_len); 100a900eef3SHisping Lin } 101a900eef3SHisping Lin 102c7de5349SHisping Lin static uint32_t trusty_base_write_security_data(char *filename, 103c7de5349SHisping Lin uint32_t filename_size, 104c7de5349SHisping Lin uint8_t *data, 105c7de5349SHisping Lin uint32_t data_size) 106ae8ec5e1SHisping Lin { 107ae8ec5e1SHisping Lin TEEC_Result TeecResult; 108ae8ec5e1SHisping Lin TEEC_Context TeecContext; 109ae8ec5e1SHisping Lin TEEC_Session TeecSession; 110ae8ec5e1SHisping Lin uint32_t ErrorOrigin; 111ae8ec5e1SHisping Lin TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 112ae8ec5e1SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 113ae8ec5e1SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 114ae8ec5e1SHisping Lin TEEC_Operation TeecOperation = {0}; 1153251364cSHisping Lin struct blk_desc *dev_desc; 1163251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 1176651d4c0SJason Zhu if (!dev_desc) { 1186651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 1196651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 1206651d4c0SJason Zhu } 1213251364cSHisping Lin 122f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 123f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 124f4e1db95SHisping Lin return TeecResult; 125ae8ec5e1SHisping Lin 126ae8ec5e1SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 127f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 128f4e1db95SHisping Lin return TeecResult; 129ae8ec5e1SHisping Lin 1303251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 1313251364cSHisping Lin TEEC_NONE, 1323251364cSHisping Lin TEEC_NONE, 1333251364cSHisping Lin TEEC_NONE); 1343251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 135f3c7fe23SHisping Lin if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)//emmc 136f3c7fe23SHisping Lin TeecOperation.params[0].value.a = 1; 137f3c7fe23SHisping Lin else if (dev_desc->if_type == IF_TYPE_SCSI)//ufs 138b9a7e756SHisping Lin TeecOperation.params[0].value.a = 1; 139b9a7e756SHisping Lin else 140b9a7e756SHisping Lin TeecOperation.params[0].value.a = 0; 141f3c7fe23SHisping Lin 1423251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 1433251364cSHisping Lin TeecOperation.params[0].value.a = 0; 1443251364cSHisping Lin #endif 1453251364cSHisping Lin 146ae8ec5e1SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 147ae8ec5e1SHisping Lin &TeecSession, 148ae8ec5e1SHisping Lin TeecUuid, 149ae8ec5e1SHisping Lin TEEC_LOGIN_PUBLIC, 150ae8ec5e1SHisping Lin NULL, 1513251364cSHisping Lin &TeecOperation, 152ae8ec5e1SHisping Lin &ErrorOrigin); 153f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 154f4e1db95SHisping Lin return TeecResult; 155ae8ec5e1SHisping Lin 156ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 157ae8ec5e1SHisping Lin 158c7de5349SHisping Lin SharedMem0.size = filename_size; 159ae8ec5e1SHisping Lin SharedMem0.flags = 0; 160ae8ec5e1SHisping Lin 161ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 162f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 163f4e1db95SHisping Lin goto exit; 164ae8ec5e1SHisping Lin 165c7de5349SHisping Lin memcpy(SharedMem0.buffer, filename, SharedMem0.size); 166ae8ec5e1SHisping Lin 167ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem1 = {0}; 168ae8ec5e1SHisping Lin 169c7de5349SHisping Lin SharedMem1.size = data_size; 170c7de5349SHisping Lin SharedMem1.flags = 0; 171c7de5349SHisping Lin 172c7de5349SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 173c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 174c7de5349SHisping Lin goto exit; 175c7de5349SHisping Lin 176c7de5349SHisping Lin memcpy(SharedMem1.buffer, data, SharedMem1.size); 177c7de5349SHisping Lin 178c7de5349SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 179c7de5349SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 180c7de5349SHisping Lin 181c7de5349SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 182c7de5349SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem1.size; 183c7de5349SHisping Lin 184c7de5349SHisping Lin 185c7de5349SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 186c7de5349SHisping Lin TEEC_MEMREF_TEMP_INOUT, 187c7de5349SHisping Lin TEEC_NONE, 188c7de5349SHisping Lin TEEC_NONE); 189c7de5349SHisping Lin 190c7de5349SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 191c7de5349SHisping Lin 1, 192c7de5349SHisping Lin &TeecOperation, 193c7de5349SHisping Lin &ErrorOrigin); 194c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 195c7de5349SHisping Lin goto exit; 196c7de5349SHisping Lin exit: 197c7de5349SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 198c7de5349SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem1); 199c7de5349SHisping Lin TEEC_CloseSession(&TeecSession); 200c7de5349SHisping Lin TEEC_FinalizeContext(&TeecContext); 201c7de5349SHisping Lin 202c7de5349SHisping Lin return TeecResult; 203c7de5349SHisping Lin } 204c7de5349SHisping Lin 205c7de5349SHisping Lin static uint32_t trusty_base_read_security_data(char *filename, 206c7de5349SHisping Lin uint32_t filename_size, 207c7de5349SHisping Lin uint8_t *data, 208c7de5349SHisping Lin uint32_t data_size) 209c7de5349SHisping Lin { 210c7de5349SHisping Lin TEEC_Result TeecResult; 211c7de5349SHisping Lin TEEC_Context TeecContext; 212c7de5349SHisping Lin TEEC_Session TeecSession; 213c7de5349SHisping Lin uint32_t ErrorOrigin; 214c7de5349SHisping Lin TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 215c7de5349SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 216c7de5349SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 217c7de5349SHisping Lin TEEC_Operation TeecOperation = {0}; 218c7de5349SHisping Lin 219c7de5349SHisping Lin struct blk_desc *dev_desc; 220c7de5349SHisping Lin dev_desc = rockchip_get_bootdev(); 221c7de5349SHisping Lin if (!dev_desc) { 222c7de5349SHisping Lin printf("%s: dev_desc is NULL!\n", __func__); 223c7de5349SHisping Lin return -TEEC_ERROR_GENERIC; 224c7de5349SHisping Lin } 225c7de5349SHisping Lin 226c7de5349SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 227c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 228c7de5349SHisping Lin return TeecResult; 229c7de5349SHisping Lin 230c7de5349SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 231c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 232c7de5349SHisping Lin return TeecResult; 233c7de5349SHisping Lin 234c7de5349SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 235c7de5349SHisping Lin TEEC_NONE, 236c7de5349SHisping Lin TEEC_NONE, 237c7de5349SHisping Lin TEEC_NONE); 238c7de5349SHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 239f3c7fe23SHisping Lin if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)//emmc 240f3c7fe23SHisping Lin TeecOperation.params[0].value.a = 1; 241f3c7fe23SHisping Lin else if (dev_desc->if_type == IF_TYPE_SCSI)//ufs 242c7de5349SHisping Lin TeecOperation.params[0].value.a = 1; 243c7de5349SHisping Lin else 244c7de5349SHisping Lin TeecOperation.params[0].value.a = 0; 245f3c7fe23SHisping Lin 246c7de5349SHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 247c7de5349SHisping Lin TeecOperation.params[0].value.a = 0; 248c7de5349SHisping Lin #endif 249c7de5349SHisping Lin 250c7de5349SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 251c7de5349SHisping Lin &TeecSession, 252c7de5349SHisping Lin TeecUuid, 253c7de5349SHisping Lin TEEC_LOGIN_PUBLIC, 254c7de5349SHisping Lin NULL, 255c7de5349SHisping Lin &TeecOperation, 256c7de5349SHisping Lin &ErrorOrigin); 257c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 258c7de5349SHisping Lin return TeecResult; 259c7de5349SHisping Lin 260c7de5349SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 261c7de5349SHisping Lin 262c7de5349SHisping Lin SharedMem0.size = filename_size; 263c7de5349SHisping Lin SharedMem0.flags = 0; 264c7de5349SHisping Lin 265c7de5349SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 266c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 267c7de5349SHisping Lin goto exit; 268c7de5349SHisping Lin 269c7de5349SHisping Lin memcpy(SharedMem0.buffer, filename, SharedMem0.size); 270c7de5349SHisping Lin 271c7de5349SHisping Lin TEEC_SharedMemory SharedMem1 = {0}; 272c7de5349SHisping Lin 273c7de5349SHisping Lin SharedMem1.size = data_size; 274ae8ec5e1SHisping Lin SharedMem1.flags = 0; 275ae8ec5e1SHisping Lin 276ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 277f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 278f4e1db95SHisping Lin goto exit; 279ae8ec5e1SHisping Lin 280ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 281ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 282ae8ec5e1SHisping Lin 283ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 284ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem1.size; 285ae8ec5e1SHisping Lin 286ae8ec5e1SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 287ae8ec5e1SHisping Lin TEEC_MEMREF_TEMP_INOUT, 288ae8ec5e1SHisping Lin TEEC_NONE, 289ae8ec5e1SHisping Lin TEEC_NONE); 290ae8ec5e1SHisping Lin 291ae8ec5e1SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 292ae8ec5e1SHisping Lin 0, 293ae8ec5e1SHisping Lin &TeecOperation, 294ae8ec5e1SHisping Lin &ErrorOrigin); 29546b2a054SHisping Lin if (TeecResult == TEEC_SUCCESS) 296c7de5349SHisping Lin memcpy(data, SharedMem1.buffer, SharedMem1.size); 297f4e1db95SHisping Lin exit: 298ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 299ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem1); 300ae8ec5e1SHisping Lin TEEC_CloseSession(&TeecSession); 30146b2a054SHisping Lin TEEC_FinalizeContext(&TeecContext); 302ae8ec5e1SHisping Lin 303ae8ec5e1SHisping Lin return TeecResult; 304ae8ec5e1SHisping Lin } 305ae8ec5e1SHisping Lin 306c7de5349SHisping Lin static uint32_t trusty_base_end_security_data(void) 307c7de5349SHisping Lin { 308c7de5349SHisping Lin TEEC_Result TeecResult; 309c7de5349SHisping Lin TEEC_Context TeecContext; 310c7de5349SHisping Lin TEEC_Session TeecSession; 311c7de5349SHisping Lin uint32_t ErrorOrigin; 312c7de5349SHisping Lin TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 313c7de5349SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 314c7de5349SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 315c7de5349SHisping Lin TEEC_Operation TeecOperation = {0}; 316c7de5349SHisping Lin 317c7de5349SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 318c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 319c7de5349SHisping Lin return TeecResult; 320c7de5349SHisping Lin 321c7de5349SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 322c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 323c7de5349SHisping Lin return TeecResult; 324c7de5349SHisping Lin 325c7de5349SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 326c7de5349SHisping Lin &TeecSession, 327c7de5349SHisping Lin TeecUuid, 328c7de5349SHisping Lin TEEC_LOGIN_PUBLIC, 329c7de5349SHisping Lin NULL, 330c7de5349SHisping Lin NULL, 331c7de5349SHisping Lin &ErrorOrigin); 332c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 333c7de5349SHisping Lin return TeecResult; 334c7de5349SHisping Lin 335c7de5349SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE, 336c7de5349SHisping Lin TEEC_NONE, 337c7de5349SHisping Lin TEEC_NONE, 338c7de5349SHisping Lin TEEC_NONE); 339c7de5349SHisping Lin 340c7de5349SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 341c7de5349SHisping Lin 2, 342c7de5349SHisping Lin &TeecOperation, 343c7de5349SHisping Lin &ErrorOrigin); 344c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 345c7de5349SHisping Lin goto exit; 346c7de5349SHisping Lin exit: 347c7de5349SHisping Lin TEEC_CloseSession(&TeecSession); 348c7de5349SHisping Lin TEEC_FinalizeContext(&TeecContext); 349c7de5349SHisping Lin 350c7de5349SHisping Lin return TeecResult; 351c7de5349SHisping Lin } 352c7de5349SHisping Lin 35334f2e8f6SHisping Lin static void trusty_notify_always_use_security(void) 35434f2e8f6SHisping Lin { 35534f2e8f6SHisping Lin #if defined(CONFIG_OPTEE_V2) && defined(CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION) 35634f2e8f6SHisping Lin TEEC_Result TeecResult; 35734f2e8f6SHisping Lin TEEC_Context TeecContext; 35834f2e8f6SHisping Lin TEEC_Session TeecSession; 35934f2e8f6SHisping Lin uint32_t ErrorOrigin; 36034f2e8f6SHisping Lin TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 36134f2e8f6SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 36234f2e8f6SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 36334f2e8f6SHisping Lin TEEC_Operation TeecOperation = {0}; 36434f2e8f6SHisping Lin 36534f2e8f6SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 36634f2e8f6SHisping Lin if (TeecResult != TEEC_SUCCESS) 36734f2e8f6SHisping Lin return; 36834f2e8f6SHisping Lin 36934f2e8f6SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 37034f2e8f6SHisping Lin if (TeecResult != TEEC_SUCCESS) 37134f2e8f6SHisping Lin return; 37234f2e8f6SHisping Lin 37334f2e8f6SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 37434f2e8f6SHisping Lin &TeecSession, 37534f2e8f6SHisping Lin TeecUuid, 37634f2e8f6SHisping Lin TEEC_LOGIN_PUBLIC, 37734f2e8f6SHisping Lin NULL, 37834f2e8f6SHisping Lin NULL, 37934f2e8f6SHisping Lin &ErrorOrigin); 38034f2e8f6SHisping Lin if (TeecResult != TEEC_SUCCESS) 38134f2e8f6SHisping Lin return; 38234f2e8f6SHisping Lin 38334f2e8f6SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE, 38434f2e8f6SHisping Lin TEEC_NONE, 38534f2e8f6SHisping Lin TEEC_NONE, 38634f2e8f6SHisping Lin TEEC_NONE); 38734f2e8f6SHisping Lin 38834f2e8f6SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 38934f2e8f6SHisping Lin 9, 39034f2e8f6SHisping Lin &TeecOperation, 39134f2e8f6SHisping Lin &ErrorOrigin); 39234f2e8f6SHisping Lin if (TeecResult != TEEC_SUCCESS) 39334f2e8f6SHisping Lin debug("notify always use security fail! please update optee!"); 39434f2e8f6SHisping Lin 39534f2e8f6SHisping Lin TEEC_CloseSession(&TeecSession); 39634f2e8f6SHisping Lin TEEC_FinalizeContext(&TeecContext); 39734f2e8f6SHisping Lin 39834f2e8f6SHisping Lin return; 39934f2e8f6SHisping Lin #endif 40034f2e8f6SHisping Lin } 40134f2e8f6SHisping Lin 402c7de5349SHisping Lin uint32_t trusty_read_rollback_index(uint32_t slot, uint64_t *value) 403c7de5349SHisping Lin { 404c7de5349SHisping Lin char hs[9]; 405c7de5349SHisping Lin 406c7de5349SHisping Lin b2hs((uint8_t *)&slot, (uint8_t *)hs, 4, 9); 407c7de5349SHisping Lin 408c7de5349SHisping Lin return trusty_base_read_security_data(hs, 8, (uint8_t *)value, 8); 409c7de5349SHisping Lin } 410c7de5349SHisping Lin 411ae8ec5e1SHisping Lin uint32_t trusty_write_rollback_index(uint32_t slot, uint64_t value) 412ae8ec5e1SHisping Lin { 413c7de5349SHisping Lin char hs[9]; 4143251364cSHisping Lin 415c7de5349SHisping Lin b2hs((uint8_t *)&slot, (uint8_t *)hs, 4, 9); 416ae8ec5e1SHisping Lin 417c7de5349SHisping Lin return trusty_base_write_security_data(hs, 8, (uint8_t *)&value, 8); 418ae8ec5e1SHisping Lin } 419ae8ec5e1SHisping Lin 420ae8ec5e1SHisping Lin uint32_t trusty_read_permanent_attributes(uint8_t *attributes, uint32_t size) 421ae8ec5e1SHisping Lin { 422c7de5349SHisping Lin return trusty_base_read_security_data("attributes", 423c7de5349SHisping Lin sizeof("attributes"), attributes, size); 424ae8ec5e1SHisping Lin } 425ae8ec5e1SHisping Lin 426ae8ec5e1SHisping Lin uint32_t trusty_write_permanent_attributes(uint8_t *attributes, uint32_t size) 427ae8ec5e1SHisping Lin { 428c7de5349SHisping Lin return trusty_base_write_security_data("attributes", 429c7de5349SHisping Lin sizeof("attributes"), attributes, size); 4306651d4c0SJason Zhu } 431ae8ec5e1SHisping Lin 432c7de5349SHisping Lin uint32_t trusty_read_permanent_attributes_flag(uint8_t *attributes) 433c7de5349SHisping Lin { 434c7de5349SHisping Lin return trusty_base_read_security_data("attributes_flag", 435c7de5349SHisping Lin sizeof("attributes_flag"), attributes, 1); 436c7de5349SHisping Lin } 437ae8ec5e1SHisping Lin 438c7de5349SHisping Lin uint32_t trusty_write_permanent_attributes_flag(uint8_t attributes) 439c7de5349SHisping Lin { 440c7de5349SHisping Lin return trusty_base_write_security_data("attributes_flag", 441c7de5349SHisping Lin sizeof("attributes_flag"), &attributes, 1); 442ae8ec5e1SHisping Lin } 443ae8ec5e1SHisping Lin 444564654ebSJason Zhu uint32_t trusty_read_permanent_attributes_cer(uint8_t *attributes, 445564654ebSJason Zhu uint32_t size) 446564654ebSJason Zhu { 447c7de5349SHisping Lin return trusty_base_read_security_data("rsacer", 448c7de5349SHisping Lin sizeof("rsacer"), attributes, size); 449564654ebSJason Zhu } 450564654ebSJason Zhu 451564654ebSJason Zhu uint32_t trusty_write_permanent_attributes_cer(uint8_t *attributes, 452564654ebSJason Zhu uint32_t size) 453564654ebSJason Zhu { 454c7de5349SHisping Lin return trusty_base_write_security_data("rsacer", 455c7de5349SHisping Lin sizeof("rsacer"), attributes, size); 456564654ebSJason Zhu } 457564654ebSJason Zhu 458ae8ec5e1SHisping Lin uint32_t trusty_read_lock_state(uint8_t *lock_state) 459ae8ec5e1SHisping Lin { 460c7de5349SHisping Lin return trusty_base_read_security_data("lock_state", 461c7de5349SHisping Lin sizeof("lock_state"), lock_state, 1); 462ae8ec5e1SHisping Lin } 463ae8ec5e1SHisping Lin 464ae8ec5e1SHisping Lin uint32_t trusty_write_lock_state(uint8_t lock_state) 465ae8ec5e1SHisping Lin { 466c7de5349SHisping Lin return trusty_base_write_security_data("lock_state", 467c7de5349SHisping Lin sizeof("lock_state"), &lock_state, 1); 468ae8ec5e1SHisping Lin } 469ae8ec5e1SHisping Lin 470ae8ec5e1SHisping Lin uint32_t trusty_read_flash_lock_state(uint8_t *flash_lock_state) 471ae8ec5e1SHisping Lin { 472c7de5349SHisping Lin return trusty_base_read_security_data("flash_lock_state", 473c7de5349SHisping Lin sizeof("flash_lock_state"), flash_lock_state, 1); 474c7de5349SHisping Lin } 475c7de5349SHisping Lin 476c7de5349SHisping Lin uint32_t trusty_write_flash_lock_state(uint8_t flash_lock_state) 477c7de5349SHisping Lin { 478c7de5349SHisping Lin return trusty_base_write_security_data("flash_lock_state", 479c7de5349SHisping Lin sizeof("flash_lock_state"), &flash_lock_state, 1); 480c7de5349SHisping Lin } 481c7de5349SHisping Lin 482c7de5349SHisping Lin static uint32_t trusty_base_end_efuse_or_otp(void) 483c7de5349SHisping Lin { 484ae8ec5e1SHisping Lin TEEC_Result TeecResult; 485ae8ec5e1SHisping Lin TEEC_Context TeecContext; 486ae8ec5e1SHisping Lin TEEC_Session TeecSession; 487ae8ec5e1SHisping Lin uint32_t ErrorOrigin; 488c7de5349SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 489c7de5349SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 490c7de5349SHisping Lin 491ae8ec5e1SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 492ae8ec5e1SHisping Lin TEEC_Operation TeecOperation = {0}; 493ae8ec5e1SHisping Lin 494f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 495f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 496f4e1db95SHisping Lin return TeecResult; 497ae8ec5e1SHisping Lin 498ae8ec5e1SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 499f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 500f4e1db95SHisping Lin return TeecResult; 501ae8ec5e1SHisping Lin 502ae8ec5e1SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 503ae8ec5e1SHisping Lin &TeecSession, 504ae8ec5e1SHisping Lin TeecUuid, 505ae8ec5e1SHisping Lin TEEC_LOGIN_PUBLIC, 506ae8ec5e1SHisping Lin NULL, 507c7de5349SHisping Lin NULL, 508ae8ec5e1SHisping Lin &ErrorOrigin); 509f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 510f4e1db95SHisping Lin return TeecResult; 511ae8ec5e1SHisping Lin 512c7de5349SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE, 513c7de5349SHisping Lin TEEC_NONE, 514ae8ec5e1SHisping Lin TEEC_NONE, 515ae8ec5e1SHisping Lin TEEC_NONE); 516ae8ec5e1SHisping Lin 517ae8ec5e1SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 518c7de5349SHisping Lin STORAGE_CMD_UBOOT_END_OTP, 519ae8ec5e1SHisping Lin &TeecOperation, 520ae8ec5e1SHisping Lin &ErrorOrigin); 521c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 522c7de5349SHisping Lin goto exit; 523f4e1db95SHisping Lin exit: 524ae8ec5e1SHisping Lin TEEC_CloseSession(&TeecSession); 52546b2a054SHisping Lin TEEC_FinalizeContext(&TeecContext); 526ae8ec5e1SHisping Lin 527ae8ec5e1SHisping Lin return TeecResult; 528ae8ec5e1SHisping Lin } 529ae8ec5e1SHisping Lin 530c7de5349SHisping Lin static uint32_t trusty_base_efuse_or_otp_operation(uint32_t cmd, 531c7de5349SHisping Lin uint8_t is_write, 532c7de5349SHisping Lin uint32_t *buf, 533c7de5349SHisping Lin uint32_t length) 534ae8ec5e1SHisping Lin { 535ae8ec5e1SHisping Lin TEEC_Result TeecResult; 536ae8ec5e1SHisping Lin TEEC_Context TeecContext; 537ae8ec5e1SHisping Lin TEEC_Session TeecSession; 538ae8ec5e1SHisping Lin uint32_t ErrorOrigin; 539c7de5349SHisping Lin 540c7de5349SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 541c7de5349SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 542ae8ec5e1SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 543ae8ec5e1SHisping Lin TEEC_Operation TeecOperation = {0}; 544ae8ec5e1SHisping Lin 545f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 546f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 547f4e1db95SHisping Lin return TeecResult; 548ae8ec5e1SHisping Lin 549ae8ec5e1SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 550f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 551f4e1db95SHisping Lin return TeecResult; 552ae8ec5e1SHisping Lin 553ae8ec5e1SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 554ae8ec5e1SHisping Lin &TeecSession, 555ae8ec5e1SHisping Lin TeecUuid, 556ae8ec5e1SHisping Lin TEEC_LOGIN_PUBLIC, 557ae8ec5e1SHisping Lin NULL, 558c7de5349SHisping Lin NULL, 559ae8ec5e1SHisping Lin &ErrorOrigin); 560f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 561f4e1db95SHisping Lin return TeecResult; 562ae8ec5e1SHisping Lin 563ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 564ae8ec5e1SHisping Lin 565c7de5349SHisping Lin SharedMem0.size = length * sizeof(uint32_t); 566ae8ec5e1SHisping Lin SharedMem0.flags = 0; 567ae8ec5e1SHisping Lin 568ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 569f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 570f4e1db95SHisping Lin goto exit; 571ae8ec5e1SHisping Lin 572ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 573ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 574ae8ec5e1SHisping Lin 575c7de5349SHisping Lin if (is_write) { 576c7de5349SHisping Lin memcpy(SharedMem0.buffer, buf, SharedMem0.size); 577ae8ec5e1SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 578c7de5349SHisping Lin TEEC_NONE, 579ae8ec5e1SHisping Lin TEEC_NONE, 580ae8ec5e1SHisping Lin TEEC_NONE); 581ae8ec5e1SHisping Lin 582c7de5349SHisping Lin } else { 583c7de5349SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT, 584c7de5349SHisping Lin TEEC_NONE, 585c7de5349SHisping Lin TEEC_NONE, 586c7de5349SHisping Lin TEEC_NONE); 587c7de5349SHisping Lin } 588c7de5349SHisping Lin 589ae8ec5e1SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 590c7de5349SHisping Lin cmd, 591ae8ec5e1SHisping Lin &TeecOperation, 592ae8ec5e1SHisping Lin &ErrorOrigin); 593f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 594f4e1db95SHisping Lin goto exit; 595c7de5349SHisping Lin 596c7de5349SHisping Lin if (!is_write) 597c7de5349SHisping Lin memcpy(buf, SharedMem0.buffer, SharedMem0.size); 598c7de5349SHisping Lin 599f4e1db95SHisping Lin exit: 600ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 601ae8ec5e1SHisping Lin TEEC_CloseSession(&TeecSession); 60246b2a054SHisping Lin TEEC_FinalizeContext(&TeecContext); 603ae8ec5e1SHisping Lin 604ae8ec5e1SHisping Lin return TeecResult; 605ae8ec5e1SHisping Lin } 606ae8ec5e1SHisping Lin 6076ef445a4SHisping Lin uint32_t trusty_read_attribute_hash(uint32_t *buf, uint32_t length) 6086ef445a4SHisping Lin { 609c7de5349SHisping Lin return trusty_base_efuse_or_otp_operation(STORAGE_CMD_READ_ATTRIBUTE_HASH, 610c7de5349SHisping Lin false, buf, length); 6116ef445a4SHisping Lin } 6126ef445a4SHisping Lin 6136ef445a4SHisping Lin uint32_t trusty_write_attribute_hash(uint32_t *buf, uint32_t length) 6146ef445a4SHisping Lin { 615c7de5349SHisping Lin return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_ATTRIBUTE_HASH, 616c7de5349SHisping Lin true, buf, length); 61716539616SHisping Lin } 61816539616SHisping Lin 61916539616SHisping Lin uint32_t trusty_notify_optee_uboot_end(void) 62016539616SHisping Lin { 62116539616SHisping Lin TEEC_Result res; 622c7de5349SHisping Lin 623c7de5349SHisping Lin res = trusty_base_end_security_data(); 624c7de5349SHisping Lin res |= trusty_base_end_efuse_or_otp(); 62516539616SHisping Lin return res; 62616539616SHisping Lin } 6272cd27853SHisping Lin 6282cd27853SHisping Lin uint32_t trusty_read_vbootkey_hash(uint32_t *buf, uint32_t length) 6292cd27853SHisping Lin { 630c7de5349SHisping Lin return trusty_base_efuse_or_otp_operation(STORAGE_CMD_READ_VBOOTKEY_HASH, 631c7de5349SHisping Lin false, buf, length); 6322cd27853SHisping Lin } 633c7de5349SHisping Lin 6342cd27853SHisping Lin uint32_t trusty_write_vbootkey_hash(uint32_t *buf, uint32_t length) 6352cd27853SHisping Lin { 636c7de5349SHisping Lin return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_VBOOTKEY_HASH, 637c7de5349SHisping Lin true, buf, length); 6382cd27853SHisping Lin } 639095e2a82SHisping Lin 640468df3b2SHisping Lin uint32_t trusty_read_vbootkey_enable_flag(uint8_t *flag) 641468df3b2SHisping Lin { 642468df3b2SHisping Lin uint32_t bootflag; 643c7de5349SHisping Lin TEEC_Result TeecResult; 644468df3b2SHisping Lin 645f07e1686SHisping Lin *flag = 0; 646f07e1686SHisping Lin 647c7de5349SHisping Lin TeecResult = trusty_base_efuse_or_otp_operation(STORAGE_CMD_READ_ENABLE_FLAG, 648c7de5349SHisping Lin false, &bootflag, 1); 649468df3b2SHisping Lin 650468df3b2SHisping Lin if (TeecResult == TEEC_SUCCESS) { 6510202ee8aSHisping Lin #if defined(CONFIG_ROCKCHIP_RK3288) 6520202ee8aSHisping Lin if (bootflag == 0x00000001) 6530202ee8aSHisping Lin *flag = 1; 6540202ee8aSHisping Lin #else 655468df3b2SHisping Lin if (bootflag == 0x000000FF) 656468df3b2SHisping Lin *flag = 1; 6570202ee8aSHisping Lin #endif 658468df3b2SHisping Lin } 659095e2a82SHisping Lin return TeecResult; 660095e2a82SHisping Lin } 6614aa61755SAndy Ye 6621ef63c75SHisping Lin uint32_t trusty_write_ta_encryption_key(uint32_t *buf, uint32_t length) 6631ef63c75SHisping Lin { 6641ef63c75SHisping Lin return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_TA_ENCRYPTION_KEY, 6651ef63c75SHisping Lin true, buf, length); 6661ef63c75SHisping Lin } 6671ef63c75SHisping Lin 66810f41197SHisping Lin uint32_t trusty_ta_encryption_key_is_written(uint8_t *value) 66910f41197SHisping Lin { 67010f41197SHisping Lin TEEC_Result TeecResult; 67110f41197SHisping Lin TEEC_Context TeecContext; 67210f41197SHisping Lin TEEC_Session TeecSession; 67310f41197SHisping Lin uint32_t ErrorOrigin; 67410f41197SHisping Lin 67510f41197SHisping Lin *value = 0; 67610f41197SHisping Lin 67710f41197SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 67810f41197SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 67910f41197SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 68010f41197SHisping Lin TEEC_Operation TeecOperation = {0}; 68110f41197SHisping Lin 68210f41197SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 68310f41197SHisping Lin if (TeecResult != TEEC_SUCCESS) 68410f41197SHisping Lin return TeecResult; 68510f41197SHisping Lin 68610f41197SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 68710f41197SHisping Lin if (TeecResult != TEEC_SUCCESS) 68810f41197SHisping Lin return TeecResult; 68910f41197SHisping Lin 69010f41197SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 69110f41197SHisping Lin &TeecSession, 69210f41197SHisping Lin TeecUuid, 69310f41197SHisping Lin TEEC_LOGIN_PUBLIC, 69410f41197SHisping Lin NULL, 69510f41197SHisping Lin NULL, 69610f41197SHisping Lin &ErrorOrigin); 69710f41197SHisping Lin if (TeecResult != TEEC_SUCCESS) 69810f41197SHisping Lin return TeecResult; 69910f41197SHisping Lin 70010f41197SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_OUTPUT, 70110f41197SHisping Lin TEEC_NONE, 70210f41197SHisping Lin TEEC_NONE, 70310f41197SHisping Lin TEEC_NONE); 70410f41197SHisping Lin 70510f41197SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 70610f41197SHisping Lin STORAGE_CMD_TA_ENCRYPTION_KEY_IS_WRITTEN, 70710f41197SHisping Lin &TeecOperation, 70810f41197SHisping Lin &ErrorOrigin); 70910f41197SHisping Lin if (TeecResult == TEEC_SUCCESS) 71010f41197SHisping Lin *value = TeecOperation.params[0].value.a; 71110f41197SHisping Lin 71210f41197SHisping Lin TEEC_CloseSession(&TeecSession); 71310f41197SHisping Lin TEEC_FinalizeContext(&TeecContext); 71410f41197SHisping Lin 71510f41197SHisping Lin return TeecResult; 71610f41197SHisping Lin } 71710f41197SHisping Lin 7181ac64e8aSHisping Lin uint32_t trusty_write_oem_encrypt_data(uint32_t *buf, uint32_t length) 7191ac64e8aSHisping Lin { 7201ac64e8aSHisping Lin return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_OEM_ENCRYPT_DATA, 7211ac64e8aSHisping Lin true, buf, length); 7221ac64e8aSHisping Lin } 7231ac64e8aSHisping Lin 724fc383442SHisping Lin uint32_t trusty_oem_encrypt_data_is_written(uint8_t *value) 725fc383442SHisping Lin { 726fc383442SHisping Lin TEEC_Result TeecResult; 727fc383442SHisping Lin TEEC_Context TeecContext; 728fc383442SHisping Lin TEEC_Session TeecSession; 729fc383442SHisping Lin uint32_t ErrorOrigin; 730fc383442SHisping Lin 731fc383442SHisping Lin *value = 0; 732fc383442SHisping Lin 733fc383442SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 734fc383442SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 735fc383442SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 736fc383442SHisping Lin TEEC_Operation TeecOperation = {0}; 737fc383442SHisping Lin 738fc383442SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 739fc383442SHisping Lin if (TeecResult != TEEC_SUCCESS) 740fc383442SHisping Lin return TeecResult; 741fc383442SHisping Lin 742fc383442SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 743fc383442SHisping Lin if (TeecResult != TEEC_SUCCESS) 744fc383442SHisping Lin return TeecResult; 745fc383442SHisping Lin 746fc383442SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 747fc383442SHisping Lin &TeecSession, 748fc383442SHisping Lin TeecUuid, 749fc383442SHisping Lin TEEC_LOGIN_PUBLIC, 750fc383442SHisping Lin NULL, 751fc383442SHisping Lin NULL, 752fc383442SHisping Lin &ErrorOrigin); 753fc383442SHisping Lin if (TeecResult != TEEC_SUCCESS) 754fc383442SHisping Lin return TeecResult; 755fc383442SHisping Lin 756fc383442SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_OUTPUT, 757fc383442SHisping Lin TEEC_NONE, 758fc383442SHisping Lin TEEC_NONE, 759fc383442SHisping Lin TEEC_NONE); 760fc383442SHisping Lin 761fc383442SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 762fc383442SHisping Lin STORAGE_CMD_OEM_ENCRYPT_DATA_IS_WRITTEN, 763fc383442SHisping Lin &TeecOperation, 764fc383442SHisping Lin &ErrorOrigin); 765fc383442SHisping Lin if (TeecResult == TEEC_SUCCESS) 766fc383442SHisping Lin *value = TeecOperation.params[0].value.a; 767fc383442SHisping Lin 768fc383442SHisping Lin TEEC_CloseSession(&TeecSession); 769fc383442SHisping Lin TEEC_FinalizeContext(&TeecContext); 770fc383442SHisping Lin 771fc383442SHisping Lin return TeecResult; 772fc383442SHisping Lin } 773fc383442SHisping Lin 774fbf29bfbSHisping Lin uint32_t trusty_check_security_level_flag(uint8_t flag) 775fbf29bfbSHisping Lin { 776fbf29bfbSHisping Lin uint32_t levelflag; 777fbf29bfbSHisping Lin 778fbf29bfbSHisping Lin levelflag = flag; 779fbf29bfbSHisping Lin return trusty_base_efuse_or_otp_operation(STORAGE_CMD_CHECK_SECURITY_LEVEL_FLAG, 780fbf29bfbSHisping Lin true, &levelflag, 1); 781fbf29bfbSHisping Lin } 782fbf29bfbSHisping Lin 783f39d4289SHisping Lin uint32_t trusty_write_oem_huk(uint32_t *buf, uint32_t length) 784f39d4289SHisping Lin { 785f39d4289SHisping Lin return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_OEM_HUK, 786f39d4289SHisping Lin true, buf, length); 787f39d4289SHisping Lin } 788f39d4289SHisping Lin 78934f2e8f6SHisping Lin static void trusty_select_security_level(void) 7907504da74SHisping Lin { 791b2858095SHisping Lin #ifdef CONFIG_OPTEE_SECURITY_LEVEL 7927504da74SHisping Lin TEEC_Result TeecResult; 7937504da74SHisping Lin 7947504da74SHisping Lin TeecResult = trusty_check_security_level_flag(CONFIG_OPTEE_SECURITY_LEVEL); 7957504da74SHisping Lin if (TeecResult == TEE_ERROR_CANCEL) { 7967504da74SHisping Lin run_command("download", 0); 7977504da74SHisping Lin return; 7987504da74SHisping Lin } 7997504da74SHisping Lin 8007504da74SHisping Lin if (TeecResult == TEEC_SUCCESS) 8017504da74SHisping Lin debug("optee select security level success!"); 802b2858095SHisping Lin else if (TeecResult == TEEC_ERROR_NOT_SUPPORTED) 803b2858095SHisping Lin debug("optee not support security level!"); 8047504da74SHisping Lin else 8057504da74SHisping Lin panic("optee select security level fail!"); 8067504da74SHisping Lin 8077504da74SHisping Lin return; 8087504da74SHisping Lin #endif 8097504da74SHisping Lin } 8107504da74SHisping Lin 81151ac7005SHisping Lin void optee_client_init(void) 81251ac7005SHisping Lin { 81351ac7005SHisping Lin trusty_select_security_level(); 81434f2e8f6SHisping Lin trusty_notify_always_use_security(); 81551ac7005SHisping Lin } 81651ac7005SHisping Lin 817d5913350SHisping Lin uint32_t trusty_write_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 memcpy(SharedMem.buffer, byte_buf, SharedMem.size); 862d5913350SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 863d5913350SHisping Lin TEEC_MEMREF_TEMP_INPUT, 864d5913350SHisping Lin TEEC_NONE, 865d5913350SHisping Lin TEEC_NONE); 866d5913350SHisping Lin 867d5913350SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 868d5913350SHisping Lin STORAGE_CMD_WRITE_OEM_NS_OTP, 869d5913350SHisping Lin &TeecOperation, 870d5913350SHisping Lin &ErrorOrigin); 871d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 872d5913350SHisping Lin goto exit; 873d5913350SHisping Lin 874d5913350SHisping Lin exit: 875d5913350SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem); 876d5913350SHisping Lin TEEC_CloseSession(&TeecSession); 877d5913350SHisping Lin TEEC_FinalizeContext(&TeecContext); 878d5913350SHisping Lin 879d5913350SHisping Lin return TeecResult; 880d5913350SHisping Lin } 881d5913350SHisping Lin 882d5913350SHisping Lin uint32_t trusty_read_oem_ns_otp(uint32_t byte_off, uint8_t *byte_buf, uint32_t byte_len) 883d5913350SHisping Lin { 884d5913350SHisping Lin TEEC_Result TeecResult; 885d5913350SHisping Lin TEEC_Context TeecContext; 886d5913350SHisping Lin TEEC_Session TeecSession; 887d5913350SHisping Lin uint32_t ErrorOrigin; 888d5913350SHisping Lin 889d5913350SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 890d5913350SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 891d5913350SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 892d5913350SHisping Lin TEEC_Operation TeecOperation = {0}; 893d5913350SHisping Lin 894d5913350SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 895d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 896d5913350SHisping Lin return TeecResult; 897d5913350SHisping Lin 898d5913350SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 899d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 900d5913350SHisping Lin return TeecResult; 901d5913350SHisping Lin 902d5913350SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 903d5913350SHisping Lin &TeecSession, 904d5913350SHisping Lin TeecUuid, 905d5913350SHisping Lin TEEC_LOGIN_PUBLIC, 906d5913350SHisping Lin NULL, 907d5913350SHisping Lin NULL, 908d5913350SHisping Lin &ErrorOrigin); 909d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 910d5913350SHisping Lin return TeecResult; 911d5913350SHisping Lin 912d5913350SHisping Lin TeecOperation.params[0].value.a = byte_off; 913d5913350SHisping Lin 914d5913350SHisping Lin TEEC_SharedMemory SharedMem = {0}; 915d5913350SHisping Lin 916d5913350SHisping Lin SharedMem.size = byte_len; 917d5913350SHisping Lin SharedMem.flags = 0; 918d5913350SHisping Lin 919d5913350SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem); 920d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 921d5913350SHisping Lin goto exit; 922d5913350SHisping Lin 923d5913350SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem.buffer; 924d5913350SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem.size; 925d5913350SHisping Lin 926d5913350SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 927d5913350SHisping Lin TEEC_MEMREF_TEMP_OUTPUT, 928d5913350SHisping Lin TEEC_NONE, 929d5913350SHisping Lin TEEC_NONE); 930d5913350SHisping Lin 931d5913350SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 932d5913350SHisping Lin STORAGE_CMD_READ_OEM_NS_OTP, 933d5913350SHisping Lin &TeecOperation, 934d5913350SHisping Lin &ErrorOrigin); 935d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 936d5913350SHisping Lin goto exit; 937d5913350SHisping Lin 938d5913350SHisping Lin memcpy(byte_buf, SharedMem.buffer, SharedMem.size); 939d5913350SHisping Lin 940d5913350SHisping Lin exit: 941d5913350SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem); 942d5913350SHisping Lin TEEC_CloseSession(&TeecSession); 943d5913350SHisping Lin TEEC_FinalizeContext(&TeecContext); 944d5913350SHisping Lin 945d5913350SHisping Lin return TeecResult; 946d5913350SHisping Lin } 947d5913350SHisping Lin 94890e849a0Sxb.wang uint32_t trusty_write_oem_otp_key(enum RK_OEM_OTP_KEYID key_id, 949bb1ba6acSHisping Lin uint8_t *byte_buf, uint32_t byte_len) 950bb1ba6acSHisping Lin { 951bb1ba6acSHisping Lin TEEC_Result TeecResult; 952bb1ba6acSHisping Lin TEEC_Context TeecContext; 953bb1ba6acSHisping Lin TEEC_Session TeecSession; 954bb1ba6acSHisping Lin uint32_t ErrorOrigin; 955bb1ba6acSHisping Lin 956bb1ba6acSHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 957bb1ba6acSHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 958bb1ba6acSHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 959bb1ba6acSHisping Lin TEEC_Operation TeecOperation = {0}; 960bb1ba6acSHisping Lin 961bb1ba6acSHisping Lin TeecResult = OpteeClientApiLibInitialize(); 962bb1ba6acSHisping Lin if (TeecResult != TEEC_SUCCESS) 963bb1ba6acSHisping Lin return TeecResult; 964bb1ba6acSHisping Lin 965bb1ba6acSHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 966bb1ba6acSHisping Lin if (TeecResult != TEEC_SUCCESS) 967bb1ba6acSHisping Lin return TeecResult; 968bb1ba6acSHisping Lin 969bb1ba6acSHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 970bb1ba6acSHisping Lin &TeecSession, 971bb1ba6acSHisping Lin TeecUuid, 972bb1ba6acSHisping Lin TEEC_LOGIN_PUBLIC, 973bb1ba6acSHisping Lin NULL, 974bb1ba6acSHisping Lin NULL, 975bb1ba6acSHisping Lin &ErrorOrigin); 976bb1ba6acSHisping Lin if (TeecResult != TEEC_SUCCESS) 977bb1ba6acSHisping Lin return TeecResult; 978bb1ba6acSHisping Lin 979bb1ba6acSHisping Lin TeecOperation.params[0].value.a = key_id; 980bb1ba6acSHisping Lin 981bb1ba6acSHisping Lin TEEC_SharedMemory SharedMem = {0}; 982bb1ba6acSHisping Lin 983bb1ba6acSHisping Lin SharedMem.size = byte_len; 984bb1ba6acSHisping Lin SharedMem.flags = 0; 985bb1ba6acSHisping Lin 986bb1ba6acSHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem); 987bb1ba6acSHisping Lin if (TeecResult != TEEC_SUCCESS) 988bb1ba6acSHisping Lin goto exit; 989bb1ba6acSHisping Lin 990bb1ba6acSHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem.buffer; 991bb1ba6acSHisping Lin TeecOperation.params[1].tmpref.size = SharedMem.size; 992bb1ba6acSHisping Lin 993bb1ba6acSHisping Lin memcpy(SharedMem.buffer, byte_buf, SharedMem.size); 994bb1ba6acSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 995bb1ba6acSHisping Lin TEEC_MEMREF_TEMP_INPUT, 996bb1ba6acSHisping Lin TEEC_NONE, 997bb1ba6acSHisping Lin TEEC_NONE); 998bb1ba6acSHisping Lin 999bb1ba6acSHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 100090e849a0Sxb.wang STORAGE_CMD_WRITE_OEM_OTP_KEY, 1001bb1ba6acSHisping Lin &TeecOperation, 1002bb1ba6acSHisping Lin &ErrorOrigin); 1003bb1ba6acSHisping Lin if (TeecResult != TEEC_SUCCESS) 1004bb1ba6acSHisping Lin goto exit; 1005bb1ba6acSHisping Lin 1006bb1ba6acSHisping Lin exit: 1007bb1ba6acSHisping Lin TEEC_ReleaseSharedMemory(&SharedMem); 1008bb1ba6acSHisping Lin TEEC_CloseSession(&TeecSession); 1009bb1ba6acSHisping Lin TEEC_FinalizeContext(&TeecContext); 1010bb1ba6acSHisping Lin 1011bb1ba6acSHisping Lin return TeecResult; 1012bb1ba6acSHisping Lin } 1013bb1ba6acSHisping Lin 10149deb34f6SHisping Lin uint32_t trusty_oem_otp_key_is_written(enum RK_OEM_OTP_KEYID key_id, uint8_t *value) 10159deb34f6SHisping Lin { 10169deb34f6SHisping Lin TEEC_Result TeecResult; 10179deb34f6SHisping Lin TEEC_Context TeecContext; 10189deb34f6SHisping Lin TEEC_Session TeecSession; 10199deb34f6SHisping Lin uint32_t ErrorOrigin; 10209deb34f6SHisping Lin 10219deb34f6SHisping Lin *value = 0xFF; 10229deb34f6SHisping Lin 10239deb34f6SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 10249deb34f6SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 10259deb34f6SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 10269deb34f6SHisping Lin TEEC_Operation TeecOperation = {0}; 10279deb34f6SHisping Lin 10289deb34f6SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 10299deb34f6SHisping Lin if (TeecResult != TEEC_SUCCESS) 10309deb34f6SHisping Lin return TeecResult; 10319deb34f6SHisping Lin 10329deb34f6SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 10339deb34f6SHisping Lin if (TeecResult != TEEC_SUCCESS) 10349deb34f6SHisping Lin return TeecResult; 10359deb34f6SHisping Lin 10369deb34f6SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 10379deb34f6SHisping Lin &TeecSession, 10389deb34f6SHisping Lin TeecUuid, 10399deb34f6SHisping Lin TEEC_LOGIN_PUBLIC, 10409deb34f6SHisping Lin NULL, 10419deb34f6SHisping Lin NULL, 10429deb34f6SHisping Lin &ErrorOrigin); 10439deb34f6SHisping Lin if (TeecResult != TEEC_SUCCESS) 10449deb34f6SHisping Lin return TeecResult; 10459deb34f6SHisping Lin 10469deb34f6SHisping Lin TeecOperation.params[0].value.a = key_id; 10479deb34f6SHisping Lin 10489deb34f6SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INOUT, 10499deb34f6SHisping Lin TEEC_NONE, 10509deb34f6SHisping Lin TEEC_NONE, 10519deb34f6SHisping Lin TEEC_NONE); 10529deb34f6SHisping Lin 10539deb34f6SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 10549deb34f6SHisping Lin STORAGE_CMD_OEM_OTP_KEY_IS_WRITTEN, 10559deb34f6SHisping Lin &TeecOperation, 10569deb34f6SHisping Lin &ErrorOrigin); 10579deb34f6SHisping Lin if (TeecResult == TEEC_SUCCESS) 10589deb34f6SHisping Lin *value = TeecOperation.params[0].value.b; 10599deb34f6SHisping Lin 10609deb34f6SHisping Lin TEEC_CloseSession(&TeecSession); 10619deb34f6SHisping Lin TEEC_FinalizeContext(&TeecContext); 10629deb34f6SHisping Lin 10639deb34f6SHisping Lin return TeecResult; 10649deb34f6SHisping Lin } 10659deb34f6SHisping Lin 106690e849a0Sxb.wang uint32_t trusty_set_oem_hr_otp_read_lock(enum RK_OEM_OTP_KEYID key_id) 1067a405238aSHisping Lin { 1068a405238aSHisping Lin TEEC_Result TeecResult; 1069a405238aSHisping Lin TEEC_Context TeecContext; 1070a405238aSHisping Lin TEEC_Session TeecSession; 1071a405238aSHisping Lin uint32_t ErrorOrigin; 1072a405238aSHisping Lin 1073a405238aSHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 1074a405238aSHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 1075a405238aSHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 1076a405238aSHisping Lin TEEC_Operation TeecOperation = {0}; 1077a405238aSHisping Lin 1078a405238aSHisping Lin TeecResult = OpteeClientApiLibInitialize(); 1079a405238aSHisping Lin if (TeecResult != TEEC_SUCCESS) 1080a405238aSHisping Lin return TeecResult; 1081a405238aSHisping Lin 1082a405238aSHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1083a405238aSHisping Lin if (TeecResult != TEEC_SUCCESS) 1084a405238aSHisping Lin return TeecResult; 1085a405238aSHisping Lin 1086a405238aSHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 1087a405238aSHisping Lin &TeecSession, 1088a405238aSHisping Lin TeecUuid, 1089a405238aSHisping Lin TEEC_LOGIN_PUBLIC, 1090a405238aSHisping Lin NULL, 1091a405238aSHisping Lin NULL, 1092a405238aSHisping Lin &ErrorOrigin); 1093a405238aSHisping Lin if (TeecResult != TEEC_SUCCESS) 1094a405238aSHisping Lin return TeecResult; 1095a405238aSHisping Lin 1096a405238aSHisping Lin TeecOperation.params[0].value.a = key_id; 1097a405238aSHisping Lin 1098a405238aSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 1099a405238aSHisping Lin TEEC_NONE, 1100a405238aSHisping Lin TEEC_NONE, 1101a405238aSHisping Lin TEEC_NONE); 1102a405238aSHisping Lin 1103a405238aSHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 1104a405238aSHisping Lin STORAGE_CMD_SET_OEM_HR_OTP_READ_LOCK, 1105a405238aSHisping Lin &TeecOperation, 1106a405238aSHisping Lin &ErrorOrigin); 1107a405238aSHisping Lin if (TeecResult != TEEC_SUCCESS) 1108a405238aSHisping Lin goto exit; 1109a405238aSHisping Lin 1110a405238aSHisping Lin exit: 1111a405238aSHisping Lin TEEC_CloseSession(&TeecSession); 1112a405238aSHisping Lin TEEC_FinalizeContext(&TeecContext); 1113a405238aSHisping Lin 1114a405238aSHisping Lin return TeecResult; 1115a405238aSHisping Lin } 1116a405238aSHisping Lin 11172f8c34bdSxb.wang uint32_t trusty_oem_otp_key_cipher(enum RK_OEM_OTP_KEYID key_id, rk_cipher_config *config, 11182f8c34bdSxb.wang uint32_t src_phys_addr, uint32_t dst_phys_addr, 11192f8c34bdSxb.wang uint32_t len) 1120fc3694d6Sxb.wang { 1121fc3694d6Sxb.wang TEEC_Result TeecResult; 1122fc3694d6Sxb.wang TEEC_Context TeecContext; 1123fc3694d6Sxb.wang TEEC_Session TeecSession; 1124fc3694d6Sxb.wang TEEC_Operation TeecOperation = {0}; 1125fc3694d6Sxb.wang uint32_t ErrorOrigin; 1126fc3694d6Sxb.wang TEEC_UUID uuid = RK_CRYPTO_SERVICE_UUID; 1127fc3694d6Sxb.wang TEEC_SharedMemory SharedMem_config = {0}; 1128fc3694d6Sxb.wang 11292f8c34bdSxb.wang if (key_id != RK_OEM_OTP_KEY0 && 11302f8c34bdSxb.wang key_id != RK_OEM_OTP_KEY1 && 11312f8c34bdSxb.wang key_id != RK_OEM_OTP_KEY2 && 11322f8c34bdSxb.wang key_id != RK_OEM_OTP_KEY3 && 11332f8c34bdSxb.wang key_id != RK_OEM_OTP_KEY_FW) 1134fc3694d6Sxb.wang return TEEC_ERROR_BAD_PARAMETERS; 1135fc3694d6Sxb.wang 11362f8c34bdSxb.wang if (!config) 1137fc3694d6Sxb.wang return TEEC_ERROR_BAD_PARAMETERS; 1138fc3694d6Sxb.wang 1139fc3694d6Sxb.wang if (config->algo != RK_ALGO_AES && config->algo != RK_ALGO_SM4) 1140fc3694d6Sxb.wang return TEEC_ERROR_BAD_PARAMETERS; 1141fc3694d6Sxb.wang 1142fc3694d6Sxb.wang if (config->mode >= RK_CIPHER_MODE_XTS) 1143fc3694d6Sxb.wang return TEEC_ERROR_BAD_PARAMETERS; 1144fc3694d6Sxb.wang 1145fc3694d6Sxb.wang if (config->operation != RK_MODE_ENCRYPT && 1146fc3694d6Sxb.wang config->operation != RK_MODE_DECRYPT) 1147fc3694d6Sxb.wang return TEEC_ERROR_BAD_PARAMETERS; 1148fc3694d6Sxb.wang 1149fc3694d6Sxb.wang if (config->key_len != 16 && 1150fc3694d6Sxb.wang config->key_len != 24 && 1151fc3694d6Sxb.wang config->key_len != 32) 1152fc3694d6Sxb.wang return TEEC_ERROR_BAD_PARAMETERS; 1153fc3694d6Sxb.wang 11542f8c34bdSxb.wang if (key_id == RK_OEM_OTP_KEY_FW && config->key_len != 16) 11552f8c34bdSxb.wang return TEEC_ERROR_BAD_PARAMETERS; 11562f8c34bdSxb.wang 11572f8c34bdSxb.wang #if defined(CONFIG_ROCKCHIP_RV1126) 11582f8c34bdSxb.wang if (config->key_len == 24) 11592f8c34bdSxb.wang return TEEC_ERROR_BAD_PARAMETERS; 11602f8c34bdSxb.wang #endif 11612f8c34bdSxb.wang 1162fc3694d6Sxb.wang if (len % AES_BLOCK_SIZE || 1163fc3694d6Sxb.wang len == 0) 1164fc3694d6Sxb.wang return TEEC_ERROR_BAD_PARAMETERS; 1165fc3694d6Sxb.wang 11662f8c34bdSxb.wang if (!src_phys_addr || !dst_phys_addr) 11672f8c34bdSxb.wang return TEEC_ERROR_BAD_PARAMETERS; 11682f8c34bdSxb.wang 1169fc3694d6Sxb.wang TeecResult = OpteeClientApiLibInitialize(); 1170fc3694d6Sxb.wang if (TeecResult != TEEC_SUCCESS) 1171fc3694d6Sxb.wang return TeecResult; 1172fc3694d6Sxb.wang 1173fc3694d6Sxb.wang TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1174fc3694d6Sxb.wang if (TeecResult != TEEC_SUCCESS) 1175fc3694d6Sxb.wang return TeecResult; 1176fc3694d6Sxb.wang 1177fc3694d6Sxb.wang TeecResult = TEEC_OpenSession(&TeecContext, 1178fc3694d6Sxb.wang &TeecSession, 1179fc3694d6Sxb.wang &uuid, 1180fc3694d6Sxb.wang TEEC_LOGIN_PUBLIC, 1181fc3694d6Sxb.wang NULL, 1182fc3694d6Sxb.wang NULL, 1183fc3694d6Sxb.wang &ErrorOrigin); 1184fc3694d6Sxb.wang if (TeecResult != TEEC_SUCCESS) 1185fc3694d6Sxb.wang goto exit; 1186fc3694d6Sxb.wang 1187fc3694d6Sxb.wang SharedMem_config.size = sizeof(rk_cipher_config); 1188fc3694d6Sxb.wang TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem_config); 1189fc3694d6Sxb.wang if (TeecResult != TEEC_SUCCESS) 1190fc3694d6Sxb.wang goto exit; 1191fc3694d6Sxb.wang 1192fc3694d6Sxb.wang memcpy(SharedMem_config.buffer, config, sizeof(rk_cipher_config)); 1193fc3694d6Sxb.wang TeecOperation.params[0].value.a = key_id; 1194fc3694d6Sxb.wang TeecOperation.params[1].tmpref.buffer = SharedMem_config.buffer; 1195fc3694d6Sxb.wang TeecOperation.params[1].tmpref.size = SharedMem_config.size; 11962f8c34bdSxb.wang TeecOperation.params[2].value.a = src_phys_addr; 11972f8c34bdSxb.wang TeecOperation.params[2].value.b = len; 11982f8c34bdSxb.wang TeecOperation.params[3].value.a = dst_phys_addr; 1199fc3694d6Sxb.wang TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 1200fc3694d6Sxb.wang TEEC_MEMREF_TEMP_INPUT, 12012f8c34bdSxb.wang TEEC_VALUE_INPUT, 12022f8c34bdSxb.wang TEEC_VALUE_INPUT); 12032f8c34bdSxb.wang 12042f8c34bdSxb.wang crypto_flush_cacheline(src_phys_addr, len); 12052f8c34bdSxb.wang crypto_flush_cacheline(dst_phys_addr, len); 12062f8c34bdSxb.wang 1207fc3694d6Sxb.wang TeecResult = TEEC_InvokeCommand(&TeecSession, 12082f8c34bdSxb.wang CRYPTO_SERVICE_CMD_OEM_OTP_KEY_PHYS_CIPHER, 1209fc3694d6Sxb.wang &TeecOperation, 1210fc3694d6Sxb.wang &ErrorOrigin); 1211fc3694d6Sxb.wang 1212a900eef3SHisping Lin crypto_invalidate_cacheline(dst_phys_addr, len); 1213a900eef3SHisping Lin 1214fc3694d6Sxb.wang exit: 1215fc3694d6Sxb.wang TEEC_ReleaseSharedMemory(&SharedMem_config); 1216fc3694d6Sxb.wang TEEC_CloseSession(&TeecSession); 1217fc3694d6Sxb.wang TEEC_FinalizeContext(&TeecContext); 1218fc3694d6Sxb.wang return TeecResult; 1219fc3694d6Sxb.wang } 1220fc3694d6Sxb.wang 1221a828eba9SHisping Lin uint32_t trusty_write_oem_hdcp_key(enum RK_HDCP_KEYID key_id, 1222a828eba9SHisping Lin uint8_t *byte_buf, uint32_t byte_len) 1223a828eba9SHisping Lin { 1224a828eba9SHisping Lin TEEC_Result TeecResult; 1225a828eba9SHisping Lin TEEC_Context TeecContext; 1226a828eba9SHisping Lin TEEC_Session TeecSession; 1227a828eba9SHisping Lin uint32_t ErrorOrigin; 1228a828eba9SHisping Lin 1229a828eba9SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 1230a828eba9SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 1231a828eba9SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 1232a828eba9SHisping Lin TEEC_Operation TeecOperation = {0}; 1233a828eba9SHisping Lin 1234a828eba9SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 1235a828eba9SHisping Lin if (TeecResult != TEEC_SUCCESS) 1236a828eba9SHisping Lin return TeecResult; 1237a828eba9SHisping Lin 1238a828eba9SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1239a828eba9SHisping Lin if (TeecResult != TEEC_SUCCESS) 1240a828eba9SHisping Lin return TeecResult; 1241a828eba9SHisping Lin 1242a828eba9SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 1243a828eba9SHisping Lin &TeecSession, 1244a828eba9SHisping Lin TeecUuid, 1245a828eba9SHisping Lin TEEC_LOGIN_PUBLIC, 1246a828eba9SHisping Lin NULL, 1247a828eba9SHisping Lin NULL, 1248a828eba9SHisping Lin &ErrorOrigin); 1249a828eba9SHisping Lin if (TeecResult != TEEC_SUCCESS) 1250a828eba9SHisping Lin return TeecResult; 1251a828eba9SHisping Lin 1252a828eba9SHisping Lin TeecOperation.params[0].value.a = key_id; 1253a828eba9SHisping Lin 1254a828eba9SHisping Lin TEEC_SharedMemory SharedMem = {0}; 1255a828eba9SHisping Lin 1256a828eba9SHisping Lin SharedMem.size = byte_len; 1257a828eba9SHisping Lin SharedMem.flags = 0; 1258a828eba9SHisping Lin 1259a828eba9SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem); 1260a828eba9SHisping Lin if (TeecResult != TEEC_SUCCESS) 1261a828eba9SHisping Lin goto exit; 1262a828eba9SHisping Lin 1263a828eba9SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem.buffer; 1264a828eba9SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem.size; 1265a828eba9SHisping Lin 1266a828eba9SHisping Lin memcpy(SharedMem.buffer, byte_buf, SharedMem.size); 1267a828eba9SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 1268a828eba9SHisping Lin TEEC_MEMREF_TEMP_INPUT, 1269a828eba9SHisping Lin TEEC_NONE, 1270a828eba9SHisping Lin TEEC_NONE); 1271a828eba9SHisping Lin 1272a828eba9SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 1273a828eba9SHisping Lin STORAGE_CMD_WRITE_OEM_HDCP_KEY, 1274a828eba9SHisping Lin &TeecOperation, 1275a828eba9SHisping Lin &ErrorOrigin); 1276a828eba9SHisping Lin if (TeecResult != TEEC_SUCCESS) 1277a828eba9SHisping Lin goto exit; 1278a828eba9SHisping Lin 1279a828eba9SHisping Lin exit: 1280a828eba9SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem); 1281a828eba9SHisping Lin TEEC_CloseSession(&TeecSession); 1282a828eba9SHisping Lin TEEC_FinalizeContext(&TeecContext); 1283a828eba9SHisping Lin 1284a828eba9SHisping Lin return TeecResult; 1285a828eba9SHisping Lin } 1286a828eba9SHisping Lin 1287e8bc2655SHisping Lin uint32_t trusty_oem_hdcp_key_is_written(enum RK_HDCP_KEYID key_id, uint8_t *value) 1288e8bc2655SHisping Lin { 1289e8bc2655SHisping Lin TEEC_Result TeecResult; 1290e8bc2655SHisping Lin TEEC_Context TeecContext; 1291e8bc2655SHisping Lin TEEC_Session TeecSession; 1292e8bc2655SHisping Lin uint32_t ErrorOrigin; 1293e8bc2655SHisping Lin 1294e8bc2655SHisping Lin *value = 0xFF; 1295e8bc2655SHisping Lin 1296e8bc2655SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 1297e8bc2655SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 1298e8bc2655SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 1299e8bc2655SHisping Lin TEEC_Operation TeecOperation = {0}; 1300e8bc2655SHisping Lin 1301e8bc2655SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 1302e8bc2655SHisping Lin if (TeecResult != TEEC_SUCCESS) 1303e8bc2655SHisping Lin return TeecResult; 1304e8bc2655SHisping Lin 1305e8bc2655SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1306e8bc2655SHisping Lin if (TeecResult != TEEC_SUCCESS) 1307e8bc2655SHisping Lin return TeecResult; 1308e8bc2655SHisping Lin 1309e8bc2655SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 1310e8bc2655SHisping Lin &TeecSession, 1311e8bc2655SHisping Lin TeecUuid, 1312e8bc2655SHisping Lin TEEC_LOGIN_PUBLIC, 1313e8bc2655SHisping Lin NULL, 1314e8bc2655SHisping Lin NULL, 1315e8bc2655SHisping Lin &ErrorOrigin); 1316e8bc2655SHisping Lin if (TeecResult != TEEC_SUCCESS) 1317e8bc2655SHisping Lin return TeecResult; 1318e8bc2655SHisping Lin 1319e8bc2655SHisping Lin TeecOperation.params[0].value.a = key_id; 1320e8bc2655SHisping Lin 1321e8bc2655SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INOUT, 1322e8bc2655SHisping Lin TEEC_NONE, 1323e8bc2655SHisping Lin TEEC_NONE, 1324e8bc2655SHisping Lin TEEC_NONE); 1325e8bc2655SHisping Lin 1326e8bc2655SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 1327e8bc2655SHisping Lin STORAGE_CMD_OEM_HDCP_KEY_IS_WRITTEN, 1328e8bc2655SHisping Lin &TeecOperation, 1329e8bc2655SHisping Lin &ErrorOrigin); 1330e8bc2655SHisping Lin if (TeecResult == TEEC_SUCCESS) 1331e8bc2655SHisping Lin *value = TeecOperation.params[0].value.b; 1332e8bc2655SHisping Lin 1333e8bc2655SHisping Lin TEEC_CloseSession(&TeecSession); 1334e8bc2655SHisping Lin TEEC_FinalizeContext(&TeecContext); 1335e8bc2655SHisping Lin 1336e8bc2655SHisping Lin return TeecResult; 1337e8bc2655SHisping Lin } 1338e8bc2655SHisping Lin 1339bfd9cea4SHisping Lin uint32_t trusty_set_oem_hdcp_key_mask(enum RK_HDCP_KEYID key_id) 1340bfd9cea4SHisping Lin { 1341bfd9cea4SHisping Lin TEEC_Result TeecResult; 1342bfd9cea4SHisping Lin TEEC_Context TeecContext; 1343bfd9cea4SHisping Lin TEEC_Session TeecSession; 1344bfd9cea4SHisping Lin uint32_t ErrorOrigin; 1345bfd9cea4SHisping Lin 1346bfd9cea4SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 1347bfd9cea4SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 1348bfd9cea4SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 1349bfd9cea4SHisping Lin TEEC_Operation TeecOperation = {0}; 1350bfd9cea4SHisping Lin 1351bfd9cea4SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 1352bfd9cea4SHisping Lin if (TeecResult != TEEC_SUCCESS) 1353bfd9cea4SHisping Lin return TeecResult; 1354bfd9cea4SHisping Lin 1355bfd9cea4SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1356bfd9cea4SHisping Lin if (TeecResult != TEEC_SUCCESS) 1357bfd9cea4SHisping Lin return TeecResult; 1358bfd9cea4SHisping Lin 1359bfd9cea4SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 1360bfd9cea4SHisping Lin &TeecSession, 1361bfd9cea4SHisping Lin TeecUuid, 1362bfd9cea4SHisping Lin TEEC_LOGIN_PUBLIC, 1363bfd9cea4SHisping Lin NULL, 1364bfd9cea4SHisping Lin NULL, 1365bfd9cea4SHisping Lin &ErrorOrigin); 1366bfd9cea4SHisping Lin if (TeecResult != TEEC_SUCCESS) 1367bfd9cea4SHisping Lin return TeecResult; 1368bfd9cea4SHisping Lin 1369bfd9cea4SHisping Lin TeecOperation.params[0].value.a = key_id; 1370bfd9cea4SHisping Lin 1371bfd9cea4SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 1372bfd9cea4SHisping Lin TEEC_NONE, 1373bfd9cea4SHisping Lin TEEC_NONE, 1374bfd9cea4SHisping Lin TEEC_NONE); 1375bfd9cea4SHisping Lin 1376bfd9cea4SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 1377bfd9cea4SHisping Lin STORAGE_CMD_SET_OEM_HDCP_KEY_MASK, 1378bfd9cea4SHisping Lin &TeecOperation, 1379bfd9cea4SHisping Lin &ErrorOrigin); 1380bfd9cea4SHisping Lin if (TeecResult != TEEC_SUCCESS) 1381bfd9cea4SHisping Lin goto exit; 1382bfd9cea4SHisping Lin 1383bfd9cea4SHisping Lin exit: 1384bfd9cea4SHisping Lin TEEC_CloseSession(&TeecSession); 1385bfd9cea4SHisping Lin TEEC_FinalizeContext(&TeecContext); 1386bfd9cea4SHisping Lin 1387bfd9cea4SHisping Lin return TeecResult; 1388bfd9cea4SHisping Lin } 1389bfd9cea4SHisping Lin 1390ac6d8253SHisping Lin uint32_t trusty_write_esck_key(enum RK_ESCK_KEYID key_id, 1391ac6d8253SHisping Lin uint8_t *byte_buf, uint32_t byte_len) 1392ac6d8253SHisping Lin { 1393ac6d8253SHisping Lin TEEC_Result TeecResult; 1394ac6d8253SHisping Lin TEEC_Context TeecContext; 1395ac6d8253SHisping Lin TEEC_Session TeecSession; 1396ac6d8253SHisping Lin uint32_t ErrorOrigin; 1397ac6d8253SHisping Lin 1398ac6d8253SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 1399ac6d8253SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 1400ac6d8253SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 1401ac6d8253SHisping Lin TEEC_Operation TeecOperation = {0}; 1402ac6d8253SHisping Lin 1403ac6d8253SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 1404ac6d8253SHisping Lin if (TeecResult != TEEC_SUCCESS) 1405ac6d8253SHisping Lin return TeecResult; 1406ac6d8253SHisping Lin 1407ac6d8253SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1408ac6d8253SHisping Lin if (TeecResult != TEEC_SUCCESS) 1409ac6d8253SHisping Lin return TeecResult; 1410ac6d8253SHisping Lin 1411ac6d8253SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 1412ac6d8253SHisping Lin &TeecSession, 1413ac6d8253SHisping Lin TeecUuid, 1414ac6d8253SHisping Lin TEEC_LOGIN_PUBLIC, 1415ac6d8253SHisping Lin NULL, 1416ac6d8253SHisping Lin NULL, 1417ac6d8253SHisping Lin &ErrorOrigin); 1418ac6d8253SHisping Lin if (TeecResult != TEEC_SUCCESS) 1419ac6d8253SHisping Lin return TeecResult; 1420ac6d8253SHisping Lin 1421ac6d8253SHisping Lin TeecOperation.params[0].value.a = key_id; 1422ac6d8253SHisping Lin 1423ac6d8253SHisping Lin TEEC_SharedMemory SharedMem = {0}; 1424ac6d8253SHisping Lin 1425ac6d8253SHisping Lin SharedMem.size = byte_len; 1426ac6d8253SHisping Lin SharedMem.flags = 0; 1427ac6d8253SHisping Lin 1428ac6d8253SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem); 1429ac6d8253SHisping Lin if (TeecResult != TEEC_SUCCESS) 1430ac6d8253SHisping Lin goto exit; 1431ac6d8253SHisping Lin 1432ac6d8253SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem.buffer; 1433ac6d8253SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem.size; 1434ac6d8253SHisping Lin 1435ac6d8253SHisping Lin memcpy(SharedMem.buffer, byte_buf, SharedMem.size); 1436ac6d8253SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 1437ac6d8253SHisping Lin TEEC_MEMREF_TEMP_INPUT, 1438ac6d8253SHisping Lin TEEC_NONE, 1439ac6d8253SHisping Lin TEEC_NONE); 1440ac6d8253SHisping Lin 1441ac6d8253SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 1442ac6d8253SHisping Lin STORAGE_CMD_WRITE_ESCK_KEY, 1443ac6d8253SHisping Lin &TeecOperation, 1444ac6d8253SHisping Lin &ErrorOrigin); 1445ac6d8253SHisping Lin if (TeecResult != TEEC_SUCCESS) 1446ac6d8253SHisping Lin goto exit; 1447ac6d8253SHisping Lin 1448ac6d8253SHisping Lin exit: 1449ac6d8253SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem); 1450ac6d8253SHisping Lin TEEC_CloseSession(&TeecSession); 1451ac6d8253SHisping Lin TEEC_FinalizeContext(&TeecContext); 1452ac6d8253SHisping Lin 1453ac6d8253SHisping Lin return TeecResult; 1454ac6d8253SHisping Lin } 1455ac6d8253SHisping Lin 1456ac6d8253SHisping Lin uint32_t trusty_esck_key_is_written(enum RK_ESCK_KEYID key_id, uint8_t *value) 1457ac6d8253SHisping Lin { 1458ac6d8253SHisping Lin TEEC_Result TeecResult; 1459ac6d8253SHisping Lin TEEC_Context TeecContext; 1460ac6d8253SHisping Lin TEEC_Session TeecSession; 1461ac6d8253SHisping Lin uint32_t ErrorOrigin; 1462ac6d8253SHisping Lin 1463ac6d8253SHisping Lin *value = 0xFF; 1464ac6d8253SHisping Lin 1465ac6d8253SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 1466ac6d8253SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 1467ac6d8253SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 1468ac6d8253SHisping Lin TEEC_Operation TeecOperation = {0}; 1469ac6d8253SHisping Lin 1470ac6d8253SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 1471ac6d8253SHisping Lin if (TeecResult != TEEC_SUCCESS) 1472ac6d8253SHisping Lin return TeecResult; 1473ac6d8253SHisping Lin 1474ac6d8253SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1475ac6d8253SHisping Lin if (TeecResult != TEEC_SUCCESS) 1476ac6d8253SHisping Lin return TeecResult; 1477ac6d8253SHisping Lin 1478ac6d8253SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 1479ac6d8253SHisping Lin &TeecSession, 1480ac6d8253SHisping Lin TeecUuid, 1481ac6d8253SHisping Lin TEEC_LOGIN_PUBLIC, 1482ac6d8253SHisping Lin NULL, 1483ac6d8253SHisping Lin NULL, 1484ac6d8253SHisping Lin &ErrorOrigin); 1485ac6d8253SHisping Lin if (TeecResult != TEEC_SUCCESS) 1486ac6d8253SHisping Lin return TeecResult; 1487ac6d8253SHisping Lin 1488ac6d8253SHisping Lin TeecOperation.params[0].value.a = key_id; 1489ac6d8253SHisping Lin 1490ac6d8253SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INOUT, 1491ac6d8253SHisping Lin TEEC_NONE, 1492ac6d8253SHisping Lin TEEC_NONE, 1493ac6d8253SHisping Lin TEEC_NONE); 1494ac6d8253SHisping Lin 1495ac6d8253SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 1496ac6d8253SHisping Lin STORAGE_CMD_ESCK_KEY_IS_WRITTEN, 1497ac6d8253SHisping Lin &TeecOperation, 1498ac6d8253SHisping Lin &ErrorOrigin); 1499ac6d8253SHisping Lin if (TeecResult == TEEC_SUCCESS) 1500ac6d8253SHisping Lin *value = TeecOperation.params[0].value.b; 1501ac6d8253SHisping Lin 1502ac6d8253SHisping Lin TEEC_CloseSession(&TeecSession); 1503ac6d8253SHisping Lin TEEC_FinalizeContext(&TeecContext); 1504ac6d8253SHisping Lin 1505ac6d8253SHisping Lin return TeecResult; 1506ac6d8253SHisping Lin } 1507ac6d8253SHisping Lin 1508ac6d8253SHisping Lin uint32_t trusty_set_esck_key_mask(enum RK_ESCK_KEYID key_id) 1509ac6d8253SHisping Lin { 1510ac6d8253SHisping Lin TEEC_Result TeecResult; 1511ac6d8253SHisping Lin TEEC_Context TeecContext; 1512ac6d8253SHisping Lin TEEC_Session TeecSession; 1513ac6d8253SHisping Lin uint32_t ErrorOrigin; 1514ac6d8253SHisping Lin 1515ac6d8253SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 1516ac6d8253SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 1517ac6d8253SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 1518ac6d8253SHisping Lin TEEC_Operation TeecOperation = {0}; 1519ac6d8253SHisping Lin 1520ac6d8253SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 1521ac6d8253SHisping Lin if (TeecResult != TEEC_SUCCESS) 1522ac6d8253SHisping Lin return TeecResult; 1523ac6d8253SHisping Lin 1524ac6d8253SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1525ac6d8253SHisping Lin if (TeecResult != TEEC_SUCCESS) 1526ac6d8253SHisping Lin return TeecResult; 1527ac6d8253SHisping Lin 1528ac6d8253SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 1529ac6d8253SHisping Lin &TeecSession, 1530ac6d8253SHisping Lin TeecUuid, 1531ac6d8253SHisping Lin TEEC_LOGIN_PUBLIC, 1532ac6d8253SHisping Lin NULL, 1533ac6d8253SHisping Lin NULL, 1534ac6d8253SHisping Lin &ErrorOrigin); 1535ac6d8253SHisping Lin if (TeecResult != TEEC_SUCCESS) 1536ac6d8253SHisping Lin return TeecResult; 1537ac6d8253SHisping Lin 1538ac6d8253SHisping Lin TeecOperation.params[0].value.a = key_id; 1539ac6d8253SHisping Lin 1540ac6d8253SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 1541ac6d8253SHisping Lin TEEC_NONE, 1542ac6d8253SHisping Lin TEEC_NONE, 1543ac6d8253SHisping Lin TEEC_NONE); 1544ac6d8253SHisping Lin 1545ac6d8253SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 1546ac6d8253SHisping Lin STORAGE_CMD_SET_ESCK_KEY_MASK, 1547ac6d8253SHisping Lin &TeecOperation, 1548ac6d8253SHisping Lin &ErrorOrigin); 1549ac6d8253SHisping Lin if (TeecResult != TEEC_SUCCESS) 1550ac6d8253SHisping Lin goto exit; 1551ac6d8253SHisping Lin 1552ac6d8253SHisping Lin exit: 1553ac6d8253SHisping Lin TEEC_CloseSession(&TeecSession); 1554ac6d8253SHisping Lin TEEC_FinalizeContext(&TeecContext); 1555ac6d8253SHisping Lin 1556ac6d8253SHisping Lin return TeecResult; 1557ac6d8253SHisping Lin } 1558ac6d8253SHisping Lin 1559*11b25801SHisping Lin uint32_t trusty_write_fw_encrypt_key(enum RK_FW_KEYID key_id, 1560*11b25801SHisping Lin uint8_t *byte_buf, uint32_t byte_len) 1561*11b25801SHisping Lin { 1562*11b25801SHisping Lin TEEC_Result TeecResult; 1563*11b25801SHisping Lin TEEC_Context TeecContext; 1564*11b25801SHisping Lin TEEC_Session TeecSession; 1565*11b25801SHisping Lin uint32_t ErrorOrigin; 1566*11b25801SHisping Lin 1567*11b25801SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 1568*11b25801SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 1569*11b25801SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 1570*11b25801SHisping Lin TEEC_Operation TeecOperation = {0}; 1571*11b25801SHisping Lin 1572*11b25801SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 1573*11b25801SHisping Lin if (TeecResult != TEEC_SUCCESS) 1574*11b25801SHisping Lin return TeecResult; 1575*11b25801SHisping Lin 1576*11b25801SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1577*11b25801SHisping Lin if (TeecResult != TEEC_SUCCESS) 1578*11b25801SHisping Lin return TeecResult; 1579*11b25801SHisping Lin 1580*11b25801SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 1581*11b25801SHisping Lin &TeecSession, 1582*11b25801SHisping Lin TeecUuid, 1583*11b25801SHisping Lin TEEC_LOGIN_PUBLIC, 1584*11b25801SHisping Lin NULL, 1585*11b25801SHisping Lin NULL, 1586*11b25801SHisping Lin &ErrorOrigin); 1587*11b25801SHisping Lin if (TeecResult != TEEC_SUCCESS) 1588*11b25801SHisping Lin return TeecResult; 1589*11b25801SHisping Lin 1590*11b25801SHisping Lin TeecOperation.params[0].value.a = key_id; 1591*11b25801SHisping Lin 1592*11b25801SHisping Lin TEEC_SharedMemory SharedMem = {0}; 1593*11b25801SHisping Lin 1594*11b25801SHisping Lin SharedMem.size = byte_len; 1595*11b25801SHisping Lin SharedMem.flags = 0; 1596*11b25801SHisping Lin 1597*11b25801SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem); 1598*11b25801SHisping Lin if (TeecResult != TEEC_SUCCESS) 1599*11b25801SHisping Lin goto exit; 1600*11b25801SHisping Lin 1601*11b25801SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem.buffer; 1602*11b25801SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem.size; 1603*11b25801SHisping Lin 1604*11b25801SHisping Lin memcpy(SharedMem.buffer, byte_buf, SharedMem.size); 1605*11b25801SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 1606*11b25801SHisping Lin TEEC_MEMREF_TEMP_INPUT, 1607*11b25801SHisping Lin TEEC_NONE, 1608*11b25801SHisping Lin TEEC_NONE); 1609*11b25801SHisping Lin 1610*11b25801SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 1611*11b25801SHisping Lin STORAGE_CMD_WRITE_FW_ENCRYPT_KEY, 1612*11b25801SHisping Lin &TeecOperation, 1613*11b25801SHisping Lin &ErrorOrigin); 1614*11b25801SHisping Lin if (TeecResult != TEEC_SUCCESS) 1615*11b25801SHisping Lin goto exit; 1616*11b25801SHisping Lin 1617*11b25801SHisping Lin exit: 1618*11b25801SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem); 1619*11b25801SHisping Lin TEEC_CloseSession(&TeecSession); 1620*11b25801SHisping Lin TEEC_FinalizeContext(&TeecContext); 1621*11b25801SHisping Lin 1622*11b25801SHisping Lin return TeecResult; 1623*11b25801SHisping Lin } 1624*11b25801SHisping Lin 1625*11b25801SHisping Lin uint32_t trusty_fw_encrypt_key_is_written(enum RK_FW_KEYID key_id, uint8_t *value) 1626*11b25801SHisping Lin { 1627*11b25801SHisping Lin TEEC_Result TeecResult; 1628*11b25801SHisping Lin TEEC_Context TeecContext; 1629*11b25801SHisping Lin TEEC_Session TeecSession; 1630*11b25801SHisping Lin uint32_t ErrorOrigin; 1631*11b25801SHisping Lin 1632*11b25801SHisping Lin *value = 0xFF; 1633*11b25801SHisping Lin 1634*11b25801SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 1635*11b25801SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 1636*11b25801SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 1637*11b25801SHisping Lin TEEC_Operation TeecOperation = {0}; 1638*11b25801SHisping Lin 1639*11b25801SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 1640*11b25801SHisping Lin if (TeecResult != TEEC_SUCCESS) 1641*11b25801SHisping Lin return TeecResult; 1642*11b25801SHisping Lin 1643*11b25801SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1644*11b25801SHisping Lin if (TeecResult != TEEC_SUCCESS) 1645*11b25801SHisping Lin return TeecResult; 1646*11b25801SHisping Lin 1647*11b25801SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 1648*11b25801SHisping Lin &TeecSession, 1649*11b25801SHisping Lin TeecUuid, 1650*11b25801SHisping Lin TEEC_LOGIN_PUBLIC, 1651*11b25801SHisping Lin NULL, 1652*11b25801SHisping Lin NULL, 1653*11b25801SHisping Lin &ErrorOrigin); 1654*11b25801SHisping Lin if (TeecResult != TEEC_SUCCESS) 1655*11b25801SHisping Lin return TeecResult; 1656*11b25801SHisping Lin 1657*11b25801SHisping Lin TeecOperation.params[0].value.a = key_id; 1658*11b25801SHisping Lin 1659*11b25801SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INOUT, 1660*11b25801SHisping Lin TEEC_NONE, 1661*11b25801SHisping Lin TEEC_NONE, 1662*11b25801SHisping Lin TEEC_NONE); 1663*11b25801SHisping Lin 1664*11b25801SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 1665*11b25801SHisping Lin STORAGE_CMD_FW_ENCRYPT_KEY_IS_WRITTEN, 1666*11b25801SHisping Lin &TeecOperation, 1667*11b25801SHisping Lin &ErrorOrigin); 1668*11b25801SHisping Lin if (TeecResult == TEEC_SUCCESS) 1669*11b25801SHisping Lin *value = TeecOperation.params[0].value.b; 1670*11b25801SHisping Lin 1671*11b25801SHisping Lin TEEC_CloseSession(&TeecSession); 1672*11b25801SHisping Lin TEEC_FinalizeContext(&TeecContext); 1673*11b25801SHisping Lin 1674*11b25801SHisping Lin return TeecResult; 1675*11b25801SHisping Lin } 1676*11b25801SHisping Lin 1677*11b25801SHisping Lin uint32_t trusty_set_fw_encrypt_key_mask(enum RK_FW_KEYID key_id) 1678*11b25801SHisping Lin { 1679*11b25801SHisping Lin TEEC_Result TeecResult; 1680*11b25801SHisping Lin TEEC_Context TeecContext; 1681*11b25801SHisping Lin TEEC_Session TeecSession; 1682*11b25801SHisping Lin uint32_t ErrorOrigin; 1683*11b25801SHisping Lin 1684*11b25801SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 1685*11b25801SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 1686*11b25801SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 1687*11b25801SHisping Lin TEEC_Operation TeecOperation = {0}; 1688*11b25801SHisping Lin 1689*11b25801SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 1690*11b25801SHisping Lin if (TeecResult != TEEC_SUCCESS) 1691*11b25801SHisping Lin return TeecResult; 1692*11b25801SHisping Lin 1693*11b25801SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1694*11b25801SHisping Lin if (TeecResult != TEEC_SUCCESS) 1695*11b25801SHisping Lin return TeecResult; 1696*11b25801SHisping Lin 1697*11b25801SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 1698*11b25801SHisping Lin &TeecSession, 1699*11b25801SHisping Lin TeecUuid, 1700*11b25801SHisping Lin TEEC_LOGIN_PUBLIC, 1701*11b25801SHisping Lin NULL, 1702*11b25801SHisping Lin NULL, 1703*11b25801SHisping Lin &ErrorOrigin); 1704*11b25801SHisping Lin if (TeecResult != TEEC_SUCCESS) 1705*11b25801SHisping Lin return TeecResult; 1706*11b25801SHisping Lin 1707*11b25801SHisping Lin TeecOperation.params[0].value.a = key_id; 1708*11b25801SHisping Lin 1709*11b25801SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 1710*11b25801SHisping Lin TEEC_NONE, 1711*11b25801SHisping Lin TEEC_NONE, 1712*11b25801SHisping Lin TEEC_NONE); 1713*11b25801SHisping Lin 1714*11b25801SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 1715*11b25801SHisping Lin STORAGE_CMD_SET_FW_ENCRYPT_KEY_MASK, 1716*11b25801SHisping Lin &TeecOperation, 1717*11b25801SHisping Lin &ErrorOrigin); 1718*11b25801SHisping Lin if (TeecResult != TEEC_SUCCESS) 1719*11b25801SHisping Lin goto exit; 1720*11b25801SHisping Lin 1721*11b25801SHisping Lin exit: 1722*11b25801SHisping Lin TEEC_CloseSession(&TeecSession); 1723*11b25801SHisping Lin TEEC_FinalizeContext(&TeecContext); 1724*11b25801SHisping Lin 1725*11b25801SHisping Lin return TeecResult; 1726*11b25801SHisping Lin } 17274d4c5043SHisping Lin uint32_t trusty_oem_user_ta_transfer(void) 17284d4c5043SHisping Lin { 17294d4c5043SHisping Lin TEEC_Result TeecResult; 17304d4c5043SHisping Lin TEEC_Context TeecContext; 17314d4c5043SHisping Lin TEEC_Session TeecSession; 17324d4c5043SHisping Lin uint32_t ErrorOrigin; 17334d4c5043SHisping Lin TEEC_UUID tempuuid = { 0x1db57234, 0xdacd, 0x462d, 17344d4c5043SHisping Lin { 0x9b, 0xb1, 0xae, 0x79, 0xde, 0x44, 0xe2, 0xa5} }; 17354d4c5043SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 17364d4c5043SHisping Lin TEEC_Operation TeecOperation = {0}; 17374d4c5043SHisping Lin const uint8_t transfer_inout[] = "Transfer data test."; 17384d4c5043SHisping Lin 17394d4c5043SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 17404d4c5043SHisping Lin if (TeecResult != TEEC_SUCCESS) 17414d4c5043SHisping Lin return TeecResult; 17424d4c5043SHisping Lin 17434d4c5043SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 17444d4c5043SHisping Lin if (TeecResult != TEEC_SUCCESS) 17454d4c5043SHisping Lin return TeecResult; 17464d4c5043SHisping Lin 17474d4c5043SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE, 17484d4c5043SHisping Lin TEEC_NONE, 17494d4c5043SHisping Lin TEEC_NONE, 17504d4c5043SHisping Lin TEEC_NONE); 17514d4c5043SHisping Lin 17524d4c5043SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 17534d4c5043SHisping Lin &TeecSession, 17544d4c5043SHisping Lin TeecUuid, 17554d4c5043SHisping Lin TEEC_LOGIN_PUBLIC, 17564d4c5043SHisping Lin NULL, 17574d4c5043SHisping Lin &TeecOperation, 17584d4c5043SHisping Lin &ErrorOrigin); 17594d4c5043SHisping Lin if (TeecResult != TEEC_SUCCESS) 17604d4c5043SHisping Lin return TeecResult; 17614d4c5043SHisping Lin 17624d4c5043SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 17634d4c5043SHisping Lin 17644d4c5043SHisping Lin SharedMem0.size = sizeof(transfer_inout); 17654d4c5043SHisping Lin SharedMem0.flags = 0; 17664d4c5043SHisping Lin 17674d4c5043SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 17684d4c5043SHisping Lin if (TeecResult != TEEC_SUCCESS) 17694d4c5043SHisping Lin goto exit; 17704d4c5043SHisping Lin 17714d4c5043SHisping Lin memcpy(SharedMem0.buffer, transfer_inout, SharedMem0.size); 17724d4c5043SHisping Lin 17734d4c5043SHisping Lin TEEC_SharedMemory SharedMem1 = {0}; 17744d4c5043SHisping Lin 17754d4c5043SHisping Lin SharedMem1.size = sizeof(transfer_inout); 17764d4c5043SHisping Lin SharedMem1.flags = 0; 17774d4c5043SHisping Lin 17784d4c5043SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 17794d4c5043SHisping Lin if (TeecResult != TEEC_SUCCESS) 17804d4c5043SHisping Lin goto exit; 17814d4c5043SHisping Lin 17824d4c5043SHisping Lin TeecOperation.params[0].value.a = 66; 17834d4c5043SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem0.buffer; 17844d4c5043SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem0.size; 17854d4c5043SHisping Lin TeecOperation.params[2].tmpref.buffer = SharedMem1.buffer; 17864d4c5043SHisping Lin TeecOperation.params[2].tmpref.size = SharedMem1.size; 17874d4c5043SHisping Lin 17884d4c5043SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INOUT, 17894d4c5043SHisping Lin TEEC_MEMREF_TEMP_INPUT, 17904d4c5043SHisping Lin TEEC_MEMREF_TEMP_OUTPUT, 17914d4c5043SHisping Lin TEEC_NONE); 17924d4c5043SHisping Lin 17934d4c5043SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 17944d4c5043SHisping Lin 102, 17954d4c5043SHisping Lin &TeecOperation, 17964d4c5043SHisping Lin &ErrorOrigin); 17974d4c5043SHisping Lin if (TeecResult != TEEC_SUCCESS) 17984d4c5043SHisping Lin goto exit; 17994d4c5043SHisping Lin 18004d4c5043SHisping Lin //Check the result 18014d4c5043SHisping Lin if (TeecOperation.params[0].value.a == 66 + 1 && 18024d4c5043SHisping Lin TeecOperation.params[0].value.b == TeecOperation.params[0].value.a) 18034d4c5043SHisping Lin printf("test value : Pass!\n"); 18044d4c5043SHisping Lin else 18054d4c5043SHisping Lin printf("test value : Fail! (mismatch values)\n"); 18064d4c5043SHisping Lin 18074d4c5043SHisping Lin if (memcmp(SharedMem1.buffer, transfer_inout, sizeof(transfer_inout)) == 0) 18084d4c5043SHisping Lin printf("test buffer : Pass!\n"); 18094d4c5043SHisping Lin else 18104d4c5043SHisping Lin printf("test buffer : Fail! (mismatch buffer)\n"); 18114d4c5043SHisping Lin 18124d4c5043SHisping Lin exit: 18134d4c5043SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 18144d4c5043SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem1); 18154d4c5043SHisping Lin TEEC_CloseSession(&TeecSession); 18164d4c5043SHisping Lin TEEC_FinalizeContext(&TeecContext); 18174d4c5043SHisping Lin 18184d4c5043SHisping Lin return TeecResult; 18194d4c5043SHisping Lin } 18204d4c5043SHisping Lin 18214d4c5043SHisping Lin uint32_t trusty_oem_user_ta_storage(void) 18224d4c5043SHisping Lin { 18234d4c5043SHisping Lin TEEC_Result TeecResult; 18244d4c5043SHisping Lin TEEC_Context TeecContext; 18254d4c5043SHisping Lin TEEC_Session TeecSession; 18264d4c5043SHisping Lin uint32_t ErrorOrigin; 18274d4c5043SHisping Lin TEEC_UUID tempuuid = { 0x1db57234, 0xdacd, 0x462d, 18284d4c5043SHisping Lin { 0x9b, 0xb1, 0xae, 0x79, 0xde, 0x44, 0xe2, 0xa5} }; 18294d4c5043SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 18304d4c5043SHisping Lin TEEC_Operation TeecOperation = {0}; 18314d4c5043SHisping Lin 18324d4c5043SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 18334d4c5043SHisping Lin if (TeecResult != TEEC_SUCCESS) 18344d4c5043SHisping Lin return TeecResult; 18354d4c5043SHisping Lin 18364d4c5043SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 18374d4c5043SHisping Lin if (TeecResult != TEEC_SUCCESS) 18384d4c5043SHisping Lin return TeecResult; 18394d4c5043SHisping Lin 18404d4c5043SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE, 18414d4c5043SHisping Lin TEEC_NONE, 18424d4c5043SHisping Lin TEEC_NONE, 18434d4c5043SHisping Lin TEEC_NONE); 18444d4c5043SHisping Lin 18454d4c5043SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 18464d4c5043SHisping Lin &TeecSession, 18474d4c5043SHisping Lin TeecUuid, 18484d4c5043SHisping Lin TEEC_LOGIN_PUBLIC, 18494d4c5043SHisping Lin NULL, 18504d4c5043SHisping Lin &TeecOperation, 18514d4c5043SHisping Lin &ErrorOrigin); 18524d4c5043SHisping Lin if (TeecResult != TEEC_SUCCESS) 18534d4c5043SHisping Lin return TeecResult; 18544d4c5043SHisping Lin 18554d4c5043SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE, 18564d4c5043SHisping Lin TEEC_NONE, 18574d4c5043SHisping Lin TEEC_NONE, 18584d4c5043SHisping Lin TEEC_NONE); 18594d4c5043SHisping Lin 18604d4c5043SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 18614d4c5043SHisping Lin 103, 18624d4c5043SHisping Lin &TeecOperation, 18634d4c5043SHisping Lin &ErrorOrigin); 18644d4c5043SHisping Lin if (TeecResult != TEEC_SUCCESS) 18654d4c5043SHisping Lin goto exit; 18664d4c5043SHisping Lin 18674d4c5043SHisping Lin exit: 18684d4c5043SHisping Lin TEEC_CloseSession(&TeecSession); 18694d4c5043SHisping Lin TEEC_FinalizeContext(&TeecContext); 18704d4c5043SHisping Lin 18714d4c5043SHisping Lin return TeecResult; 18724d4c5043SHisping Lin } 18734d4c5043SHisping Lin 18744aa61755SAndy Ye uint32_t trusty_attest_dh(uint8_t *dh, uint32_t *dh_size) 18754aa61755SAndy Ye { 18764aa61755SAndy Ye TEEC_Result TeecResult; 18774aa61755SAndy Ye TEEC_Context TeecContext; 18784aa61755SAndy Ye TEEC_Session TeecSession; 18794aa61755SAndy Ye uint32_t ErrorOrigin; 18804aa61755SAndy Ye TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6, 18814aa61755SAndy Ye { 0xa8, 0x69, 0x9c, 0xe6, 18824aa61755SAndy Ye 0x88, 0x6c, 0x5d, 0x5d 18834aa61755SAndy Ye } 18844aa61755SAndy Ye }; 18854aa61755SAndy Ye TEEC_UUID *TeecUuid = &tempuuid; 18864aa61755SAndy Ye TEEC_Operation TeecOperation = {0}; 18873251364cSHisping Lin struct blk_desc *dev_desc; 18883251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 18896651d4c0SJason Zhu if (!dev_desc) { 18906651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 18916651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 18926651d4c0SJason Zhu } 18934aa61755SAndy Ye 1894f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 1895f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1896f4e1db95SHisping Lin return TeecResult; 18974aa61755SAndy Ye 18984aa61755SAndy Ye TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1899f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1900f4e1db95SHisping Lin return TeecResult; 19014aa61755SAndy Ye 19023251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 19033251364cSHisping Lin TEEC_NONE, 19043251364cSHisping Lin TEEC_NONE, 19053251364cSHisping Lin TEEC_NONE); 19063251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 1907b9a7e756SHisping Lin if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0) 1908b9a7e756SHisping Lin TeecOperation.params[0].value.a = 1; 1909b9a7e756SHisping Lin else 1910b9a7e756SHisping Lin TeecOperation.params[0].value.a = 0; 1911b9a7e756SHisping Lin 19123251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 19133251364cSHisping Lin TeecOperation.params[0].value.a = 0; 19143251364cSHisping Lin #endif 19153251364cSHisping Lin 19164aa61755SAndy Ye TeecResult = TEEC_OpenSession(&TeecContext, 19174aa61755SAndy Ye &TeecSession, 19184aa61755SAndy Ye TeecUuid, 19194aa61755SAndy Ye TEEC_LOGIN_PUBLIC, 19204aa61755SAndy Ye NULL, 19213251364cSHisping Lin &TeecOperation, 19224aa61755SAndy Ye &ErrorOrigin); 1923f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1924f4e1db95SHisping Lin return TeecResult; 19254aa61755SAndy Ye 19264aa61755SAndy Ye TEEC_SharedMemory SharedMem0 = {0}; 19274aa61755SAndy Ye 19284aa61755SAndy Ye SharedMem0.size = *dh_size; 19294aa61755SAndy Ye SharedMem0.flags = 0; 19304aa61755SAndy Ye 19314aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 1932f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1933f4e1db95SHisping Lin goto exit; 19344aa61755SAndy Ye 19354aa61755SAndy Ye TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 19364aa61755SAndy Ye TeecOperation.params[0].tmpref.size = SharedMem0.size; 19374aa61755SAndy Ye 19384aa61755SAndy Ye TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, 19394aa61755SAndy Ye TEEC_NONE, 19404aa61755SAndy Ye TEEC_NONE, 19414aa61755SAndy Ye TEEC_NONE); 19424aa61755SAndy Ye 19434aa61755SAndy Ye TeecResult = TEEC_InvokeCommand(&TeecSession, 19444aa61755SAndy Ye 143, 19454aa61755SAndy Ye &TeecOperation, 19464aa61755SAndy Ye &ErrorOrigin); 1947f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1948f4e1db95SHisping Lin goto exit; 19494aa61755SAndy Ye 19504aa61755SAndy Ye *dh_size = TeecOperation.params[0].tmpref.size; 19514aa61755SAndy Ye memcpy(dh, SharedMem0.buffer, SharedMem0.size); 1952f4e1db95SHisping Lin exit: 19534aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem0); 19544aa61755SAndy Ye TEEC_CloseSession(&TeecSession); 1955f4e1db95SHisping Lin TEEC_FinalizeContext(&TeecContext); 19564aa61755SAndy Ye 19574aa61755SAndy Ye return TeecResult; 19584aa61755SAndy Ye } 19594aa61755SAndy Ye 19604aa61755SAndy Ye uint32_t trusty_attest_uuid(uint8_t *uuid, uint32_t *uuid_size) 19614aa61755SAndy Ye { 19624aa61755SAndy Ye TEEC_Result TeecResult; 19634aa61755SAndy Ye TEEC_Context TeecContext; 19644aa61755SAndy Ye TEEC_Session TeecSession; 19654aa61755SAndy Ye uint32_t ErrorOrigin; 19664aa61755SAndy Ye TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6, 19674aa61755SAndy Ye { 0xa8, 0x69, 0x9c, 0xe6, 19684aa61755SAndy Ye 0x88, 0x6c, 0x5d, 0x5d 19694aa61755SAndy Ye } 19704aa61755SAndy Ye }; 19714aa61755SAndy Ye TEEC_UUID *TeecUuid = &tempuuid; 19724aa61755SAndy Ye TEEC_Operation TeecOperation = {0}; 19733251364cSHisping Lin struct blk_desc *dev_desc; 19743251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 19756651d4c0SJason Zhu if (!dev_desc) { 19766651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 19776651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 19786651d4c0SJason Zhu } 19794aa61755SAndy Ye 1980f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 1981f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1982f4e1db95SHisping Lin return TeecResult; 19834aa61755SAndy Ye 19844aa61755SAndy Ye TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1985f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1986f4e1db95SHisping Lin return TeecResult; 19874aa61755SAndy Ye 19883251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 19893251364cSHisping Lin TEEC_NONE, 19903251364cSHisping Lin TEEC_NONE, 19913251364cSHisping Lin TEEC_NONE); 19923251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 1993b9a7e756SHisping Lin if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0) 1994b9a7e756SHisping Lin TeecOperation.params[0].value.a = 1; 1995b9a7e756SHisping Lin else 1996b9a7e756SHisping Lin TeecOperation.params[0].value.a = 0; 1997b9a7e756SHisping Lin 19983251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 19993251364cSHisping Lin TeecOperation.params[0].value.a = 0; 20003251364cSHisping Lin #endif 20013251364cSHisping Lin 20024aa61755SAndy Ye TeecResult = TEEC_OpenSession(&TeecContext, 20034aa61755SAndy Ye &TeecSession, 20044aa61755SAndy Ye TeecUuid, 20054aa61755SAndy Ye TEEC_LOGIN_PUBLIC, 20064aa61755SAndy Ye NULL, 20073251364cSHisping Lin &TeecOperation, 20084aa61755SAndy Ye &ErrorOrigin); 2009f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 2010f4e1db95SHisping Lin return TeecResult; 20114aa61755SAndy Ye 20124aa61755SAndy Ye TEEC_SharedMemory SharedMem0 = {0}; 20134aa61755SAndy Ye 20144aa61755SAndy Ye SharedMem0.size = *uuid_size; 20154aa61755SAndy Ye SharedMem0.flags = 0; 20164aa61755SAndy Ye 20174aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 2018f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 2019f4e1db95SHisping Lin goto exit; 20204aa61755SAndy Ye 20214aa61755SAndy Ye TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 20224aa61755SAndy Ye TeecOperation.params[0].tmpref.size = SharedMem0.size; 20234aa61755SAndy Ye 20244aa61755SAndy Ye TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, 20254aa61755SAndy Ye TEEC_NONE, 20264aa61755SAndy Ye TEEC_NONE, 20274aa61755SAndy Ye TEEC_NONE); 20284aa61755SAndy Ye 20294aa61755SAndy Ye TeecResult = TEEC_InvokeCommand(&TeecSession, 20304aa61755SAndy Ye 144, 20314aa61755SAndy Ye &TeecOperation, 20324aa61755SAndy Ye &ErrorOrigin); 2033f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 2034f4e1db95SHisping Lin goto exit; 20354aa61755SAndy Ye 20364aa61755SAndy Ye *uuid_size = TeecOperation.params[0].tmpref.size; 20374aa61755SAndy Ye memcpy(uuid, SharedMem0.buffer, SharedMem0.size); 2038f4e1db95SHisping Lin exit: 20394aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem0); 20404aa61755SAndy Ye TEEC_CloseSession(&TeecSession); 2041f4e1db95SHisping Lin TEEC_FinalizeContext(&TeecContext); 20424aa61755SAndy Ye 20434aa61755SAndy Ye return TeecResult; 20444aa61755SAndy Ye } 20454aa61755SAndy Ye 20464aa61755SAndy Ye uint32_t trusty_attest_get_ca(uint8_t *operation_start, 20474aa61755SAndy Ye uint32_t *operation_size, 20484aa61755SAndy Ye uint8_t *out, 20494aa61755SAndy Ye uint32_t *out_len) 20504aa61755SAndy Ye { 20514aa61755SAndy Ye TEEC_Result TeecResult; 20524aa61755SAndy Ye TEEC_Context TeecContext; 20534aa61755SAndy Ye TEEC_Session TeecSession; 20544aa61755SAndy Ye uint32_t ErrorOrigin; 20554aa61755SAndy Ye 20564aa61755SAndy Ye TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6, 20574aa61755SAndy Ye { 0xa8, 0x69, 0x9c, 0xe6, 20584aa61755SAndy Ye 0x88, 0x6c, 0x5d, 0x5d 20594aa61755SAndy Ye } 20604aa61755SAndy Ye }; 20614aa61755SAndy Ye 20624aa61755SAndy Ye TEEC_UUID *TeecUuid = &tempuuid; 20634aa61755SAndy Ye TEEC_Operation TeecOperation = {0}; 20643251364cSHisping Lin struct blk_desc *dev_desc; 20653251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 20666651d4c0SJason Zhu if (!dev_desc) { 20676651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 20686651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 20696651d4c0SJason Zhu } 20704aa61755SAndy Ye 2071f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 2072f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 2073f4e1db95SHisping Lin return TeecResult; 20744aa61755SAndy Ye 20754aa61755SAndy Ye TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 2076f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 2077f4e1db95SHisping Lin return TeecResult; 20784aa61755SAndy Ye 20793251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 20803251364cSHisping Lin TEEC_NONE, 20813251364cSHisping Lin TEEC_NONE, 20823251364cSHisping Lin TEEC_NONE); 20833251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 2084b9a7e756SHisping Lin if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0) 2085b9a7e756SHisping Lin TeecOperation.params[0].value.a = 1; 2086b9a7e756SHisping Lin else 2087b9a7e756SHisping Lin TeecOperation.params[0].value.a = 0; 2088b9a7e756SHisping Lin 20893251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 20903251364cSHisping Lin TeecOperation.params[0].value.a = 0; 20913251364cSHisping Lin #endif 20923251364cSHisping Lin 20934aa61755SAndy Ye TeecResult = TEEC_OpenSession(&TeecContext, 20944aa61755SAndy Ye &TeecSession, 20954aa61755SAndy Ye TeecUuid, 20964aa61755SAndy Ye TEEC_LOGIN_PUBLIC, 20974aa61755SAndy Ye NULL, 20983251364cSHisping Lin &TeecOperation, 20994aa61755SAndy Ye &ErrorOrigin); 2100f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 2101f4e1db95SHisping Lin return TeecResult; 21024aa61755SAndy Ye 21034aa61755SAndy Ye TEEC_SharedMemory SharedMem0 = {0}; 21044aa61755SAndy Ye 21054aa61755SAndy Ye SharedMem0.size = *operation_size; 21064aa61755SAndy Ye SharedMem0.flags = 0; 21074aa61755SAndy Ye 21084aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 2109f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 2110f4e1db95SHisping Lin goto exit; 21114aa61755SAndy Ye 21124aa61755SAndy Ye memcpy(SharedMem0.buffer, operation_start, SharedMem0.size); 21134aa61755SAndy Ye 21144aa61755SAndy Ye TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 21154aa61755SAndy Ye TeecOperation.params[0].tmpref.size = SharedMem0.size; 21164aa61755SAndy Ye 21174aa61755SAndy Ye TEEC_SharedMemory SharedMem1 = {0}; 21184aa61755SAndy Ye 21194aa61755SAndy Ye SharedMem1.size = *out_len; 21204aa61755SAndy Ye SharedMem1.flags = 0; 21214aa61755SAndy Ye 21224aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 2123f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 2124f4e1db95SHisping Lin goto exit; 21254aa61755SAndy Ye 21264aa61755SAndy Ye TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 21274aa61755SAndy Ye TeecOperation.params[1].tmpref.size = SharedMem1.size; 21284aa61755SAndy Ye 21294aa61755SAndy Ye TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, 21304aa61755SAndy Ye TEEC_MEMREF_TEMP_INOUT, 21314aa61755SAndy Ye TEEC_NONE, 21324aa61755SAndy Ye TEEC_NONE); 21334aa61755SAndy Ye 21344aa61755SAndy Ye TeecResult = TEEC_InvokeCommand(&TeecSession, 21354aa61755SAndy Ye 145, 21364aa61755SAndy Ye &TeecOperation, 21374aa61755SAndy Ye &ErrorOrigin); 2138f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 2139f4e1db95SHisping Lin goto exit; 21404aa61755SAndy Ye 21414aa61755SAndy Ye *out_len = TeecOperation.params[1].tmpref.size; 21424aa61755SAndy Ye memcpy(out, SharedMem1.buffer, SharedMem1.size); 2143f4e1db95SHisping Lin exit: 21444aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem0); 21454aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem1); 2146f4e1db95SHisping Lin TEEC_CloseSession(&TeecSession); 2147f4e1db95SHisping Lin TEEC_FinalizeContext(&TeecContext); 21484aa61755SAndy Ye 21494aa61755SAndy Ye return TeecResult; 21504aa61755SAndy Ye } 21514aa61755SAndy Ye 21524aa61755SAndy Ye uint32_t trusty_attest_set_ca(uint8_t *ca_response, uint32_t *ca_response_size) 21534aa61755SAndy Ye { 21544aa61755SAndy Ye TEEC_Result TeecResult; 21554aa61755SAndy Ye TEEC_Context TeecContext; 21564aa61755SAndy Ye TEEC_Session TeecSession; 21574aa61755SAndy Ye uint32_t ErrorOrigin; 21584aa61755SAndy Ye TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6, 21594aa61755SAndy Ye { 0xa8, 0x69, 0x9c, 0xe6, 21604aa61755SAndy Ye 0x88, 0x6c, 0x5d, 0x5d 21614aa61755SAndy Ye } 21624aa61755SAndy Ye }; 21634aa61755SAndy Ye TEEC_UUID *TeecUuid = &tempuuid; 21644aa61755SAndy Ye TEEC_Operation TeecOperation = {0}; 21653251364cSHisping Lin struct blk_desc *dev_desc; 21663251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 21676651d4c0SJason Zhu if (!dev_desc) { 21686651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 21696651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 21706651d4c0SJason Zhu } 2171f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 2172f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 2173f4e1db95SHisping Lin return TeecResult; 21744aa61755SAndy Ye 21754aa61755SAndy Ye TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 2176f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 2177f4e1db95SHisping Lin return TeecResult; 21784aa61755SAndy Ye 21793251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 21803251364cSHisping Lin TEEC_NONE, 21813251364cSHisping Lin TEEC_NONE, 21823251364cSHisping Lin TEEC_NONE); 21833251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 2184b9a7e756SHisping Lin if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0) 2185b9a7e756SHisping Lin TeecOperation.params[0].value.a = 1; 2186b9a7e756SHisping Lin else 2187b9a7e756SHisping Lin TeecOperation.params[0].value.a = 0; 2188b9a7e756SHisping Lin 21893251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 21903251364cSHisping Lin TeecOperation.params[0].value.a = 0; 21913251364cSHisping Lin #endif 21923251364cSHisping Lin 21934aa61755SAndy Ye TeecResult = TEEC_OpenSession(&TeecContext, 21944aa61755SAndy Ye &TeecSession, 21954aa61755SAndy Ye TeecUuid, 21964aa61755SAndy Ye TEEC_LOGIN_PUBLIC, 21974aa61755SAndy Ye NULL, 21983251364cSHisping Lin &TeecOperation, 21994aa61755SAndy Ye &ErrorOrigin); 2200f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 2201f4e1db95SHisping Lin return TeecResult; 22024aa61755SAndy Ye 22034aa61755SAndy Ye TEEC_SharedMemory SharedMem0 = {0}; 22044aa61755SAndy Ye 22054aa61755SAndy Ye SharedMem0.size = *ca_response_size; 22064aa61755SAndy Ye SharedMem0.flags = 0; 22074aa61755SAndy Ye 22084aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 2209f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 2210f4e1db95SHisping Lin goto exit; 22114aa61755SAndy Ye 22124aa61755SAndy Ye memcpy(SharedMem0.buffer, ca_response, SharedMem0.size); 22134aa61755SAndy Ye 22144aa61755SAndy Ye TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 22154aa61755SAndy Ye TeecOperation.params[0].tmpref.size = SharedMem0.size; 22164aa61755SAndy Ye 22174aa61755SAndy Ye TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, 22184aa61755SAndy Ye TEEC_NONE, 22194aa61755SAndy Ye TEEC_NONE, 22204aa61755SAndy Ye TEEC_NONE); 22214aa61755SAndy Ye 22224aa61755SAndy Ye TeecResult = TEEC_InvokeCommand(&TeecSession, 22234aa61755SAndy Ye 146, 22244aa61755SAndy Ye &TeecOperation, 22254aa61755SAndy Ye &ErrorOrigin); 2226f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 2227f4e1db95SHisping Lin goto exit; 2228f4e1db95SHisping Lin exit: 22294aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem0); 22304aa61755SAndy Ye TEEC_CloseSession(&TeecSession); 2231f4e1db95SHisping Lin TEEC_FinalizeContext(&TeecContext); 22324aa61755SAndy Ye 22334aa61755SAndy Ye return TeecResult; 22344aa61755SAndy Ye } 2235