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 4111b25801SHisping Lin #define STORAGE_CMD_WRITE_FW_ENCRYPT_KEY 30 4211b25801SHisping Lin #define STORAGE_CMD_FW_ENCRYPT_KEY_IS_WRITTEN 31 4311b25801SHisping Lin #define STORAGE_CMD_SET_FW_ENCRYPT_KEY_MASK 32 44ae8ec5e1SHisping Lin 452f8c34bdSxb.wang #define CRYPTO_SERVICE_CMD_OEM_OTP_KEY_PHYS_CIPHER 0x00000002 46*437ac8e2SLin Jinhan #define CRYPTO_SERVICE_CMD_FW_KEY_PHYS_CIPHER 0x00000007 47fc3694d6Sxb.wang 48fc3694d6Sxb.wang #define RK_CRYPTO_SERVICE_UUID { 0x0cacdb5d, 0x4fea, 0x466c, \ 49fc3694d6Sxb.wang { 0x97, 0x16, 0x3d, 0x54, 0x16, 0x52, 0x83, 0x0f } } 50fc3694d6Sxb.wang 51ae8ec5e1SHisping Lin static uint8_t b2hs_add_base(uint8_t in) 52ae8ec5e1SHisping Lin { 53ae8ec5e1SHisping Lin if (in > 9) 54ae8ec5e1SHisping Lin return in + 55; 55ae8ec5e1SHisping Lin else 56ae8ec5e1SHisping Lin return in + 48; 57ae8ec5e1SHisping Lin } 58ae8ec5e1SHisping Lin 59c7de5349SHisping Lin static uint32_t b2hs(uint8_t *b, uint8_t *hs, uint32_t blen, uint32_t hslen) 60ae8ec5e1SHisping Lin { 61ae8ec5e1SHisping Lin uint32_t i = 0; 62ae8ec5e1SHisping Lin 63ae8ec5e1SHisping Lin if (blen * 2 + 1 > hslen) 64ae8ec5e1SHisping Lin return 0; 65ae8ec5e1SHisping Lin 66ae8ec5e1SHisping Lin for (; i < blen; i++) { 67ae8ec5e1SHisping Lin hs[i * 2 + 1] = b2hs_add_base(b[i] & 0xf); 68ae8ec5e1SHisping Lin hs[i * 2] = b2hs_add_base(b[i] >> 4); 69ae8ec5e1SHisping Lin } 70ae8ec5e1SHisping Lin hs[blen * 2] = 0; 71ae8ec5e1SHisping Lin 72ae8ec5e1SHisping Lin return blen * 2; 73ae8ec5e1SHisping Lin } 74ae8ec5e1SHisping Lin 752f8c34bdSxb.wang static void crypto_flush_cacheline(uint32_t addr, uint32_t size) 762f8c34bdSxb.wang { 772f8c34bdSxb.wang ulong alignment = CONFIG_SYS_CACHELINE_SIZE; 782f8c34bdSxb.wang ulong aligned_input, aligned_len; 792f8c34bdSxb.wang 802f8c34bdSxb.wang if (!addr || !size) 812f8c34bdSxb.wang return; 822f8c34bdSxb.wang 832f8c34bdSxb.wang /* Must flush dcache before crypto DMA fetch data region */ 842f8c34bdSxb.wang aligned_input = round_down(addr, alignment); 852f8c34bdSxb.wang aligned_len = round_up(size + (addr - aligned_input), alignment); 862f8c34bdSxb.wang flush_cache(aligned_input, aligned_len); 872f8c34bdSxb.wang } 882f8c34bdSxb.wang 89a900eef3SHisping Lin static void crypto_invalidate_cacheline(uint32_t addr, uint32_t size) 90a900eef3SHisping Lin { 91a900eef3SHisping Lin ulong alignment = CONFIG_SYS_CACHELINE_SIZE; 92a900eef3SHisping Lin ulong aligned_input, aligned_len; 93a900eef3SHisping Lin 94a900eef3SHisping Lin if (!addr || !size) 95a900eef3SHisping Lin return; 96a900eef3SHisping Lin 97a900eef3SHisping Lin /* Must invalidate dcache after crypto DMA write data region */ 98a900eef3SHisping Lin aligned_input = round_down(addr, alignment); 99a900eef3SHisping Lin aligned_len = round_up(size + (addr - aligned_input), alignment); 100a900eef3SHisping Lin invalidate_dcache_range(aligned_input, aligned_input + aligned_len); 101a900eef3SHisping Lin } 102a900eef3SHisping Lin 103c7de5349SHisping Lin static uint32_t trusty_base_write_security_data(char *filename, 104c7de5349SHisping Lin uint32_t filename_size, 105c7de5349SHisping Lin uint8_t *data, 106c7de5349SHisping Lin uint32_t data_size) 107ae8ec5e1SHisping Lin { 108ae8ec5e1SHisping Lin TEEC_Result TeecResult; 109ae8ec5e1SHisping Lin TEEC_Context TeecContext; 110ae8ec5e1SHisping Lin TEEC_Session TeecSession; 111ae8ec5e1SHisping Lin uint32_t ErrorOrigin; 112ae8ec5e1SHisping Lin TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 113ae8ec5e1SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 114ae8ec5e1SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 115ae8ec5e1SHisping Lin TEEC_Operation TeecOperation = {0}; 1163251364cSHisping Lin struct blk_desc *dev_desc; 1173251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 1186651d4c0SJason Zhu if (!dev_desc) { 1196651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 1206651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 1216651d4c0SJason Zhu } 1223251364cSHisping Lin 123f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 124f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 125f4e1db95SHisping Lin return TeecResult; 126ae8ec5e1SHisping Lin 127ae8ec5e1SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 128f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 129f4e1db95SHisping Lin return TeecResult; 130ae8ec5e1SHisping Lin 1313251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 1323251364cSHisping Lin TEEC_NONE, 1333251364cSHisping Lin TEEC_NONE, 1343251364cSHisping Lin TEEC_NONE); 1353251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 136f3c7fe23SHisping Lin if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)//emmc 137f3c7fe23SHisping Lin TeecOperation.params[0].value.a = 1; 138f3c7fe23SHisping Lin else if (dev_desc->if_type == IF_TYPE_SCSI)//ufs 139b9a7e756SHisping Lin TeecOperation.params[0].value.a = 1; 140b9a7e756SHisping Lin else 141b9a7e756SHisping Lin TeecOperation.params[0].value.a = 0; 142f3c7fe23SHisping Lin 1433251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 1443251364cSHisping Lin TeecOperation.params[0].value.a = 0; 1453251364cSHisping Lin #endif 1463251364cSHisping Lin 147ae8ec5e1SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 148ae8ec5e1SHisping Lin &TeecSession, 149ae8ec5e1SHisping Lin TeecUuid, 150ae8ec5e1SHisping Lin TEEC_LOGIN_PUBLIC, 151ae8ec5e1SHisping Lin NULL, 1523251364cSHisping Lin &TeecOperation, 153ae8ec5e1SHisping Lin &ErrorOrigin); 154f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 155f4e1db95SHisping Lin return TeecResult; 156ae8ec5e1SHisping Lin 157ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 158ae8ec5e1SHisping Lin 159c7de5349SHisping Lin SharedMem0.size = filename_size; 160ae8ec5e1SHisping Lin SharedMem0.flags = 0; 161ae8ec5e1SHisping Lin 162ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 163f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 164f4e1db95SHisping Lin goto exit; 165ae8ec5e1SHisping Lin 166c7de5349SHisping Lin memcpy(SharedMem0.buffer, filename, SharedMem0.size); 167ae8ec5e1SHisping Lin 168ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem1 = {0}; 169ae8ec5e1SHisping Lin 170c7de5349SHisping Lin SharedMem1.size = data_size; 171c7de5349SHisping Lin SharedMem1.flags = 0; 172c7de5349SHisping Lin 173c7de5349SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 174c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 175c7de5349SHisping Lin goto exit; 176c7de5349SHisping Lin 177c7de5349SHisping Lin memcpy(SharedMem1.buffer, data, SharedMem1.size); 178c7de5349SHisping Lin 179c7de5349SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 180c7de5349SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 181c7de5349SHisping Lin 182c7de5349SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 183c7de5349SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem1.size; 184c7de5349SHisping Lin 185c7de5349SHisping Lin 186c7de5349SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 187c7de5349SHisping Lin TEEC_MEMREF_TEMP_INOUT, 188c7de5349SHisping Lin TEEC_NONE, 189c7de5349SHisping Lin TEEC_NONE); 190c7de5349SHisping Lin 191c7de5349SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 192c7de5349SHisping Lin 1, 193c7de5349SHisping Lin &TeecOperation, 194c7de5349SHisping Lin &ErrorOrigin); 195c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 196c7de5349SHisping Lin goto exit; 197c7de5349SHisping Lin exit: 198c7de5349SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 199c7de5349SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem1); 200c7de5349SHisping Lin TEEC_CloseSession(&TeecSession); 201c7de5349SHisping Lin TEEC_FinalizeContext(&TeecContext); 202c7de5349SHisping Lin 203c7de5349SHisping Lin return TeecResult; 204c7de5349SHisping Lin } 205c7de5349SHisping Lin 206c7de5349SHisping Lin static uint32_t trusty_base_read_security_data(char *filename, 207c7de5349SHisping Lin uint32_t filename_size, 208c7de5349SHisping Lin uint8_t *data, 209c7de5349SHisping Lin uint32_t data_size) 210c7de5349SHisping Lin { 211c7de5349SHisping Lin TEEC_Result TeecResult; 212c7de5349SHisping Lin TEEC_Context TeecContext; 213c7de5349SHisping Lin TEEC_Session TeecSession; 214c7de5349SHisping Lin uint32_t ErrorOrigin; 215c7de5349SHisping Lin TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 216c7de5349SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 217c7de5349SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 218c7de5349SHisping Lin TEEC_Operation TeecOperation = {0}; 219c7de5349SHisping Lin 220c7de5349SHisping Lin struct blk_desc *dev_desc; 221c7de5349SHisping Lin dev_desc = rockchip_get_bootdev(); 222c7de5349SHisping Lin if (!dev_desc) { 223c7de5349SHisping Lin printf("%s: dev_desc is NULL!\n", __func__); 224c7de5349SHisping Lin return -TEEC_ERROR_GENERIC; 225c7de5349SHisping Lin } 226c7de5349SHisping Lin 227c7de5349SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 228c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 229c7de5349SHisping Lin return TeecResult; 230c7de5349SHisping Lin 231c7de5349SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 232c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 233c7de5349SHisping Lin return TeecResult; 234c7de5349SHisping Lin 235c7de5349SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 236c7de5349SHisping Lin TEEC_NONE, 237c7de5349SHisping Lin TEEC_NONE, 238c7de5349SHisping Lin TEEC_NONE); 239c7de5349SHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 240f3c7fe23SHisping Lin if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)//emmc 241f3c7fe23SHisping Lin TeecOperation.params[0].value.a = 1; 242f3c7fe23SHisping Lin else if (dev_desc->if_type == IF_TYPE_SCSI)//ufs 243c7de5349SHisping Lin TeecOperation.params[0].value.a = 1; 244c7de5349SHisping Lin else 245c7de5349SHisping Lin TeecOperation.params[0].value.a = 0; 246f3c7fe23SHisping Lin 247c7de5349SHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 248c7de5349SHisping Lin TeecOperation.params[0].value.a = 0; 249c7de5349SHisping Lin #endif 250c7de5349SHisping Lin 251c7de5349SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 252c7de5349SHisping Lin &TeecSession, 253c7de5349SHisping Lin TeecUuid, 254c7de5349SHisping Lin TEEC_LOGIN_PUBLIC, 255c7de5349SHisping Lin NULL, 256c7de5349SHisping Lin &TeecOperation, 257c7de5349SHisping Lin &ErrorOrigin); 258c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 259c7de5349SHisping Lin return TeecResult; 260c7de5349SHisping Lin 261c7de5349SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 262c7de5349SHisping Lin 263c7de5349SHisping Lin SharedMem0.size = filename_size; 264c7de5349SHisping Lin SharedMem0.flags = 0; 265c7de5349SHisping Lin 266c7de5349SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 267c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 268c7de5349SHisping Lin goto exit; 269c7de5349SHisping Lin 270c7de5349SHisping Lin memcpy(SharedMem0.buffer, filename, SharedMem0.size); 271c7de5349SHisping Lin 272c7de5349SHisping Lin TEEC_SharedMemory SharedMem1 = {0}; 273c7de5349SHisping Lin 274c7de5349SHisping Lin SharedMem1.size = data_size; 275ae8ec5e1SHisping Lin SharedMem1.flags = 0; 276ae8ec5e1SHisping Lin 277ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 278f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 279f4e1db95SHisping Lin goto exit; 280ae8ec5e1SHisping Lin 281ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 282ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 283ae8ec5e1SHisping Lin 284ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 285ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem1.size; 286ae8ec5e1SHisping Lin 287ae8ec5e1SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 288ae8ec5e1SHisping Lin TEEC_MEMREF_TEMP_INOUT, 289ae8ec5e1SHisping Lin TEEC_NONE, 290ae8ec5e1SHisping Lin TEEC_NONE); 291ae8ec5e1SHisping Lin 292ae8ec5e1SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 293ae8ec5e1SHisping Lin 0, 294ae8ec5e1SHisping Lin &TeecOperation, 295ae8ec5e1SHisping Lin &ErrorOrigin); 29646b2a054SHisping Lin if (TeecResult == TEEC_SUCCESS) 297c7de5349SHisping Lin memcpy(data, SharedMem1.buffer, SharedMem1.size); 298f4e1db95SHisping Lin exit: 299ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 300ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem1); 301ae8ec5e1SHisping Lin TEEC_CloseSession(&TeecSession); 30246b2a054SHisping Lin TEEC_FinalizeContext(&TeecContext); 303ae8ec5e1SHisping Lin 304ae8ec5e1SHisping Lin return TeecResult; 305ae8ec5e1SHisping Lin } 306ae8ec5e1SHisping Lin 307c7de5349SHisping Lin static uint32_t trusty_base_end_security_data(void) 308c7de5349SHisping Lin { 309c7de5349SHisping Lin TEEC_Result TeecResult; 310c7de5349SHisping Lin TEEC_Context TeecContext; 311c7de5349SHisping Lin TEEC_Session TeecSession; 312c7de5349SHisping Lin uint32_t ErrorOrigin; 313c7de5349SHisping Lin TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 314c7de5349SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 315c7de5349SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 316c7de5349SHisping Lin TEEC_Operation TeecOperation = {0}; 317c7de5349SHisping Lin 318c7de5349SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 319c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 320c7de5349SHisping Lin return TeecResult; 321c7de5349SHisping Lin 322c7de5349SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 323c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 324c7de5349SHisping Lin return TeecResult; 325c7de5349SHisping Lin 326c7de5349SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 327c7de5349SHisping Lin &TeecSession, 328c7de5349SHisping Lin TeecUuid, 329c7de5349SHisping Lin TEEC_LOGIN_PUBLIC, 330c7de5349SHisping Lin NULL, 331c7de5349SHisping Lin NULL, 332c7de5349SHisping Lin &ErrorOrigin); 333c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 334c7de5349SHisping Lin return TeecResult; 335c7de5349SHisping Lin 336c7de5349SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE, 337c7de5349SHisping Lin TEEC_NONE, 338c7de5349SHisping Lin TEEC_NONE, 339c7de5349SHisping Lin TEEC_NONE); 340c7de5349SHisping Lin 341c7de5349SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 342c7de5349SHisping Lin 2, 343c7de5349SHisping Lin &TeecOperation, 344c7de5349SHisping Lin &ErrorOrigin); 345c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 346c7de5349SHisping Lin goto exit; 347c7de5349SHisping Lin exit: 348c7de5349SHisping Lin TEEC_CloseSession(&TeecSession); 349c7de5349SHisping Lin TEEC_FinalizeContext(&TeecContext); 350c7de5349SHisping Lin 351c7de5349SHisping Lin return TeecResult; 352c7de5349SHisping Lin } 353c7de5349SHisping Lin 35434f2e8f6SHisping Lin static void trusty_notify_always_use_security(void) 35534f2e8f6SHisping Lin { 35634f2e8f6SHisping Lin #if defined(CONFIG_OPTEE_V2) && defined(CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION) 35734f2e8f6SHisping Lin TEEC_Result TeecResult; 35834f2e8f6SHisping Lin TEEC_Context TeecContext; 35934f2e8f6SHisping Lin TEEC_Session TeecSession; 36034f2e8f6SHisping Lin uint32_t ErrorOrigin; 36134f2e8f6SHisping Lin TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 36234f2e8f6SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 36334f2e8f6SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 36434f2e8f6SHisping Lin TEEC_Operation TeecOperation = {0}; 36534f2e8f6SHisping Lin 36634f2e8f6SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 36734f2e8f6SHisping Lin if (TeecResult != TEEC_SUCCESS) 36834f2e8f6SHisping Lin return; 36934f2e8f6SHisping Lin 37034f2e8f6SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 37134f2e8f6SHisping Lin if (TeecResult != TEEC_SUCCESS) 37234f2e8f6SHisping Lin return; 37334f2e8f6SHisping Lin 37434f2e8f6SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 37534f2e8f6SHisping Lin &TeecSession, 37634f2e8f6SHisping Lin TeecUuid, 37734f2e8f6SHisping Lin TEEC_LOGIN_PUBLIC, 37834f2e8f6SHisping Lin NULL, 37934f2e8f6SHisping Lin NULL, 38034f2e8f6SHisping Lin &ErrorOrigin); 38134f2e8f6SHisping Lin if (TeecResult != TEEC_SUCCESS) 38234f2e8f6SHisping Lin return; 38334f2e8f6SHisping Lin 38434f2e8f6SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE, 38534f2e8f6SHisping Lin TEEC_NONE, 38634f2e8f6SHisping Lin TEEC_NONE, 38734f2e8f6SHisping Lin TEEC_NONE); 38834f2e8f6SHisping Lin 38934f2e8f6SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 39034f2e8f6SHisping Lin 9, 39134f2e8f6SHisping Lin &TeecOperation, 39234f2e8f6SHisping Lin &ErrorOrigin); 39334f2e8f6SHisping Lin if (TeecResult != TEEC_SUCCESS) 39434f2e8f6SHisping Lin debug("notify always use security fail! please update optee!"); 39534f2e8f6SHisping Lin 39634f2e8f6SHisping Lin TEEC_CloseSession(&TeecSession); 39734f2e8f6SHisping Lin TEEC_FinalizeContext(&TeecContext); 39834f2e8f6SHisping Lin 39934f2e8f6SHisping Lin return; 40034f2e8f6SHisping Lin #endif 40134f2e8f6SHisping Lin } 40234f2e8f6SHisping Lin 403c7de5349SHisping Lin uint32_t trusty_read_rollback_index(uint32_t slot, uint64_t *value) 404c7de5349SHisping Lin { 405c7de5349SHisping Lin char hs[9]; 406c7de5349SHisping Lin 407c7de5349SHisping Lin b2hs((uint8_t *)&slot, (uint8_t *)hs, 4, 9); 408c7de5349SHisping Lin 409c7de5349SHisping Lin return trusty_base_read_security_data(hs, 8, (uint8_t *)value, 8); 410c7de5349SHisping Lin } 411c7de5349SHisping Lin 412ae8ec5e1SHisping Lin uint32_t trusty_write_rollback_index(uint32_t slot, uint64_t value) 413ae8ec5e1SHisping Lin { 414c7de5349SHisping Lin char hs[9]; 4153251364cSHisping Lin 416c7de5349SHisping Lin b2hs((uint8_t *)&slot, (uint8_t *)hs, 4, 9); 417ae8ec5e1SHisping Lin 418c7de5349SHisping Lin return trusty_base_write_security_data(hs, 8, (uint8_t *)&value, 8); 419ae8ec5e1SHisping Lin } 420ae8ec5e1SHisping Lin 421ae8ec5e1SHisping Lin uint32_t trusty_read_permanent_attributes(uint8_t *attributes, uint32_t size) 422ae8ec5e1SHisping Lin { 423c7de5349SHisping Lin return trusty_base_read_security_data("attributes", 424c7de5349SHisping Lin sizeof("attributes"), attributes, size); 425ae8ec5e1SHisping Lin } 426ae8ec5e1SHisping Lin 427ae8ec5e1SHisping Lin uint32_t trusty_write_permanent_attributes(uint8_t *attributes, uint32_t size) 428ae8ec5e1SHisping Lin { 429c7de5349SHisping Lin return trusty_base_write_security_data("attributes", 430c7de5349SHisping Lin sizeof("attributes"), attributes, size); 4316651d4c0SJason Zhu } 432ae8ec5e1SHisping Lin 433c7de5349SHisping Lin uint32_t trusty_read_permanent_attributes_flag(uint8_t *attributes) 434c7de5349SHisping Lin { 435c7de5349SHisping Lin return trusty_base_read_security_data("attributes_flag", 436c7de5349SHisping Lin sizeof("attributes_flag"), attributes, 1); 437c7de5349SHisping Lin } 438ae8ec5e1SHisping Lin 439c7de5349SHisping Lin uint32_t trusty_write_permanent_attributes_flag(uint8_t attributes) 440c7de5349SHisping Lin { 441c7de5349SHisping Lin return trusty_base_write_security_data("attributes_flag", 442c7de5349SHisping Lin sizeof("attributes_flag"), &attributes, 1); 443ae8ec5e1SHisping Lin } 444ae8ec5e1SHisping Lin 445564654ebSJason Zhu uint32_t trusty_read_permanent_attributes_cer(uint8_t *attributes, 446564654ebSJason Zhu uint32_t size) 447564654ebSJason Zhu { 448c7de5349SHisping Lin return trusty_base_read_security_data("rsacer", 449c7de5349SHisping Lin sizeof("rsacer"), attributes, size); 450564654ebSJason Zhu } 451564654ebSJason Zhu 452564654ebSJason Zhu uint32_t trusty_write_permanent_attributes_cer(uint8_t *attributes, 453564654ebSJason Zhu uint32_t size) 454564654ebSJason Zhu { 455c7de5349SHisping Lin return trusty_base_write_security_data("rsacer", 456c7de5349SHisping Lin sizeof("rsacer"), attributes, size); 457564654ebSJason Zhu } 458564654ebSJason Zhu 459ae8ec5e1SHisping Lin uint32_t trusty_read_lock_state(uint8_t *lock_state) 460ae8ec5e1SHisping Lin { 461c7de5349SHisping Lin return trusty_base_read_security_data("lock_state", 462c7de5349SHisping Lin sizeof("lock_state"), lock_state, 1); 463ae8ec5e1SHisping Lin } 464ae8ec5e1SHisping Lin 465ae8ec5e1SHisping Lin uint32_t trusty_write_lock_state(uint8_t lock_state) 466ae8ec5e1SHisping Lin { 467c7de5349SHisping Lin return trusty_base_write_security_data("lock_state", 468c7de5349SHisping Lin sizeof("lock_state"), &lock_state, 1); 469ae8ec5e1SHisping Lin } 470ae8ec5e1SHisping Lin 471ae8ec5e1SHisping Lin uint32_t trusty_read_flash_lock_state(uint8_t *flash_lock_state) 472ae8ec5e1SHisping Lin { 473c7de5349SHisping Lin return trusty_base_read_security_data("flash_lock_state", 474c7de5349SHisping Lin sizeof("flash_lock_state"), flash_lock_state, 1); 475c7de5349SHisping Lin } 476c7de5349SHisping Lin 477c7de5349SHisping Lin uint32_t trusty_write_flash_lock_state(uint8_t flash_lock_state) 478c7de5349SHisping Lin { 479c7de5349SHisping Lin return trusty_base_write_security_data("flash_lock_state", 480c7de5349SHisping Lin sizeof("flash_lock_state"), &flash_lock_state, 1); 481c7de5349SHisping Lin } 482c7de5349SHisping Lin 483c7de5349SHisping Lin static uint32_t trusty_base_end_efuse_or_otp(void) 484c7de5349SHisping Lin { 485ae8ec5e1SHisping Lin TEEC_Result TeecResult; 486ae8ec5e1SHisping Lin TEEC_Context TeecContext; 487ae8ec5e1SHisping Lin TEEC_Session TeecSession; 488ae8ec5e1SHisping Lin uint32_t ErrorOrigin; 489c7de5349SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 490c7de5349SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 491c7de5349SHisping Lin 492ae8ec5e1SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 493ae8ec5e1SHisping Lin TEEC_Operation TeecOperation = {0}; 494ae8ec5e1SHisping Lin 495f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 496f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 497f4e1db95SHisping Lin return TeecResult; 498ae8ec5e1SHisping Lin 499ae8ec5e1SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 500f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 501f4e1db95SHisping Lin return TeecResult; 502ae8ec5e1SHisping Lin 503ae8ec5e1SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 504ae8ec5e1SHisping Lin &TeecSession, 505ae8ec5e1SHisping Lin TeecUuid, 506ae8ec5e1SHisping Lin TEEC_LOGIN_PUBLIC, 507ae8ec5e1SHisping Lin NULL, 508c7de5349SHisping Lin NULL, 509ae8ec5e1SHisping Lin &ErrorOrigin); 510f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 511f4e1db95SHisping Lin return TeecResult; 512ae8ec5e1SHisping Lin 513c7de5349SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE, 514c7de5349SHisping Lin TEEC_NONE, 515ae8ec5e1SHisping Lin TEEC_NONE, 516ae8ec5e1SHisping Lin TEEC_NONE); 517ae8ec5e1SHisping Lin 518ae8ec5e1SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 519c7de5349SHisping Lin STORAGE_CMD_UBOOT_END_OTP, 520ae8ec5e1SHisping Lin &TeecOperation, 521ae8ec5e1SHisping Lin &ErrorOrigin); 522c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 523c7de5349SHisping Lin goto exit; 524f4e1db95SHisping Lin exit: 525ae8ec5e1SHisping Lin TEEC_CloseSession(&TeecSession); 52646b2a054SHisping Lin TEEC_FinalizeContext(&TeecContext); 527ae8ec5e1SHisping Lin 528ae8ec5e1SHisping Lin return TeecResult; 529ae8ec5e1SHisping Lin } 530ae8ec5e1SHisping Lin 531c7de5349SHisping Lin static uint32_t trusty_base_efuse_or_otp_operation(uint32_t cmd, 532c7de5349SHisping Lin uint8_t is_write, 533c7de5349SHisping Lin uint32_t *buf, 534c7de5349SHisping Lin uint32_t length) 535ae8ec5e1SHisping Lin { 536ae8ec5e1SHisping Lin TEEC_Result TeecResult; 537ae8ec5e1SHisping Lin TEEC_Context TeecContext; 538ae8ec5e1SHisping Lin TEEC_Session TeecSession; 539ae8ec5e1SHisping Lin uint32_t ErrorOrigin; 540c7de5349SHisping Lin 541c7de5349SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 542c7de5349SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 543ae8ec5e1SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 544ae8ec5e1SHisping Lin TEEC_Operation TeecOperation = {0}; 545ae8ec5e1SHisping Lin 546f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 547f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 548f4e1db95SHisping Lin return TeecResult; 549ae8ec5e1SHisping Lin 550ae8ec5e1SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 551f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 552f4e1db95SHisping Lin return TeecResult; 553ae8ec5e1SHisping Lin 554ae8ec5e1SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 555ae8ec5e1SHisping Lin &TeecSession, 556ae8ec5e1SHisping Lin TeecUuid, 557ae8ec5e1SHisping Lin TEEC_LOGIN_PUBLIC, 558ae8ec5e1SHisping Lin NULL, 559c7de5349SHisping Lin NULL, 560ae8ec5e1SHisping Lin &ErrorOrigin); 561f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 562f4e1db95SHisping Lin return TeecResult; 563ae8ec5e1SHisping Lin 564ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 565ae8ec5e1SHisping Lin 566c7de5349SHisping Lin SharedMem0.size = length * sizeof(uint32_t); 567ae8ec5e1SHisping Lin SharedMem0.flags = 0; 568ae8ec5e1SHisping Lin 569ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 570f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 571f4e1db95SHisping Lin goto exit; 572ae8ec5e1SHisping Lin 573ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 574ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 575ae8ec5e1SHisping Lin 576c7de5349SHisping Lin if (is_write) { 577c7de5349SHisping Lin memcpy(SharedMem0.buffer, buf, SharedMem0.size); 578ae8ec5e1SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 579c7de5349SHisping Lin TEEC_NONE, 580ae8ec5e1SHisping Lin TEEC_NONE, 581ae8ec5e1SHisping Lin TEEC_NONE); 582ae8ec5e1SHisping Lin 583c7de5349SHisping Lin } else { 584c7de5349SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT, 585c7de5349SHisping Lin TEEC_NONE, 586c7de5349SHisping Lin TEEC_NONE, 587c7de5349SHisping Lin TEEC_NONE); 588c7de5349SHisping Lin } 589c7de5349SHisping Lin 590ae8ec5e1SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 591c7de5349SHisping Lin cmd, 592ae8ec5e1SHisping Lin &TeecOperation, 593ae8ec5e1SHisping Lin &ErrorOrigin); 594f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 595f4e1db95SHisping Lin goto exit; 596c7de5349SHisping Lin 597c7de5349SHisping Lin if (!is_write) 598c7de5349SHisping Lin memcpy(buf, SharedMem0.buffer, SharedMem0.size); 599c7de5349SHisping Lin 600f4e1db95SHisping Lin exit: 601ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 602ae8ec5e1SHisping Lin TEEC_CloseSession(&TeecSession); 60346b2a054SHisping Lin TEEC_FinalizeContext(&TeecContext); 604ae8ec5e1SHisping Lin 605ae8ec5e1SHisping Lin return TeecResult; 606ae8ec5e1SHisping Lin } 607ae8ec5e1SHisping Lin 6086ef445a4SHisping Lin uint32_t trusty_read_attribute_hash(uint32_t *buf, uint32_t length) 6096ef445a4SHisping Lin { 610c7de5349SHisping Lin return trusty_base_efuse_or_otp_operation(STORAGE_CMD_READ_ATTRIBUTE_HASH, 611c7de5349SHisping Lin false, buf, length); 6126ef445a4SHisping Lin } 6136ef445a4SHisping Lin 6146ef445a4SHisping Lin uint32_t trusty_write_attribute_hash(uint32_t *buf, uint32_t length) 6156ef445a4SHisping Lin { 616c7de5349SHisping Lin return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_ATTRIBUTE_HASH, 617c7de5349SHisping Lin true, buf, length); 61816539616SHisping Lin } 61916539616SHisping Lin 62016539616SHisping Lin uint32_t trusty_notify_optee_uboot_end(void) 62116539616SHisping Lin { 62216539616SHisping Lin TEEC_Result res; 623c7de5349SHisping Lin 624c7de5349SHisping Lin res = trusty_base_end_security_data(); 625c7de5349SHisping Lin res |= trusty_base_end_efuse_or_otp(); 62616539616SHisping Lin return res; 62716539616SHisping Lin } 6282cd27853SHisping Lin 6292cd27853SHisping Lin uint32_t trusty_read_vbootkey_hash(uint32_t *buf, uint32_t length) 6302cd27853SHisping Lin { 631c7de5349SHisping Lin return trusty_base_efuse_or_otp_operation(STORAGE_CMD_READ_VBOOTKEY_HASH, 632c7de5349SHisping Lin false, buf, length); 6332cd27853SHisping Lin } 634c7de5349SHisping Lin 6352cd27853SHisping Lin uint32_t trusty_write_vbootkey_hash(uint32_t *buf, uint32_t length) 6362cd27853SHisping Lin { 637c7de5349SHisping Lin return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_VBOOTKEY_HASH, 638c7de5349SHisping Lin true, buf, length); 6392cd27853SHisping Lin } 640095e2a82SHisping Lin 641468df3b2SHisping Lin uint32_t trusty_read_vbootkey_enable_flag(uint8_t *flag) 642468df3b2SHisping Lin { 643468df3b2SHisping Lin uint32_t bootflag; 644c7de5349SHisping Lin TEEC_Result TeecResult; 645468df3b2SHisping Lin 646f07e1686SHisping Lin *flag = 0; 647f07e1686SHisping Lin 648c7de5349SHisping Lin TeecResult = trusty_base_efuse_or_otp_operation(STORAGE_CMD_READ_ENABLE_FLAG, 649c7de5349SHisping Lin false, &bootflag, 1); 650468df3b2SHisping Lin 651468df3b2SHisping Lin if (TeecResult == TEEC_SUCCESS) { 6520202ee8aSHisping Lin #if defined(CONFIG_ROCKCHIP_RK3288) 6530202ee8aSHisping Lin if (bootflag == 0x00000001) 6540202ee8aSHisping Lin *flag = 1; 6550202ee8aSHisping Lin #else 656468df3b2SHisping Lin if (bootflag == 0x000000FF) 657468df3b2SHisping Lin *flag = 1; 6580202ee8aSHisping Lin #endif 659468df3b2SHisping Lin } 660095e2a82SHisping Lin return TeecResult; 661095e2a82SHisping Lin } 6624aa61755SAndy Ye 6631ef63c75SHisping Lin uint32_t trusty_write_ta_encryption_key(uint32_t *buf, uint32_t length) 6641ef63c75SHisping Lin { 6651ef63c75SHisping Lin return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_TA_ENCRYPTION_KEY, 6661ef63c75SHisping Lin true, buf, length); 6671ef63c75SHisping Lin } 6681ef63c75SHisping Lin 66910f41197SHisping Lin uint32_t trusty_ta_encryption_key_is_written(uint8_t *value) 67010f41197SHisping Lin { 67110f41197SHisping Lin TEEC_Result TeecResult; 67210f41197SHisping Lin TEEC_Context TeecContext; 67310f41197SHisping Lin TEEC_Session TeecSession; 67410f41197SHisping Lin uint32_t ErrorOrigin; 67510f41197SHisping Lin 67610f41197SHisping Lin *value = 0; 67710f41197SHisping Lin 67810f41197SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 67910f41197SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 68010f41197SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 68110f41197SHisping Lin TEEC_Operation TeecOperation = {0}; 68210f41197SHisping Lin 68310f41197SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 68410f41197SHisping Lin if (TeecResult != TEEC_SUCCESS) 68510f41197SHisping Lin return TeecResult; 68610f41197SHisping Lin 68710f41197SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 68810f41197SHisping Lin if (TeecResult != TEEC_SUCCESS) 68910f41197SHisping Lin return TeecResult; 69010f41197SHisping Lin 69110f41197SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 69210f41197SHisping Lin &TeecSession, 69310f41197SHisping Lin TeecUuid, 69410f41197SHisping Lin TEEC_LOGIN_PUBLIC, 69510f41197SHisping Lin NULL, 69610f41197SHisping Lin NULL, 69710f41197SHisping Lin &ErrorOrigin); 69810f41197SHisping Lin if (TeecResult != TEEC_SUCCESS) 69910f41197SHisping Lin return TeecResult; 70010f41197SHisping Lin 70110f41197SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_OUTPUT, 70210f41197SHisping Lin TEEC_NONE, 70310f41197SHisping Lin TEEC_NONE, 70410f41197SHisping Lin TEEC_NONE); 70510f41197SHisping Lin 70610f41197SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 70710f41197SHisping Lin STORAGE_CMD_TA_ENCRYPTION_KEY_IS_WRITTEN, 70810f41197SHisping Lin &TeecOperation, 70910f41197SHisping Lin &ErrorOrigin); 71010f41197SHisping Lin if (TeecResult == TEEC_SUCCESS) 71110f41197SHisping Lin *value = TeecOperation.params[0].value.a; 71210f41197SHisping Lin 71310f41197SHisping Lin TEEC_CloseSession(&TeecSession); 71410f41197SHisping Lin TEEC_FinalizeContext(&TeecContext); 71510f41197SHisping Lin 71610f41197SHisping Lin return TeecResult; 71710f41197SHisping Lin } 71810f41197SHisping Lin 7191ac64e8aSHisping Lin uint32_t trusty_write_oem_encrypt_data(uint32_t *buf, uint32_t length) 7201ac64e8aSHisping Lin { 7211ac64e8aSHisping Lin return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_OEM_ENCRYPT_DATA, 7221ac64e8aSHisping Lin true, buf, length); 7231ac64e8aSHisping Lin } 7241ac64e8aSHisping Lin 725fc383442SHisping Lin uint32_t trusty_oem_encrypt_data_is_written(uint8_t *value) 726fc383442SHisping Lin { 727fc383442SHisping Lin TEEC_Result TeecResult; 728fc383442SHisping Lin TEEC_Context TeecContext; 729fc383442SHisping Lin TEEC_Session TeecSession; 730fc383442SHisping Lin uint32_t ErrorOrigin; 731fc383442SHisping Lin 732fc383442SHisping Lin *value = 0; 733fc383442SHisping Lin 734fc383442SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 735fc383442SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 736fc383442SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 737fc383442SHisping Lin TEEC_Operation TeecOperation = {0}; 738fc383442SHisping Lin 739fc383442SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 740fc383442SHisping Lin if (TeecResult != TEEC_SUCCESS) 741fc383442SHisping Lin return TeecResult; 742fc383442SHisping Lin 743fc383442SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 744fc383442SHisping Lin if (TeecResult != TEEC_SUCCESS) 745fc383442SHisping Lin return TeecResult; 746fc383442SHisping Lin 747fc383442SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 748fc383442SHisping Lin &TeecSession, 749fc383442SHisping Lin TeecUuid, 750fc383442SHisping Lin TEEC_LOGIN_PUBLIC, 751fc383442SHisping Lin NULL, 752fc383442SHisping Lin NULL, 753fc383442SHisping Lin &ErrorOrigin); 754fc383442SHisping Lin if (TeecResult != TEEC_SUCCESS) 755fc383442SHisping Lin return TeecResult; 756fc383442SHisping Lin 757fc383442SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_OUTPUT, 758fc383442SHisping Lin TEEC_NONE, 759fc383442SHisping Lin TEEC_NONE, 760fc383442SHisping Lin TEEC_NONE); 761fc383442SHisping Lin 762fc383442SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 763fc383442SHisping Lin STORAGE_CMD_OEM_ENCRYPT_DATA_IS_WRITTEN, 764fc383442SHisping Lin &TeecOperation, 765fc383442SHisping Lin &ErrorOrigin); 766fc383442SHisping Lin if (TeecResult == TEEC_SUCCESS) 767fc383442SHisping Lin *value = TeecOperation.params[0].value.a; 768fc383442SHisping Lin 769fc383442SHisping Lin TEEC_CloseSession(&TeecSession); 770fc383442SHisping Lin TEEC_FinalizeContext(&TeecContext); 771fc383442SHisping Lin 772fc383442SHisping Lin return TeecResult; 773fc383442SHisping Lin } 774fc383442SHisping Lin 775fbf29bfbSHisping Lin uint32_t trusty_check_security_level_flag(uint8_t flag) 776fbf29bfbSHisping Lin { 777fbf29bfbSHisping Lin uint32_t levelflag; 778fbf29bfbSHisping Lin 779fbf29bfbSHisping Lin levelflag = flag; 780fbf29bfbSHisping Lin return trusty_base_efuse_or_otp_operation(STORAGE_CMD_CHECK_SECURITY_LEVEL_FLAG, 781fbf29bfbSHisping Lin true, &levelflag, 1); 782fbf29bfbSHisping Lin } 783fbf29bfbSHisping Lin 784f39d4289SHisping Lin uint32_t trusty_write_oem_huk(uint32_t *buf, uint32_t length) 785f39d4289SHisping Lin { 786f39d4289SHisping Lin return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_OEM_HUK, 787f39d4289SHisping Lin true, buf, length); 788f39d4289SHisping Lin } 789f39d4289SHisping Lin 79034f2e8f6SHisping Lin static void trusty_select_security_level(void) 7917504da74SHisping Lin { 792b2858095SHisping Lin #ifdef CONFIG_OPTEE_SECURITY_LEVEL 7937504da74SHisping Lin TEEC_Result TeecResult; 7947504da74SHisping Lin 7957504da74SHisping Lin TeecResult = trusty_check_security_level_flag(CONFIG_OPTEE_SECURITY_LEVEL); 7967504da74SHisping Lin if (TeecResult == TEE_ERROR_CANCEL) { 7977504da74SHisping Lin run_command("download", 0); 7987504da74SHisping Lin return; 7997504da74SHisping Lin } 8007504da74SHisping Lin 8017504da74SHisping Lin if (TeecResult == TEEC_SUCCESS) 8027504da74SHisping Lin debug("optee select security level success!"); 803b2858095SHisping Lin else if (TeecResult == TEEC_ERROR_NOT_SUPPORTED) 804b2858095SHisping Lin debug("optee not support security level!"); 8057504da74SHisping Lin else 8067504da74SHisping Lin panic("optee select security level fail!"); 8077504da74SHisping Lin 8087504da74SHisping Lin return; 8097504da74SHisping Lin #endif 8107504da74SHisping Lin } 8117504da74SHisping Lin 81251ac7005SHisping Lin void optee_client_init(void) 81351ac7005SHisping Lin { 81451ac7005SHisping Lin trusty_select_security_level(); 81534f2e8f6SHisping Lin trusty_notify_always_use_security(); 81651ac7005SHisping Lin } 81751ac7005SHisping Lin 818d5913350SHisping Lin uint32_t trusty_write_oem_ns_otp(uint32_t byte_off, uint8_t *byte_buf, uint32_t byte_len) 819d5913350SHisping Lin { 820d5913350SHisping Lin TEEC_Result TeecResult; 821d5913350SHisping Lin TEEC_Context TeecContext; 822d5913350SHisping Lin TEEC_Session TeecSession; 823d5913350SHisping Lin uint32_t ErrorOrigin; 824d5913350SHisping Lin 825d5913350SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 826d5913350SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 827d5913350SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 828d5913350SHisping Lin TEEC_Operation TeecOperation = {0}; 829d5913350SHisping Lin 830d5913350SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 831d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 832d5913350SHisping Lin return TeecResult; 833d5913350SHisping Lin 834d5913350SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 835d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 836d5913350SHisping Lin return TeecResult; 837d5913350SHisping Lin 838d5913350SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 839d5913350SHisping Lin &TeecSession, 840d5913350SHisping Lin TeecUuid, 841d5913350SHisping Lin TEEC_LOGIN_PUBLIC, 842d5913350SHisping Lin NULL, 843d5913350SHisping Lin NULL, 844d5913350SHisping Lin &ErrorOrigin); 845d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 846d5913350SHisping Lin return TeecResult; 847d5913350SHisping Lin 848d5913350SHisping Lin TeecOperation.params[0].value.a = byte_off; 849d5913350SHisping Lin 850d5913350SHisping Lin TEEC_SharedMemory SharedMem = {0}; 851d5913350SHisping Lin 852d5913350SHisping Lin SharedMem.size = byte_len; 853d5913350SHisping Lin SharedMem.flags = 0; 854d5913350SHisping Lin 855d5913350SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem); 856d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 857d5913350SHisping Lin goto exit; 858d5913350SHisping Lin 859d5913350SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem.buffer; 860d5913350SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem.size; 861d5913350SHisping Lin 862d5913350SHisping Lin memcpy(SharedMem.buffer, byte_buf, SharedMem.size); 863d5913350SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 864d5913350SHisping Lin TEEC_MEMREF_TEMP_INPUT, 865d5913350SHisping Lin TEEC_NONE, 866d5913350SHisping Lin TEEC_NONE); 867d5913350SHisping Lin 868d5913350SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 869d5913350SHisping Lin STORAGE_CMD_WRITE_OEM_NS_OTP, 870d5913350SHisping Lin &TeecOperation, 871d5913350SHisping Lin &ErrorOrigin); 872d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 873d5913350SHisping Lin goto exit; 874d5913350SHisping Lin 875d5913350SHisping Lin exit: 876d5913350SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem); 877d5913350SHisping Lin TEEC_CloseSession(&TeecSession); 878d5913350SHisping Lin TEEC_FinalizeContext(&TeecContext); 879d5913350SHisping Lin 880d5913350SHisping Lin return TeecResult; 881d5913350SHisping Lin } 882d5913350SHisping Lin 883d5913350SHisping Lin uint32_t trusty_read_oem_ns_otp(uint32_t byte_off, uint8_t *byte_buf, uint32_t byte_len) 884d5913350SHisping Lin { 885d5913350SHisping Lin TEEC_Result TeecResult; 886d5913350SHisping Lin TEEC_Context TeecContext; 887d5913350SHisping Lin TEEC_Session TeecSession; 888d5913350SHisping Lin uint32_t ErrorOrigin; 889d5913350SHisping Lin 890d5913350SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 891d5913350SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 892d5913350SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 893d5913350SHisping Lin TEEC_Operation TeecOperation = {0}; 894d5913350SHisping Lin 895d5913350SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 896d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 897d5913350SHisping Lin return TeecResult; 898d5913350SHisping Lin 899d5913350SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 900d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 901d5913350SHisping Lin return TeecResult; 902d5913350SHisping Lin 903d5913350SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 904d5913350SHisping Lin &TeecSession, 905d5913350SHisping Lin TeecUuid, 906d5913350SHisping Lin TEEC_LOGIN_PUBLIC, 907d5913350SHisping Lin NULL, 908d5913350SHisping Lin NULL, 909d5913350SHisping Lin &ErrorOrigin); 910d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 911d5913350SHisping Lin return TeecResult; 912d5913350SHisping Lin 913d5913350SHisping Lin TeecOperation.params[0].value.a = byte_off; 914d5913350SHisping Lin 915d5913350SHisping Lin TEEC_SharedMemory SharedMem = {0}; 916d5913350SHisping Lin 917d5913350SHisping Lin SharedMem.size = byte_len; 918d5913350SHisping Lin SharedMem.flags = 0; 919d5913350SHisping Lin 920d5913350SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem); 921d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 922d5913350SHisping Lin goto exit; 923d5913350SHisping Lin 924d5913350SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem.buffer; 925d5913350SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem.size; 926d5913350SHisping Lin 927d5913350SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 928d5913350SHisping Lin TEEC_MEMREF_TEMP_OUTPUT, 929d5913350SHisping Lin TEEC_NONE, 930d5913350SHisping Lin TEEC_NONE); 931d5913350SHisping Lin 932d5913350SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 933d5913350SHisping Lin STORAGE_CMD_READ_OEM_NS_OTP, 934d5913350SHisping Lin &TeecOperation, 935d5913350SHisping Lin &ErrorOrigin); 936d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 937d5913350SHisping Lin goto exit; 938d5913350SHisping Lin 939d5913350SHisping Lin memcpy(byte_buf, SharedMem.buffer, SharedMem.size); 940d5913350SHisping Lin 941d5913350SHisping Lin exit: 942d5913350SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem); 943d5913350SHisping Lin TEEC_CloseSession(&TeecSession); 944d5913350SHisping Lin TEEC_FinalizeContext(&TeecContext); 945d5913350SHisping Lin 946d5913350SHisping Lin return TeecResult; 947d5913350SHisping Lin } 948d5913350SHisping Lin 94990e849a0Sxb.wang uint32_t trusty_write_oem_otp_key(enum RK_OEM_OTP_KEYID key_id, 950bb1ba6acSHisping Lin uint8_t *byte_buf, uint32_t byte_len) 951bb1ba6acSHisping Lin { 952bb1ba6acSHisping Lin TEEC_Result TeecResult; 953bb1ba6acSHisping Lin TEEC_Context TeecContext; 954bb1ba6acSHisping Lin TEEC_Session TeecSession; 955bb1ba6acSHisping Lin uint32_t ErrorOrigin; 956bb1ba6acSHisping Lin 957bb1ba6acSHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 958bb1ba6acSHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 959bb1ba6acSHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 960bb1ba6acSHisping Lin TEEC_Operation TeecOperation = {0}; 961bb1ba6acSHisping Lin 962bb1ba6acSHisping Lin TeecResult = OpteeClientApiLibInitialize(); 963bb1ba6acSHisping Lin if (TeecResult != TEEC_SUCCESS) 964bb1ba6acSHisping Lin return TeecResult; 965bb1ba6acSHisping Lin 966bb1ba6acSHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 967bb1ba6acSHisping Lin if (TeecResult != TEEC_SUCCESS) 968bb1ba6acSHisping Lin return TeecResult; 969bb1ba6acSHisping Lin 970bb1ba6acSHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 971bb1ba6acSHisping Lin &TeecSession, 972bb1ba6acSHisping Lin TeecUuid, 973bb1ba6acSHisping Lin TEEC_LOGIN_PUBLIC, 974bb1ba6acSHisping Lin NULL, 975bb1ba6acSHisping Lin NULL, 976bb1ba6acSHisping Lin &ErrorOrigin); 977bb1ba6acSHisping Lin if (TeecResult != TEEC_SUCCESS) 978bb1ba6acSHisping Lin return TeecResult; 979bb1ba6acSHisping Lin 980bb1ba6acSHisping Lin TeecOperation.params[0].value.a = key_id; 981bb1ba6acSHisping Lin 982bb1ba6acSHisping Lin TEEC_SharedMemory SharedMem = {0}; 983bb1ba6acSHisping Lin 984bb1ba6acSHisping Lin SharedMem.size = byte_len; 985bb1ba6acSHisping Lin SharedMem.flags = 0; 986bb1ba6acSHisping Lin 987bb1ba6acSHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem); 988bb1ba6acSHisping Lin if (TeecResult != TEEC_SUCCESS) 989bb1ba6acSHisping Lin goto exit; 990bb1ba6acSHisping Lin 991bb1ba6acSHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem.buffer; 992bb1ba6acSHisping Lin TeecOperation.params[1].tmpref.size = SharedMem.size; 993bb1ba6acSHisping Lin 994bb1ba6acSHisping Lin memcpy(SharedMem.buffer, byte_buf, SharedMem.size); 995bb1ba6acSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 996bb1ba6acSHisping Lin TEEC_MEMREF_TEMP_INPUT, 997bb1ba6acSHisping Lin TEEC_NONE, 998bb1ba6acSHisping Lin TEEC_NONE); 999bb1ba6acSHisping Lin 1000bb1ba6acSHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 100190e849a0Sxb.wang STORAGE_CMD_WRITE_OEM_OTP_KEY, 1002bb1ba6acSHisping Lin &TeecOperation, 1003bb1ba6acSHisping Lin &ErrorOrigin); 1004bb1ba6acSHisping Lin if (TeecResult != TEEC_SUCCESS) 1005bb1ba6acSHisping Lin goto exit; 1006bb1ba6acSHisping Lin 1007bb1ba6acSHisping Lin exit: 1008bb1ba6acSHisping Lin TEEC_ReleaseSharedMemory(&SharedMem); 1009bb1ba6acSHisping Lin TEEC_CloseSession(&TeecSession); 1010bb1ba6acSHisping Lin TEEC_FinalizeContext(&TeecContext); 1011bb1ba6acSHisping Lin 1012bb1ba6acSHisping Lin return TeecResult; 1013bb1ba6acSHisping Lin } 1014bb1ba6acSHisping Lin 10159deb34f6SHisping Lin uint32_t trusty_oem_otp_key_is_written(enum RK_OEM_OTP_KEYID key_id, uint8_t *value) 10169deb34f6SHisping Lin { 10179deb34f6SHisping Lin TEEC_Result TeecResult; 10189deb34f6SHisping Lin TEEC_Context TeecContext; 10199deb34f6SHisping Lin TEEC_Session TeecSession; 10209deb34f6SHisping Lin uint32_t ErrorOrigin; 10219deb34f6SHisping Lin 10229deb34f6SHisping Lin *value = 0xFF; 10239deb34f6SHisping Lin 10249deb34f6SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 10259deb34f6SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 10269deb34f6SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 10279deb34f6SHisping Lin TEEC_Operation TeecOperation = {0}; 10289deb34f6SHisping Lin 10299deb34f6SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 10309deb34f6SHisping Lin if (TeecResult != TEEC_SUCCESS) 10319deb34f6SHisping Lin return TeecResult; 10329deb34f6SHisping Lin 10339deb34f6SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 10349deb34f6SHisping Lin if (TeecResult != TEEC_SUCCESS) 10359deb34f6SHisping Lin return TeecResult; 10369deb34f6SHisping Lin 10379deb34f6SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 10389deb34f6SHisping Lin &TeecSession, 10399deb34f6SHisping Lin TeecUuid, 10409deb34f6SHisping Lin TEEC_LOGIN_PUBLIC, 10419deb34f6SHisping Lin NULL, 10429deb34f6SHisping Lin NULL, 10439deb34f6SHisping Lin &ErrorOrigin); 10449deb34f6SHisping Lin if (TeecResult != TEEC_SUCCESS) 10459deb34f6SHisping Lin return TeecResult; 10469deb34f6SHisping Lin 10479deb34f6SHisping Lin TeecOperation.params[0].value.a = key_id; 10489deb34f6SHisping Lin 10499deb34f6SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INOUT, 10509deb34f6SHisping Lin TEEC_NONE, 10519deb34f6SHisping Lin TEEC_NONE, 10529deb34f6SHisping Lin TEEC_NONE); 10539deb34f6SHisping Lin 10549deb34f6SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 10559deb34f6SHisping Lin STORAGE_CMD_OEM_OTP_KEY_IS_WRITTEN, 10569deb34f6SHisping Lin &TeecOperation, 10579deb34f6SHisping Lin &ErrorOrigin); 10589deb34f6SHisping Lin if (TeecResult == TEEC_SUCCESS) 10599deb34f6SHisping Lin *value = TeecOperation.params[0].value.b; 10609deb34f6SHisping Lin 10619deb34f6SHisping Lin TEEC_CloseSession(&TeecSession); 10629deb34f6SHisping Lin TEEC_FinalizeContext(&TeecContext); 10639deb34f6SHisping Lin 10649deb34f6SHisping Lin return TeecResult; 10659deb34f6SHisping Lin } 10669deb34f6SHisping Lin 106790e849a0Sxb.wang uint32_t trusty_set_oem_hr_otp_read_lock(enum RK_OEM_OTP_KEYID key_id) 1068a405238aSHisping Lin { 1069a405238aSHisping Lin TEEC_Result TeecResult; 1070a405238aSHisping Lin TEEC_Context TeecContext; 1071a405238aSHisping Lin TEEC_Session TeecSession; 1072a405238aSHisping Lin uint32_t ErrorOrigin; 1073a405238aSHisping Lin 1074a405238aSHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 1075a405238aSHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 1076a405238aSHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 1077a405238aSHisping Lin TEEC_Operation TeecOperation = {0}; 1078a405238aSHisping Lin 1079a405238aSHisping Lin TeecResult = OpteeClientApiLibInitialize(); 1080a405238aSHisping Lin if (TeecResult != TEEC_SUCCESS) 1081a405238aSHisping Lin return TeecResult; 1082a405238aSHisping Lin 1083a405238aSHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1084a405238aSHisping Lin if (TeecResult != TEEC_SUCCESS) 1085a405238aSHisping Lin return TeecResult; 1086a405238aSHisping Lin 1087a405238aSHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 1088a405238aSHisping Lin &TeecSession, 1089a405238aSHisping Lin TeecUuid, 1090a405238aSHisping Lin TEEC_LOGIN_PUBLIC, 1091a405238aSHisping Lin NULL, 1092a405238aSHisping Lin NULL, 1093a405238aSHisping Lin &ErrorOrigin); 1094a405238aSHisping Lin if (TeecResult != TEEC_SUCCESS) 1095a405238aSHisping Lin return TeecResult; 1096a405238aSHisping Lin 1097a405238aSHisping Lin TeecOperation.params[0].value.a = key_id; 1098a405238aSHisping Lin 1099a405238aSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 1100a405238aSHisping Lin TEEC_NONE, 1101a405238aSHisping Lin TEEC_NONE, 1102a405238aSHisping Lin TEEC_NONE); 1103a405238aSHisping Lin 1104a405238aSHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 1105a405238aSHisping Lin STORAGE_CMD_SET_OEM_HR_OTP_READ_LOCK, 1106a405238aSHisping Lin &TeecOperation, 1107a405238aSHisping Lin &ErrorOrigin); 1108a405238aSHisping Lin if (TeecResult != TEEC_SUCCESS) 1109a405238aSHisping Lin goto exit; 1110a405238aSHisping Lin 1111a405238aSHisping Lin exit: 1112a405238aSHisping Lin TEEC_CloseSession(&TeecSession); 1113a405238aSHisping Lin TEEC_FinalizeContext(&TeecContext); 1114a405238aSHisping Lin 1115a405238aSHisping Lin return TeecResult; 1116a405238aSHisping Lin } 1117a405238aSHisping Lin 11182f8c34bdSxb.wang uint32_t trusty_oem_otp_key_cipher(enum RK_OEM_OTP_KEYID key_id, rk_cipher_config *config, 11192f8c34bdSxb.wang uint32_t src_phys_addr, uint32_t dst_phys_addr, 11202f8c34bdSxb.wang uint32_t len) 1121fc3694d6Sxb.wang { 1122fc3694d6Sxb.wang TEEC_Result TeecResult; 1123fc3694d6Sxb.wang TEEC_Context TeecContext; 1124fc3694d6Sxb.wang TEEC_Session TeecSession; 1125fc3694d6Sxb.wang TEEC_Operation TeecOperation = {0}; 1126fc3694d6Sxb.wang uint32_t ErrorOrigin; 1127fc3694d6Sxb.wang TEEC_UUID uuid = RK_CRYPTO_SERVICE_UUID; 1128fc3694d6Sxb.wang TEEC_SharedMemory SharedMem_config = {0}; 1129fc3694d6Sxb.wang 11302f8c34bdSxb.wang if (key_id != RK_OEM_OTP_KEY0 && 11312f8c34bdSxb.wang key_id != RK_OEM_OTP_KEY1 && 11322f8c34bdSxb.wang key_id != RK_OEM_OTP_KEY2 && 11332f8c34bdSxb.wang key_id != RK_OEM_OTP_KEY3 && 11342f8c34bdSxb.wang key_id != RK_OEM_OTP_KEY_FW) 1135fc3694d6Sxb.wang return TEEC_ERROR_BAD_PARAMETERS; 1136fc3694d6Sxb.wang 11372f8c34bdSxb.wang if (!config) 1138fc3694d6Sxb.wang return TEEC_ERROR_BAD_PARAMETERS; 1139fc3694d6Sxb.wang 1140fc3694d6Sxb.wang if (config->algo != RK_ALGO_AES && config->algo != RK_ALGO_SM4) 1141fc3694d6Sxb.wang return TEEC_ERROR_BAD_PARAMETERS; 1142fc3694d6Sxb.wang 1143fc3694d6Sxb.wang if (config->mode >= RK_CIPHER_MODE_XTS) 1144fc3694d6Sxb.wang return TEEC_ERROR_BAD_PARAMETERS; 1145fc3694d6Sxb.wang 1146fc3694d6Sxb.wang if (config->operation != RK_MODE_ENCRYPT && 1147fc3694d6Sxb.wang config->operation != RK_MODE_DECRYPT) 1148fc3694d6Sxb.wang return TEEC_ERROR_BAD_PARAMETERS; 1149fc3694d6Sxb.wang 1150fc3694d6Sxb.wang if (config->key_len != 16 && 1151fc3694d6Sxb.wang config->key_len != 24 && 1152fc3694d6Sxb.wang config->key_len != 32) 1153fc3694d6Sxb.wang return TEEC_ERROR_BAD_PARAMETERS; 1154fc3694d6Sxb.wang 11552f8c34bdSxb.wang if (key_id == RK_OEM_OTP_KEY_FW && config->key_len != 16) 11562f8c34bdSxb.wang return TEEC_ERROR_BAD_PARAMETERS; 11572f8c34bdSxb.wang 11582f8c34bdSxb.wang #if defined(CONFIG_ROCKCHIP_RV1126) 11592f8c34bdSxb.wang if (config->key_len == 24) 11602f8c34bdSxb.wang return TEEC_ERROR_BAD_PARAMETERS; 11612f8c34bdSxb.wang #endif 11622f8c34bdSxb.wang 1163fc3694d6Sxb.wang if (len % AES_BLOCK_SIZE || 1164fc3694d6Sxb.wang len == 0) 1165fc3694d6Sxb.wang return TEEC_ERROR_BAD_PARAMETERS; 1166fc3694d6Sxb.wang 11672f8c34bdSxb.wang if (!src_phys_addr || !dst_phys_addr) 11682f8c34bdSxb.wang return TEEC_ERROR_BAD_PARAMETERS; 11692f8c34bdSxb.wang 1170fc3694d6Sxb.wang TeecResult = OpteeClientApiLibInitialize(); 1171fc3694d6Sxb.wang if (TeecResult != TEEC_SUCCESS) 1172fc3694d6Sxb.wang return TeecResult; 1173fc3694d6Sxb.wang 1174fc3694d6Sxb.wang TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1175fc3694d6Sxb.wang if (TeecResult != TEEC_SUCCESS) 1176fc3694d6Sxb.wang return TeecResult; 1177fc3694d6Sxb.wang 1178fc3694d6Sxb.wang TeecResult = TEEC_OpenSession(&TeecContext, 1179fc3694d6Sxb.wang &TeecSession, 1180fc3694d6Sxb.wang &uuid, 1181fc3694d6Sxb.wang TEEC_LOGIN_PUBLIC, 1182fc3694d6Sxb.wang NULL, 1183fc3694d6Sxb.wang NULL, 1184fc3694d6Sxb.wang &ErrorOrigin); 1185fc3694d6Sxb.wang if (TeecResult != TEEC_SUCCESS) 1186fc3694d6Sxb.wang goto exit; 1187fc3694d6Sxb.wang 1188fc3694d6Sxb.wang SharedMem_config.size = sizeof(rk_cipher_config); 1189fc3694d6Sxb.wang TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem_config); 1190fc3694d6Sxb.wang if (TeecResult != TEEC_SUCCESS) 1191fc3694d6Sxb.wang goto exit; 1192fc3694d6Sxb.wang 1193fc3694d6Sxb.wang memcpy(SharedMem_config.buffer, config, sizeof(rk_cipher_config)); 1194fc3694d6Sxb.wang TeecOperation.params[0].value.a = key_id; 1195fc3694d6Sxb.wang TeecOperation.params[1].tmpref.buffer = SharedMem_config.buffer; 1196fc3694d6Sxb.wang TeecOperation.params[1].tmpref.size = SharedMem_config.size; 11972f8c34bdSxb.wang TeecOperation.params[2].value.a = src_phys_addr; 11982f8c34bdSxb.wang TeecOperation.params[2].value.b = len; 11992f8c34bdSxb.wang TeecOperation.params[3].value.a = dst_phys_addr; 1200fc3694d6Sxb.wang TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 1201fc3694d6Sxb.wang TEEC_MEMREF_TEMP_INPUT, 12022f8c34bdSxb.wang TEEC_VALUE_INPUT, 12032f8c34bdSxb.wang TEEC_VALUE_INPUT); 12042f8c34bdSxb.wang 12052f8c34bdSxb.wang crypto_flush_cacheline(src_phys_addr, len); 12062f8c34bdSxb.wang crypto_flush_cacheline(dst_phys_addr, len); 12072f8c34bdSxb.wang 1208fc3694d6Sxb.wang TeecResult = TEEC_InvokeCommand(&TeecSession, 12092f8c34bdSxb.wang CRYPTO_SERVICE_CMD_OEM_OTP_KEY_PHYS_CIPHER, 1210fc3694d6Sxb.wang &TeecOperation, 1211fc3694d6Sxb.wang &ErrorOrigin); 1212fc3694d6Sxb.wang 1213a900eef3SHisping Lin crypto_invalidate_cacheline(dst_phys_addr, len); 1214a900eef3SHisping Lin 1215fc3694d6Sxb.wang exit: 1216fc3694d6Sxb.wang TEEC_ReleaseSharedMemory(&SharedMem_config); 1217fc3694d6Sxb.wang TEEC_CloseSession(&TeecSession); 1218fc3694d6Sxb.wang TEEC_FinalizeContext(&TeecContext); 1219fc3694d6Sxb.wang return TeecResult; 1220fc3694d6Sxb.wang } 1221fc3694d6Sxb.wang 1222a828eba9SHisping Lin uint32_t trusty_write_oem_hdcp_key(enum RK_HDCP_KEYID key_id, 1223a828eba9SHisping Lin uint8_t *byte_buf, uint32_t byte_len) 1224a828eba9SHisping Lin { 1225a828eba9SHisping Lin TEEC_Result TeecResult; 1226a828eba9SHisping Lin TEEC_Context TeecContext; 1227a828eba9SHisping Lin TEEC_Session TeecSession; 1228a828eba9SHisping Lin uint32_t ErrorOrigin; 1229a828eba9SHisping Lin 1230a828eba9SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 1231a828eba9SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 1232a828eba9SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 1233a828eba9SHisping Lin TEEC_Operation TeecOperation = {0}; 1234a828eba9SHisping Lin 1235a828eba9SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 1236a828eba9SHisping Lin if (TeecResult != TEEC_SUCCESS) 1237a828eba9SHisping Lin return TeecResult; 1238a828eba9SHisping Lin 1239a828eba9SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1240a828eba9SHisping Lin if (TeecResult != TEEC_SUCCESS) 1241a828eba9SHisping Lin return TeecResult; 1242a828eba9SHisping Lin 1243a828eba9SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 1244a828eba9SHisping Lin &TeecSession, 1245a828eba9SHisping Lin TeecUuid, 1246a828eba9SHisping Lin TEEC_LOGIN_PUBLIC, 1247a828eba9SHisping Lin NULL, 1248a828eba9SHisping Lin NULL, 1249a828eba9SHisping Lin &ErrorOrigin); 1250a828eba9SHisping Lin if (TeecResult != TEEC_SUCCESS) 1251a828eba9SHisping Lin return TeecResult; 1252a828eba9SHisping Lin 1253a828eba9SHisping Lin TeecOperation.params[0].value.a = key_id; 1254a828eba9SHisping Lin 1255a828eba9SHisping Lin TEEC_SharedMemory SharedMem = {0}; 1256a828eba9SHisping Lin 1257a828eba9SHisping Lin SharedMem.size = byte_len; 1258a828eba9SHisping Lin SharedMem.flags = 0; 1259a828eba9SHisping Lin 1260a828eba9SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem); 1261a828eba9SHisping Lin if (TeecResult != TEEC_SUCCESS) 1262a828eba9SHisping Lin goto exit; 1263a828eba9SHisping Lin 1264a828eba9SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem.buffer; 1265a828eba9SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem.size; 1266a828eba9SHisping Lin 1267a828eba9SHisping Lin memcpy(SharedMem.buffer, byte_buf, SharedMem.size); 1268a828eba9SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 1269a828eba9SHisping Lin TEEC_MEMREF_TEMP_INPUT, 1270a828eba9SHisping Lin TEEC_NONE, 1271a828eba9SHisping Lin TEEC_NONE); 1272a828eba9SHisping Lin 1273a828eba9SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 1274a828eba9SHisping Lin STORAGE_CMD_WRITE_OEM_HDCP_KEY, 1275a828eba9SHisping Lin &TeecOperation, 1276a828eba9SHisping Lin &ErrorOrigin); 1277a828eba9SHisping Lin if (TeecResult != TEEC_SUCCESS) 1278a828eba9SHisping Lin goto exit; 1279a828eba9SHisping Lin 1280a828eba9SHisping Lin exit: 1281a828eba9SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem); 1282a828eba9SHisping Lin TEEC_CloseSession(&TeecSession); 1283a828eba9SHisping Lin TEEC_FinalizeContext(&TeecContext); 1284a828eba9SHisping Lin 1285a828eba9SHisping Lin return TeecResult; 1286a828eba9SHisping Lin } 1287a828eba9SHisping Lin 1288e8bc2655SHisping Lin uint32_t trusty_oem_hdcp_key_is_written(enum RK_HDCP_KEYID key_id, uint8_t *value) 1289e8bc2655SHisping Lin { 1290e8bc2655SHisping Lin TEEC_Result TeecResult; 1291e8bc2655SHisping Lin TEEC_Context TeecContext; 1292e8bc2655SHisping Lin TEEC_Session TeecSession; 1293e8bc2655SHisping Lin uint32_t ErrorOrigin; 1294e8bc2655SHisping Lin 1295e8bc2655SHisping Lin *value = 0xFF; 1296e8bc2655SHisping Lin 1297e8bc2655SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 1298e8bc2655SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 1299e8bc2655SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 1300e8bc2655SHisping Lin TEEC_Operation TeecOperation = {0}; 1301e8bc2655SHisping Lin 1302e8bc2655SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 1303e8bc2655SHisping Lin if (TeecResult != TEEC_SUCCESS) 1304e8bc2655SHisping Lin return TeecResult; 1305e8bc2655SHisping Lin 1306e8bc2655SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1307e8bc2655SHisping Lin if (TeecResult != TEEC_SUCCESS) 1308e8bc2655SHisping Lin return TeecResult; 1309e8bc2655SHisping Lin 1310e8bc2655SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 1311e8bc2655SHisping Lin &TeecSession, 1312e8bc2655SHisping Lin TeecUuid, 1313e8bc2655SHisping Lin TEEC_LOGIN_PUBLIC, 1314e8bc2655SHisping Lin NULL, 1315e8bc2655SHisping Lin NULL, 1316e8bc2655SHisping Lin &ErrorOrigin); 1317e8bc2655SHisping Lin if (TeecResult != TEEC_SUCCESS) 1318e8bc2655SHisping Lin return TeecResult; 1319e8bc2655SHisping Lin 1320e8bc2655SHisping Lin TeecOperation.params[0].value.a = key_id; 1321e8bc2655SHisping Lin 1322e8bc2655SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INOUT, 1323e8bc2655SHisping Lin TEEC_NONE, 1324e8bc2655SHisping Lin TEEC_NONE, 1325e8bc2655SHisping Lin TEEC_NONE); 1326e8bc2655SHisping Lin 1327e8bc2655SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 1328e8bc2655SHisping Lin STORAGE_CMD_OEM_HDCP_KEY_IS_WRITTEN, 1329e8bc2655SHisping Lin &TeecOperation, 1330e8bc2655SHisping Lin &ErrorOrigin); 1331e8bc2655SHisping Lin if (TeecResult == TEEC_SUCCESS) 1332e8bc2655SHisping Lin *value = TeecOperation.params[0].value.b; 1333e8bc2655SHisping Lin 1334e8bc2655SHisping Lin TEEC_CloseSession(&TeecSession); 1335e8bc2655SHisping Lin TEEC_FinalizeContext(&TeecContext); 1336e8bc2655SHisping Lin 1337e8bc2655SHisping Lin return TeecResult; 1338e8bc2655SHisping Lin } 1339e8bc2655SHisping Lin 1340bfd9cea4SHisping Lin uint32_t trusty_set_oem_hdcp_key_mask(enum RK_HDCP_KEYID key_id) 1341bfd9cea4SHisping Lin { 1342bfd9cea4SHisping Lin TEEC_Result TeecResult; 1343bfd9cea4SHisping Lin TEEC_Context TeecContext; 1344bfd9cea4SHisping Lin TEEC_Session TeecSession; 1345bfd9cea4SHisping Lin uint32_t ErrorOrigin; 1346bfd9cea4SHisping Lin 1347bfd9cea4SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 1348bfd9cea4SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 1349bfd9cea4SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 1350bfd9cea4SHisping Lin TEEC_Operation TeecOperation = {0}; 1351bfd9cea4SHisping Lin 1352bfd9cea4SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 1353bfd9cea4SHisping Lin if (TeecResult != TEEC_SUCCESS) 1354bfd9cea4SHisping Lin return TeecResult; 1355bfd9cea4SHisping Lin 1356bfd9cea4SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1357bfd9cea4SHisping Lin if (TeecResult != TEEC_SUCCESS) 1358bfd9cea4SHisping Lin return TeecResult; 1359bfd9cea4SHisping Lin 1360bfd9cea4SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 1361bfd9cea4SHisping Lin &TeecSession, 1362bfd9cea4SHisping Lin TeecUuid, 1363bfd9cea4SHisping Lin TEEC_LOGIN_PUBLIC, 1364bfd9cea4SHisping Lin NULL, 1365bfd9cea4SHisping Lin NULL, 1366bfd9cea4SHisping Lin &ErrorOrigin); 1367bfd9cea4SHisping Lin if (TeecResult != TEEC_SUCCESS) 1368bfd9cea4SHisping Lin return TeecResult; 1369bfd9cea4SHisping Lin 1370bfd9cea4SHisping Lin TeecOperation.params[0].value.a = key_id; 1371bfd9cea4SHisping Lin 1372bfd9cea4SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 1373bfd9cea4SHisping Lin TEEC_NONE, 1374bfd9cea4SHisping Lin TEEC_NONE, 1375bfd9cea4SHisping Lin TEEC_NONE); 1376bfd9cea4SHisping Lin 1377bfd9cea4SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 1378bfd9cea4SHisping Lin STORAGE_CMD_SET_OEM_HDCP_KEY_MASK, 1379bfd9cea4SHisping Lin &TeecOperation, 1380bfd9cea4SHisping Lin &ErrorOrigin); 1381bfd9cea4SHisping Lin if (TeecResult != TEEC_SUCCESS) 1382bfd9cea4SHisping Lin goto exit; 1383bfd9cea4SHisping Lin 1384bfd9cea4SHisping Lin exit: 1385bfd9cea4SHisping Lin TEEC_CloseSession(&TeecSession); 1386bfd9cea4SHisping Lin TEEC_FinalizeContext(&TeecContext); 1387bfd9cea4SHisping Lin 1388bfd9cea4SHisping Lin return TeecResult; 1389bfd9cea4SHisping Lin } 1390bfd9cea4SHisping Lin 1391ac6d8253SHisping Lin uint32_t trusty_write_esck_key(enum RK_ESCK_KEYID key_id, 1392ac6d8253SHisping Lin uint8_t *byte_buf, uint32_t byte_len) 1393ac6d8253SHisping Lin { 1394ac6d8253SHisping Lin TEEC_Result TeecResult; 1395ac6d8253SHisping Lin TEEC_Context TeecContext; 1396ac6d8253SHisping Lin TEEC_Session TeecSession; 1397ac6d8253SHisping Lin uint32_t ErrorOrigin; 1398ac6d8253SHisping Lin 1399ac6d8253SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 1400ac6d8253SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 1401ac6d8253SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 1402ac6d8253SHisping Lin TEEC_Operation TeecOperation = {0}; 1403ac6d8253SHisping Lin 1404ac6d8253SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 1405ac6d8253SHisping Lin if (TeecResult != TEEC_SUCCESS) 1406ac6d8253SHisping Lin return TeecResult; 1407ac6d8253SHisping Lin 1408ac6d8253SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1409ac6d8253SHisping Lin if (TeecResult != TEEC_SUCCESS) 1410ac6d8253SHisping Lin return TeecResult; 1411ac6d8253SHisping Lin 1412ac6d8253SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 1413ac6d8253SHisping Lin &TeecSession, 1414ac6d8253SHisping Lin TeecUuid, 1415ac6d8253SHisping Lin TEEC_LOGIN_PUBLIC, 1416ac6d8253SHisping Lin NULL, 1417ac6d8253SHisping Lin NULL, 1418ac6d8253SHisping Lin &ErrorOrigin); 1419ac6d8253SHisping Lin if (TeecResult != TEEC_SUCCESS) 1420ac6d8253SHisping Lin return TeecResult; 1421ac6d8253SHisping Lin 1422ac6d8253SHisping Lin TeecOperation.params[0].value.a = key_id; 1423ac6d8253SHisping Lin 1424ac6d8253SHisping Lin TEEC_SharedMemory SharedMem = {0}; 1425ac6d8253SHisping Lin 1426ac6d8253SHisping Lin SharedMem.size = byte_len; 1427ac6d8253SHisping Lin SharedMem.flags = 0; 1428ac6d8253SHisping Lin 1429ac6d8253SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem); 1430ac6d8253SHisping Lin if (TeecResult != TEEC_SUCCESS) 1431ac6d8253SHisping Lin goto exit; 1432ac6d8253SHisping Lin 1433ac6d8253SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem.buffer; 1434ac6d8253SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem.size; 1435ac6d8253SHisping Lin 1436ac6d8253SHisping Lin memcpy(SharedMem.buffer, byte_buf, SharedMem.size); 1437ac6d8253SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 1438ac6d8253SHisping Lin TEEC_MEMREF_TEMP_INPUT, 1439ac6d8253SHisping Lin TEEC_NONE, 1440ac6d8253SHisping Lin TEEC_NONE); 1441ac6d8253SHisping Lin 1442ac6d8253SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 1443ac6d8253SHisping Lin STORAGE_CMD_WRITE_ESCK_KEY, 1444ac6d8253SHisping Lin &TeecOperation, 1445ac6d8253SHisping Lin &ErrorOrigin); 1446ac6d8253SHisping Lin if (TeecResult != TEEC_SUCCESS) 1447ac6d8253SHisping Lin goto exit; 1448ac6d8253SHisping Lin 1449ac6d8253SHisping Lin exit: 1450ac6d8253SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem); 1451ac6d8253SHisping Lin TEEC_CloseSession(&TeecSession); 1452ac6d8253SHisping Lin TEEC_FinalizeContext(&TeecContext); 1453ac6d8253SHisping Lin 1454ac6d8253SHisping Lin return TeecResult; 1455ac6d8253SHisping Lin } 1456ac6d8253SHisping Lin 1457ac6d8253SHisping Lin uint32_t trusty_esck_key_is_written(enum RK_ESCK_KEYID key_id, uint8_t *value) 1458ac6d8253SHisping Lin { 1459ac6d8253SHisping Lin TEEC_Result TeecResult; 1460ac6d8253SHisping Lin TEEC_Context TeecContext; 1461ac6d8253SHisping Lin TEEC_Session TeecSession; 1462ac6d8253SHisping Lin uint32_t ErrorOrigin; 1463ac6d8253SHisping Lin 1464ac6d8253SHisping Lin *value = 0xFF; 1465ac6d8253SHisping Lin 1466ac6d8253SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 1467ac6d8253SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 1468ac6d8253SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 1469ac6d8253SHisping Lin TEEC_Operation TeecOperation = {0}; 1470ac6d8253SHisping Lin 1471ac6d8253SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 1472ac6d8253SHisping Lin if (TeecResult != TEEC_SUCCESS) 1473ac6d8253SHisping Lin return TeecResult; 1474ac6d8253SHisping Lin 1475ac6d8253SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1476ac6d8253SHisping Lin if (TeecResult != TEEC_SUCCESS) 1477ac6d8253SHisping Lin return TeecResult; 1478ac6d8253SHisping Lin 1479ac6d8253SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 1480ac6d8253SHisping Lin &TeecSession, 1481ac6d8253SHisping Lin TeecUuid, 1482ac6d8253SHisping Lin TEEC_LOGIN_PUBLIC, 1483ac6d8253SHisping Lin NULL, 1484ac6d8253SHisping Lin NULL, 1485ac6d8253SHisping Lin &ErrorOrigin); 1486ac6d8253SHisping Lin if (TeecResult != TEEC_SUCCESS) 1487ac6d8253SHisping Lin return TeecResult; 1488ac6d8253SHisping Lin 1489ac6d8253SHisping Lin TeecOperation.params[0].value.a = key_id; 1490ac6d8253SHisping Lin 1491ac6d8253SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INOUT, 1492ac6d8253SHisping Lin TEEC_NONE, 1493ac6d8253SHisping Lin TEEC_NONE, 1494ac6d8253SHisping Lin TEEC_NONE); 1495ac6d8253SHisping Lin 1496ac6d8253SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 1497ac6d8253SHisping Lin STORAGE_CMD_ESCK_KEY_IS_WRITTEN, 1498ac6d8253SHisping Lin &TeecOperation, 1499ac6d8253SHisping Lin &ErrorOrigin); 1500ac6d8253SHisping Lin if (TeecResult == TEEC_SUCCESS) 1501ac6d8253SHisping Lin *value = TeecOperation.params[0].value.b; 1502ac6d8253SHisping Lin 1503ac6d8253SHisping Lin TEEC_CloseSession(&TeecSession); 1504ac6d8253SHisping Lin TEEC_FinalizeContext(&TeecContext); 1505ac6d8253SHisping Lin 1506ac6d8253SHisping Lin return TeecResult; 1507ac6d8253SHisping Lin } 1508ac6d8253SHisping Lin 1509ac6d8253SHisping Lin uint32_t trusty_set_esck_key_mask(enum RK_ESCK_KEYID key_id) 1510ac6d8253SHisping Lin { 1511ac6d8253SHisping Lin TEEC_Result TeecResult; 1512ac6d8253SHisping Lin TEEC_Context TeecContext; 1513ac6d8253SHisping Lin TEEC_Session TeecSession; 1514ac6d8253SHisping Lin uint32_t ErrorOrigin; 1515ac6d8253SHisping Lin 1516ac6d8253SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 1517ac6d8253SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 1518ac6d8253SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 1519ac6d8253SHisping Lin TEEC_Operation TeecOperation = {0}; 1520ac6d8253SHisping Lin 1521ac6d8253SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 1522ac6d8253SHisping Lin if (TeecResult != TEEC_SUCCESS) 1523ac6d8253SHisping Lin return TeecResult; 1524ac6d8253SHisping Lin 1525ac6d8253SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1526ac6d8253SHisping Lin if (TeecResult != TEEC_SUCCESS) 1527ac6d8253SHisping Lin return TeecResult; 1528ac6d8253SHisping Lin 1529ac6d8253SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 1530ac6d8253SHisping Lin &TeecSession, 1531ac6d8253SHisping Lin TeecUuid, 1532ac6d8253SHisping Lin TEEC_LOGIN_PUBLIC, 1533ac6d8253SHisping Lin NULL, 1534ac6d8253SHisping Lin NULL, 1535ac6d8253SHisping Lin &ErrorOrigin); 1536ac6d8253SHisping Lin if (TeecResult != TEEC_SUCCESS) 1537ac6d8253SHisping Lin return TeecResult; 1538ac6d8253SHisping Lin 1539ac6d8253SHisping Lin TeecOperation.params[0].value.a = key_id; 1540ac6d8253SHisping Lin 1541ac6d8253SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 1542ac6d8253SHisping Lin TEEC_NONE, 1543ac6d8253SHisping Lin TEEC_NONE, 1544ac6d8253SHisping Lin TEEC_NONE); 1545ac6d8253SHisping Lin 1546ac6d8253SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 1547ac6d8253SHisping Lin STORAGE_CMD_SET_ESCK_KEY_MASK, 1548ac6d8253SHisping Lin &TeecOperation, 1549ac6d8253SHisping Lin &ErrorOrigin); 1550ac6d8253SHisping Lin if (TeecResult != TEEC_SUCCESS) 1551ac6d8253SHisping Lin goto exit; 1552ac6d8253SHisping Lin 1553ac6d8253SHisping Lin exit: 1554ac6d8253SHisping Lin TEEC_CloseSession(&TeecSession); 1555ac6d8253SHisping Lin TEEC_FinalizeContext(&TeecContext); 1556ac6d8253SHisping Lin 1557ac6d8253SHisping Lin return TeecResult; 1558ac6d8253SHisping Lin } 1559ac6d8253SHisping Lin 156011b25801SHisping Lin uint32_t trusty_write_fw_encrypt_key(enum RK_FW_KEYID key_id, 156111b25801SHisping Lin uint8_t *byte_buf, uint32_t byte_len) 156211b25801SHisping Lin { 156311b25801SHisping Lin TEEC_Result TeecResult; 156411b25801SHisping Lin TEEC_Context TeecContext; 156511b25801SHisping Lin TEEC_Session TeecSession; 156611b25801SHisping Lin uint32_t ErrorOrigin; 156711b25801SHisping Lin 156811b25801SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 156911b25801SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 157011b25801SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 157111b25801SHisping Lin TEEC_Operation TeecOperation = {0}; 157211b25801SHisping Lin 157311b25801SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 157411b25801SHisping Lin if (TeecResult != TEEC_SUCCESS) 157511b25801SHisping Lin return TeecResult; 157611b25801SHisping Lin 157711b25801SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 157811b25801SHisping Lin if (TeecResult != TEEC_SUCCESS) 157911b25801SHisping Lin return TeecResult; 158011b25801SHisping Lin 158111b25801SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 158211b25801SHisping Lin &TeecSession, 158311b25801SHisping Lin TeecUuid, 158411b25801SHisping Lin TEEC_LOGIN_PUBLIC, 158511b25801SHisping Lin NULL, 158611b25801SHisping Lin NULL, 158711b25801SHisping Lin &ErrorOrigin); 158811b25801SHisping Lin if (TeecResult != TEEC_SUCCESS) 158911b25801SHisping Lin return TeecResult; 159011b25801SHisping Lin 159111b25801SHisping Lin TeecOperation.params[0].value.a = key_id; 159211b25801SHisping Lin 159311b25801SHisping Lin TEEC_SharedMemory SharedMem = {0}; 159411b25801SHisping Lin 159511b25801SHisping Lin SharedMem.size = byte_len; 159611b25801SHisping Lin SharedMem.flags = 0; 159711b25801SHisping Lin 159811b25801SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem); 159911b25801SHisping Lin if (TeecResult != TEEC_SUCCESS) 160011b25801SHisping Lin goto exit; 160111b25801SHisping Lin 160211b25801SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem.buffer; 160311b25801SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem.size; 160411b25801SHisping Lin 160511b25801SHisping Lin memcpy(SharedMem.buffer, byte_buf, SharedMem.size); 160611b25801SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 160711b25801SHisping Lin TEEC_MEMREF_TEMP_INPUT, 160811b25801SHisping Lin TEEC_NONE, 160911b25801SHisping Lin TEEC_NONE); 161011b25801SHisping Lin 161111b25801SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 161211b25801SHisping Lin STORAGE_CMD_WRITE_FW_ENCRYPT_KEY, 161311b25801SHisping Lin &TeecOperation, 161411b25801SHisping Lin &ErrorOrigin); 161511b25801SHisping Lin if (TeecResult != TEEC_SUCCESS) 161611b25801SHisping Lin goto exit; 161711b25801SHisping Lin 161811b25801SHisping Lin exit: 161911b25801SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem); 162011b25801SHisping Lin TEEC_CloseSession(&TeecSession); 162111b25801SHisping Lin TEEC_FinalizeContext(&TeecContext); 162211b25801SHisping Lin 162311b25801SHisping Lin return TeecResult; 162411b25801SHisping Lin } 162511b25801SHisping Lin 162611b25801SHisping Lin uint32_t trusty_fw_encrypt_key_is_written(enum RK_FW_KEYID key_id, uint8_t *value) 162711b25801SHisping Lin { 162811b25801SHisping Lin TEEC_Result TeecResult; 162911b25801SHisping Lin TEEC_Context TeecContext; 163011b25801SHisping Lin TEEC_Session TeecSession; 163111b25801SHisping Lin uint32_t ErrorOrigin; 163211b25801SHisping Lin 163311b25801SHisping Lin *value = 0xFF; 163411b25801SHisping Lin 163511b25801SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 163611b25801SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 163711b25801SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 163811b25801SHisping Lin TEEC_Operation TeecOperation = {0}; 163911b25801SHisping Lin 164011b25801SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 164111b25801SHisping Lin if (TeecResult != TEEC_SUCCESS) 164211b25801SHisping Lin return TeecResult; 164311b25801SHisping Lin 164411b25801SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 164511b25801SHisping Lin if (TeecResult != TEEC_SUCCESS) 164611b25801SHisping Lin return TeecResult; 164711b25801SHisping Lin 164811b25801SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 164911b25801SHisping Lin &TeecSession, 165011b25801SHisping Lin TeecUuid, 165111b25801SHisping Lin TEEC_LOGIN_PUBLIC, 165211b25801SHisping Lin NULL, 165311b25801SHisping Lin NULL, 165411b25801SHisping Lin &ErrorOrigin); 165511b25801SHisping Lin if (TeecResult != TEEC_SUCCESS) 165611b25801SHisping Lin return TeecResult; 165711b25801SHisping Lin 165811b25801SHisping Lin TeecOperation.params[0].value.a = key_id; 165911b25801SHisping Lin 166011b25801SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INOUT, 166111b25801SHisping Lin TEEC_NONE, 166211b25801SHisping Lin TEEC_NONE, 166311b25801SHisping Lin TEEC_NONE); 166411b25801SHisping Lin 166511b25801SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 166611b25801SHisping Lin STORAGE_CMD_FW_ENCRYPT_KEY_IS_WRITTEN, 166711b25801SHisping Lin &TeecOperation, 166811b25801SHisping Lin &ErrorOrigin); 166911b25801SHisping Lin if (TeecResult == TEEC_SUCCESS) 167011b25801SHisping Lin *value = TeecOperation.params[0].value.b; 167111b25801SHisping Lin 167211b25801SHisping Lin TEEC_CloseSession(&TeecSession); 167311b25801SHisping Lin TEEC_FinalizeContext(&TeecContext); 167411b25801SHisping Lin 167511b25801SHisping Lin return TeecResult; 167611b25801SHisping Lin } 167711b25801SHisping Lin 167811b25801SHisping Lin uint32_t trusty_set_fw_encrypt_key_mask(enum RK_FW_KEYID key_id) 167911b25801SHisping Lin { 168011b25801SHisping Lin TEEC_Result TeecResult; 168111b25801SHisping Lin TEEC_Context TeecContext; 168211b25801SHisping Lin TEEC_Session TeecSession; 168311b25801SHisping Lin uint32_t ErrorOrigin; 168411b25801SHisping Lin 168511b25801SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 168611b25801SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 168711b25801SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 168811b25801SHisping Lin TEEC_Operation TeecOperation = {0}; 168911b25801SHisping Lin 169011b25801SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 169111b25801SHisping Lin if (TeecResult != TEEC_SUCCESS) 169211b25801SHisping Lin return TeecResult; 169311b25801SHisping Lin 169411b25801SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 169511b25801SHisping Lin if (TeecResult != TEEC_SUCCESS) 169611b25801SHisping Lin return TeecResult; 169711b25801SHisping Lin 169811b25801SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 169911b25801SHisping Lin &TeecSession, 170011b25801SHisping Lin TeecUuid, 170111b25801SHisping Lin TEEC_LOGIN_PUBLIC, 170211b25801SHisping Lin NULL, 170311b25801SHisping Lin NULL, 170411b25801SHisping Lin &ErrorOrigin); 170511b25801SHisping Lin if (TeecResult != TEEC_SUCCESS) 170611b25801SHisping Lin return TeecResult; 170711b25801SHisping Lin 170811b25801SHisping Lin TeecOperation.params[0].value.a = key_id; 170911b25801SHisping Lin 171011b25801SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 171111b25801SHisping Lin TEEC_NONE, 171211b25801SHisping Lin TEEC_NONE, 171311b25801SHisping Lin TEEC_NONE); 171411b25801SHisping Lin 171511b25801SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 171611b25801SHisping Lin STORAGE_CMD_SET_FW_ENCRYPT_KEY_MASK, 171711b25801SHisping Lin &TeecOperation, 171811b25801SHisping Lin &ErrorOrigin); 171911b25801SHisping Lin if (TeecResult != TEEC_SUCCESS) 172011b25801SHisping Lin goto exit; 172111b25801SHisping Lin 172211b25801SHisping Lin exit: 172311b25801SHisping Lin TEEC_CloseSession(&TeecSession); 172411b25801SHisping Lin TEEC_FinalizeContext(&TeecContext); 172511b25801SHisping Lin 172611b25801SHisping Lin return TeecResult; 172711b25801SHisping Lin } 17284d4c5043SHisping Lin uint32_t trusty_oem_user_ta_transfer(void) 17294d4c5043SHisping Lin { 17304d4c5043SHisping Lin TEEC_Result TeecResult; 17314d4c5043SHisping Lin TEEC_Context TeecContext; 17324d4c5043SHisping Lin TEEC_Session TeecSession; 17334d4c5043SHisping Lin uint32_t ErrorOrigin; 17344d4c5043SHisping Lin TEEC_UUID tempuuid = { 0x1db57234, 0xdacd, 0x462d, 17354d4c5043SHisping Lin { 0x9b, 0xb1, 0xae, 0x79, 0xde, 0x44, 0xe2, 0xa5} }; 17364d4c5043SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 17374d4c5043SHisping Lin TEEC_Operation TeecOperation = {0}; 17384d4c5043SHisping Lin const uint8_t transfer_inout[] = "Transfer data test."; 17394d4c5043SHisping Lin 17404d4c5043SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 17414d4c5043SHisping Lin if (TeecResult != TEEC_SUCCESS) 17424d4c5043SHisping Lin return TeecResult; 17434d4c5043SHisping Lin 17444d4c5043SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 17454d4c5043SHisping Lin if (TeecResult != TEEC_SUCCESS) 17464d4c5043SHisping Lin return TeecResult; 17474d4c5043SHisping Lin 17484d4c5043SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE, 17494d4c5043SHisping Lin TEEC_NONE, 17504d4c5043SHisping Lin TEEC_NONE, 17514d4c5043SHisping Lin TEEC_NONE); 17524d4c5043SHisping Lin 17534d4c5043SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 17544d4c5043SHisping Lin &TeecSession, 17554d4c5043SHisping Lin TeecUuid, 17564d4c5043SHisping Lin TEEC_LOGIN_PUBLIC, 17574d4c5043SHisping Lin NULL, 17584d4c5043SHisping Lin &TeecOperation, 17594d4c5043SHisping Lin &ErrorOrigin); 17604d4c5043SHisping Lin if (TeecResult != TEEC_SUCCESS) 17614d4c5043SHisping Lin return TeecResult; 17624d4c5043SHisping Lin 17634d4c5043SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 17644d4c5043SHisping Lin 17654d4c5043SHisping Lin SharedMem0.size = sizeof(transfer_inout); 17664d4c5043SHisping Lin SharedMem0.flags = 0; 17674d4c5043SHisping Lin 17684d4c5043SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 17694d4c5043SHisping Lin if (TeecResult != TEEC_SUCCESS) 17704d4c5043SHisping Lin goto exit; 17714d4c5043SHisping Lin 17724d4c5043SHisping Lin memcpy(SharedMem0.buffer, transfer_inout, SharedMem0.size); 17734d4c5043SHisping Lin 17744d4c5043SHisping Lin TEEC_SharedMemory SharedMem1 = {0}; 17754d4c5043SHisping Lin 17764d4c5043SHisping Lin SharedMem1.size = sizeof(transfer_inout); 17774d4c5043SHisping Lin SharedMem1.flags = 0; 17784d4c5043SHisping Lin 17794d4c5043SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 17804d4c5043SHisping Lin if (TeecResult != TEEC_SUCCESS) 17814d4c5043SHisping Lin goto exit; 17824d4c5043SHisping Lin 17834d4c5043SHisping Lin TeecOperation.params[0].value.a = 66; 17844d4c5043SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem0.buffer; 17854d4c5043SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem0.size; 17864d4c5043SHisping Lin TeecOperation.params[2].tmpref.buffer = SharedMem1.buffer; 17874d4c5043SHisping Lin TeecOperation.params[2].tmpref.size = SharedMem1.size; 17884d4c5043SHisping Lin 17894d4c5043SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INOUT, 17904d4c5043SHisping Lin TEEC_MEMREF_TEMP_INPUT, 17914d4c5043SHisping Lin TEEC_MEMREF_TEMP_OUTPUT, 17924d4c5043SHisping Lin TEEC_NONE); 17934d4c5043SHisping Lin 17944d4c5043SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 17954d4c5043SHisping Lin 102, 17964d4c5043SHisping Lin &TeecOperation, 17974d4c5043SHisping Lin &ErrorOrigin); 17984d4c5043SHisping Lin if (TeecResult != TEEC_SUCCESS) 17994d4c5043SHisping Lin goto exit; 18004d4c5043SHisping Lin 18014d4c5043SHisping Lin //Check the result 18024d4c5043SHisping Lin if (TeecOperation.params[0].value.a == 66 + 1 && 18034d4c5043SHisping Lin TeecOperation.params[0].value.b == TeecOperation.params[0].value.a) 18044d4c5043SHisping Lin printf("test value : Pass!\n"); 18054d4c5043SHisping Lin else 18064d4c5043SHisping Lin printf("test value : Fail! (mismatch values)\n"); 18074d4c5043SHisping Lin 18084d4c5043SHisping Lin if (memcmp(SharedMem1.buffer, transfer_inout, sizeof(transfer_inout)) == 0) 18094d4c5043SHisping Lin printf("test buffer : Pass!\n"); 18104d4c5043SHisping Lin else 18114d4c5043SHisping Lin printf("test buffer : Fail! (mismatch buffer)\n"); 18124d4c5043SHisping Lin 18134d4c5043SHisping Lin exit: 18144d4c5043SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 18154d4c5043SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem1); 18164d4c5043SHisping Lin TEEC_CloseSession(&TeecSession); 18174d4c5043SHisping Lin TEEC_FinalizeContext(&TeecContext); 18184d4c5043SHisping Lin 18194d4c5043SHisping Lin return TeecResult; 18204d4c5043SHisping Lin } 18214d4c5043SHisping Lin 18224d4c5043SHisping Lin uint32_t trusty_oem_user_ta_storage(void) 18234d4c5043SHisping Lin { 18244d4c5043SHisping Lin TEEC_Result TeecResult; 18254d4c5043SHisping Lin TEEC_Context TeecContext; 18264d4c5043SHisping Lin TEEC_Session TeecSession; 18274d4c5043SHisping Lin uint32_t ErrorOrigin; 18284d4c5043SHisping Lin TEEC_UUID tempuuid = { 0x1db57234, 0xdacd, 0x462d, 18294d4c5043SHisping Lin { 0x9b, 0xb1, 0xae, 0x79, 0xde, 0x44, 0xe2, 0xa5} }; 18304d4c5043SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 18314d4c5043SHisping Lin TEEC_Operation TeecOperation = {0}; 18324d4c5043SHisping Lin 18334d4c5043SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 18344d4c5043SHisping Lin if (TeecResult != TEEC_SUCCESS) 18354d4c5043SHisping Lin return TeecResult; 18364d4c5043SHisping Lin 18374d4c5043SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 18384d4c5043SHisping Lin if (TeecResult != TEEC_SUCCESS) 18394d4c5043SHisping Lin return TeecResult; 18404d4c5043SHisping Lin 18414d4c5043SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE, 18424d4c5043SHisping Lin TEEC_NONE, 18434d4c5043SHisping Lin TEEC_NONE, 18444d4c5043SHisping Lin TEEC_NONE); 18454d4c5043SHisping Lin 18464d4c5043SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 18474d4c5043SHisping Lin &TeecSession, 18484d4c5043SHisping Lin TeecUuid, 18494d4c5043SHisping Lin TEEC_LOGIN_PUBLIC, 18504d4c5043SHisping Lin NULL, 18514d4c5043SHisping Lin &TeecOperation, 18524d4c5043SHisping Lin &ErrorOrigin); 18534d4c5043SHisping Lin if (TeecResult != TEEC_SUCCESS) 18544d4c5043SHisping Lin return TeecResult; 18554d4c5043SHisping Lin 18564d4c5043SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE, 18574d4c5043SHisping Lin TEEC_NONE, 18584d4c5043SHisping Lin TEEC_NONE, 18594d4c5043SHisping Lin TEEC_NONE); 18604d4c5043SHisping Lin 18614d4c5043SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 18624d4c5043SHisping Lin 103, 18634d4c5043SHisping Lin &TeecOperation, 18644d4c5043SHisping Lin &ErrorOrigin); 18654d4c5043SHisping Lin if (TeecResult != TEEC_SUCCESS) 18664d4c5043SHisping Lin goto exit; 18674d4c5043SHisping Lin 18684d4c5043SHisping Lin exit: 18694d4c5043SHisping Lin TEEC_CloseSession(&TeecSession); 18704d4c5043SHisping Lin TEEC_FinalizeContext(&TeecContext); 18714d4c5043SHisping Lin 18724d4c5043SHisping Lin return TeecResult; 18734d4c5043SHisping Lin } 18744d4c5043SHisping Lin 18754aa61755SAndy Ye uint32_t trusty_attest_dh(uint8_t *dh, uint32_t *dh_size) 18764aa61755SAndy Ye { 18774aa61755SAndy Ye TEEC_Result TeecResult; 18784aa61755SAndy Ye TEEC_Context TeecContext; 18794aa61755SAndy Ye TEEC_Session TeecSession; 18804aa61755SAndy Ye uint32_t ErrorOrigin; 18814aa61755SAndy Ye TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6, 18824aa61755SAndy Ye { 0xa8, 0x69, 0x9c, 0xe6, 18834aa61755SAndy Ye 0x88, 0x6c, 0x5d, 0x5d 18844aa61755SAndy Ye } 18854aa61755SAndy Ye }; 18864aa61755SAndy Ye TEEC_UUID *TeecUuid = &tempuuid; 18874aa61755SAndy Ye TEEC_Operation TeecOperation = {0}; 18883251364cSHisping Lin struct blk_desc *dev_desc; 18893251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 18906651d4c0SJason Zhu if (!dev_desc) { 18916651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 18926651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 18936651d4c0SJason Zhu } 18944aa61755SAndy Ye 1895f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 1896f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1897f4e1db95SHisping Lin return TeecResult; 18984aa61755SAndy Ye 18994aa61755SAndy Ye TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1900f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1901f4e1db95SHisping Lin return TeecResult; 19024aa61755SAndy Ye 19033251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 19043251364cSHisping Lin TEEC_NONE, 19053251364cSHisping Lin TEEC_NONE, 19063251364cSHisping Lin TEEC_NONE); 19073251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 1908b9a7e756SHisping Lin if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0) 1909b9a7e756SHisping Lin TeecOperation.params[0].value.a = 1; 1910b9a7e756SHisping Lin else 1911b9a7e756SHisping Lin TeecOperation.params[0].value.a = 0; 1912b9a7e756SHisping Lin 19133251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 19143251364cSHisping Lin TeecOperation.params[0].value.a = 0; 19153251364cSHisping Lin #endif 19163251364cSHisping Lin 19174aa61755SAndy Ye TeecResult = TEEC_OpenSession(&TeecContext, 19184aa61755SAndy Ye &TeecSession, 19194aa61755SAndy Ye TeecUuid, 19204aa61755SAndy Ye TEEC_LOGIN_PUBLIC, 19214aa61755SAndy Ye NULL, 19223251364cSHisping Lin &TeecOperation, 19234aa61755SAndy Ye &ErrorOrigin); 1924f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1925f4e1db95SHisping Lin return TeecResult; 19264aa61755SAndy Ye 19274aa61755SAndy Ye TEEC_SharedMemory SharedMem0 = {0}; 19284aa61755SAndy Ye 19294aa61755SAndy Ye SharedMem0.size = *dh_size; 19304aa61755SAndy Ye SharedMem0.flags = 0; 19314aa61755SAndy Ye 19324aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 1933f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1934f4e1db95SHisping Lin goto exit; 19354aa61755SAndy Ye 19364aa61755SAndy Ye TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 19374aa61755SAndy Ye TeecOperation.params[0].tmpref.size = SharedMem0.size; 19384aa61755SAndy Ye 19394aa61755SAndy Ye TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, 19404aa61755SAndy Ye TEEC_NONE, 19414aa61755SAndy Ye TEEC_NONE, 19424aa61755SAndy Ye TEEC_NONE); 19434aa61755SAndy Ye 19444aa61755SAndy Ye TeecResult = TEEC_InvokeCommand(&TeecSession, 19454aa61755SAndy Ye 143, 19464aa61755SAndy Ye &TeecOperation, 19474aa61755SAndy Ye &ErrorOrigin); 1948f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1949f4e1db95SHisping Lin goto exit; 19504aa61755SAndy Ye 19514aa61755SAndy Ye *dh_size = TeecOperation.params[0].tmpref.size; 19524aa61755SAndy Ye memcpy(dh, SharedMem0.buffer, SharedMem0.size); 1953f4e1db95SHisping Lin exit: 19544aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem0); 19554aa61755SAndy Ye TEEC_CloseSession(&TeecSession); 1956f4e1db95SHisping Lin TEEC_FinalizeContext(&TeecContext); 19574aa61755SAndy Ye 19584aa61755SAndy Ye return TeecResult; 19594aa61755SAndy Ye } 19604aa61755SAndy Ye 19614aa61755SAndy Ye uint32_t trusty_attest_uuid(uint8_t *uuid, uint32_t *uuid_size) 19624aa61755SAndy Ye { 19634aa61755SAndy Ye TEEC_Result TeecResult; 19644aa61755SAndy Ye TEEC_Context TeecContext; 19654aa61755SAndy Ye TEEC_Session TeecSession; 19664aa61755SAndy Ye uint32_t ErrorOrigin; 19674aa61755SAndy Ye TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6, 19684aa61755SAndy Ye { 0xa8, 0x69, 0x9c, 0xe6, 19694aa61755SAndy Ye 0x88, 0x6c, 0x5d, 0x5d 19704aa61755SAndy Ye } 19714aa61755SAndy Ye }; 19724aa61755SAndy Ye TEEC_UUID *TeecUuid = &tempuuid; 19734aa61755SAndy Ye TEEC_Operation TeecOperation = {0}; 19743251364cSHisping Lin struct blk_desc *dev_desc; 19753251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 19766651d4c0SJason Zhu if (!dev_desc) { 19776651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 19786651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 19796651d4c0SJason Zhu } 19804aa61755SAndy Ye 1981f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 1982f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1983f4e1db95SHisping Lin return TeecResult; 19844aa61755SAndy Ye 19854aa61755SAndy Ye TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1986f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1987f4e1db95SHisping Lin return TeecResult; 19884aa61755SAndy Ye 19893251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 19903251364cSHisping Lin TEEC_NONE, 19913251364cSHisping Lin TEEC_NONE, 19923251364cSHisping Lin TEEC_NONE); 19933251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 1994b9a7e756SHisping Lin if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0) 1995b9a7e756SHisping Lin TeecOperation.params[0].value.a = 1; 1996b9a7e756SHisping Lin else 1997b9a7e756SHisping Lin TeecOperation.params[0].value.a = 0; 1998b9a7e756SHisping Lin 19993251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 20003251364cSHisping Lin TeecOperation.params[0].value.a = 0; 20013251364cSHisping Lin #endif 20023251364cSHisping Lin 20034aa61755SAndy Ye TeecResult = TEEC_OpenSession(&TeecContext, 20044aa61755SAndy Ye &TeecSession, 20054aa61755SAndy Ye TeecUuid, 20064aa61755SAndy Ye TEEC_LOGIN_PUBLIC, 20074aa61755SAndy Ye NULL, 20083251364cSHisping Lin &TeecOperation, 20094aa61755SAndy Ye &ErrorOrigin); 2010f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 2011f4e1db95SHisping Lin return TeecResult; 20124aa61755SAndy Ye 20134aa61755SAndy Ye TEEC_SharedMemory SharedMem0 = {0}; 20144aa61755SAndy Ye 20154aa61755SAndy Ye SharedMem0.size = *uuid_size; 20164aa61755SAndy Ye SharedMem0.flags = 0; 20174aa61755SAndy Ye 20184aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 2019f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 2020f4e1db95SHisping Lin goto exit; 20214aa61755SAndy Ye 20224aa61755SAndy Ye TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 20234aa61755SAndy Ye TeecOperation.params[0].tmpref.size = SharedMem0.size; 20244aa61755SAndy Ye 20254aa61755SAndy Ye TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, 20264aa61755SAndy Ye TEEC_NONE, 20274aa61755SAndy Ye TEEC_NONE, 20284aa61755SAndy Ye TEEC_NONE); 20294aa61755SAndy Ye 20304aa61755SAndy Ye TeecResult = TEEC_InvokeCommand(&TeecSession, 20314aa61755SAndy Ye 144, 20324aa61755SAndy Ye &TeecOperation, 20334aa61755SAndy Ye &ErrorOrigin); 2034f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 2035f4e1db95SHisping Lin goto exit; 20364aa61755SAndy Ye 20374aa61755SAndy Ye *uuid_size = TeecOperation.params[0].tmpref.size; 20384aa61755SAndy Ye memcpy(uuid, SharedMem0.buffer, SharedMem0.size); 2039f4e1db95SHisping Lin exit: 20404aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem0); 20414aa61755SAndy Ye TEEC_CloseSession(&TeecSession); 2042f4e1db95SHisping Lin TEEC_FinalizeContext(&TeecContext); 20434aa61755SAndy Ye 20444aa61755SAndy Ye return TeecResult; 20454aa61755SAndy Ye } 20464aa61755SAndy Ye 20474aa61755SAndy Ye uint32_t trusty_attest_get_ca(uint8_t *operation_start, 20484aa61755SAndy Ye uint32_t *operation_size, 20494aa61755SAndy Ye uint8_t *out, 20504aa61755SAndy Ye uint32_t *out_len) 20514aa61755SAndy Ye { 20524aa61755SAndy Ye TEEC_Result TeecResult; 20534aa61755SAndy Ye TEEC_Context TeecContext; 20544aa61755SAndy Ye TEEC_Session TeecSession; 20554aa61755SAndy Ye uint32_t ErrorOrigin; 20564aa61755SAndy Ye 20574aa61755SAndy Ye TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6, 20584aa61755SAndy Ye { 0xa8, 0x69, 0x9c, 0xe6, 20594aa61755SAndy Ye 0x88, 0x6c, 0x5d, 0x5d 20604aa61755SAndy Ye } 20614aa61755SAndy Ye }; 20624aa61755SAndy Ye 20634aa61755SAndy Ye TEEC_UUID *TeecUuid = &tempuuid; 20644aa61755SAndy Ye TEEC_Operation TeecOperation = {0}; 20653251364cSHisping Lin struct blk_desc *dev_desc; 20663251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 20676651d4c0SJason Zhu if (!dev_desc) { 20686651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 20696651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 20706651d4c0SJason Zhu } 20714aa61755SAndy Ye 2072f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 2073f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 2074f4e1db95SHisping Lin return TeecResult; 20754aa61755SAndy Ye 20764aa61755SAndy Ye TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 2077f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 2078f4e1db95SHisping Lin return TeecResult; 20794aa61755SAndy Ye 20803251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 20813251364cSHisping Lin TEEC_NONE, 20823251364cSHisping Lin TEEC_NONE, 20833251364cSHisping Lin TEEC_NONE); 20843251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 2085b9a7e756SHisping Lin if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0) 2086b9a7e756SHisping Lin TeecOperation.params[0].value.a = 1; 2087b9a7e756SHisping Lin else 2088b9a7e756SHisping Lin TeecOperation.params[0].value.a = 0; 2089b9a7e756SHisping Lin 20903251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 20913251364cSHisping Lin TeecOperation.params[0].value.a = 0; 20923251364cSHisping Lin #endif 20933251364cSHisping Lin 20944aa61755SAndy Ye TeecResult = TEEC_OpenSession(&TeecContext, 20954aa61755SAndy Ye &TeecSession, 20964aa61755SAndy Ye TeecUuid, 20974aa61755SAndy Ye TEEC_LOGIN_PUBLIC, 20984aa61755SAndy Ye NULL, 20993251364cSHisping Lin &TeecOperation, 21004aa61755SAndy Ye &ErrorOrigin); 2101f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 2102f4e1db95SHisping Lin return TeecResult; 21034aa61755SAndy Ye 21044aa61755SAndy Ye TEEC_SharedMemory SharedMem0 = {0}; 21054aa61755SAndy Ye 21064aa61755SAndy Ye SharedMem0.size = *operation_size; 21074aa61755SAndy Ye SharedMem0.flags = 0; 21084aa61755SAndy Ye 21094aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 2110f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 2111f4e1db95SHisping Lin goto exit; 21124aa61755SAndy Ye 21134aa61755SAndy Ye memcpy(SharedMem0.buffer, operation_start, SharedMem0.size); 21144aa61755SAndy Ye 21154aa61755SAndy Ye TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 21164aa61755SAndy Ye TeecOperation.params[0].tmpref.size = SharedMem0.size; 21174aa61755SAndy Ye 21184aa61755SAndy Ye TEEC_SharedMemory SharedMem1 = {0}; 21194aa61755SAndy Ye 21204aa61755SAndy Ye SharedMem1.size = *out_len; 21214aa61755SAndy Ye SharedMem1.flags = 0; 21224aa61755SAndy Ye 21234aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 2124f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 2125f4e1db95SHisping Lin goto exit; 21264aa61755SAndy Ye 21274aa61755SAndy Ye TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 21284aa61755SAndy Ye TeecOperation.params[1].tmpref.size = SharedMem1.size; 21294aa61755SAndy Ye 21304aa61755SAndy Ye TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, 21314aa61755SAndy Ye TEEC_MEMREF_TEMP_INOUT, 21324aa61755SAndy Ye TEEC_NONE, 21334aa61755SAndy Ye TEEC_NONE); 21344aa61755SAndy Ye 21354aa61755SAndy Ye TeecResult = TEEC_InvokeCommand(&TeecSession, 21364aa61755SAndy Ye 145, 21374aa61755SAndy Ye &TeecOperation, 21384aa61755SAndy Ye &ErrorOrigin); 2139f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 2140f4e1db95SHisping Lin goto exit; 21414aa61755SAndy Ye 21424aa61755SAndy Ye *out_len = TeecOperation.params[1].tmpref.size; 21434aa61755SAndy Ye memcpy(out, SharedMem1.buffer, SharedMem1.size); 2144f4e1db95SHisping Lin exit: 21454aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem0); 21464aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem1); 2147f4e1db95SHisping Lin TEEC_CloseSession(&TeecSession); 2148f4e1db95SHisping Lin TEEC_FinalizeContext(&TeecContext); 21494aa61755SAndy Ye 21504aa61755SAndy Ye return TeecResult; 21514aa61755SAndy Ye } 21524aa61755SAndy Ye 21534aa61755SAndy Ye uint32_t trusty_attest_set_ca(uint8_t *ca_response, uint32_t *ca_response_size) 21544aa61755SAndy Ye { 21554aa61755SAndy Ye TEEC_Result TeecResult; 21564aa61755SAndy Ye TEEC_Context TeecContext; 21574aa61755SAndy Ye TEEC_Session TeecSession; 21584aa61755SAndy Ye uint32_t ErrorOrigin; 21594aa61755SAndy Ye TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6, 21604aa61755SAndy Ye { 0xa8, 0x69, 0x9c, 0xe6, 21614aa61755SAndy Ye 0x88, 0x6c, 0x5d, 0x5d 21624aa61755SAndy Ye } 21634aa61755SAndy Ye }; 21644aa61755SAndy Ye TEEC_UUID *TeecUuid = &tempuuid; 21654aa61755SAndy Ye TEEC_Operation TeecOperation = {0}; 21663251364cSHisping Lin struct blk_desc *dev_desc; 21673251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 21686651d4c0SJason Zhu if (!dev_desc) { 21696651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 21706651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 21716651d4c0SJason Zhu } 2172f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 2173f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 2174f4e1db95SHisping Lin return TeecResult; 21754aa61755SAndy Ye 21764aa61755SAndy Ye TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 2177f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 2178f4e1db95SHisping Lin return TeecResult; 21794aa61755SAndy Ye 21803251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 21813251364cSHisping Lin TEEC_NONE, 21823251364cSHisping Lin TEEC_NONE, 21833251364cSHisping Lin TEEC_NONE); 21843251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 2185b9a7e756SHisping Lin if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0) 2186b9a7e756SHisping Lin TeecOperation.params[0].value.a = 1; 2187b9a7e756SHisping Lin else 2188b9a7e756SHisping Lin TeecOperation.params[0].value.a = 0; 2189b9a7e756SHisping Lin 21903251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 21913251364cSHisping Lin TeecOperation.params[0].value.a = 0; 21923251364cSHisping Lin #endif 21933251364cSHisping Lin 21944aa61755SAndy Ye TeecResult = TEEC_OpenSession(&TeecContext, 21954aa61755SAndy Ye &TeecSession, 21964aa61755SAndy Ye TeecUuid, 21974aa61755SAndy Ye TEEC_LOGIN_PUBLIC, 21984aa61755SAndy Ye NULL, 21993251364cSHisping Lin &TeecOperation, 22004aa61755SAndy Ye &ErrorOrigin); 2201f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 2202f4e1db95SHisping Lin return TeecResult; 22034aa61755SAndy Ye 22044aa61755SAndy Ye TEEC_SharedMemory SharedMem0 = {0}; 22054aa61755SAndy Ye 22064aa61755SAndy Ye SharedMem0.size = *ca_response_size; 22074aa61755SAndy Ye SharedMem0.flags = 0; 22084aa61755SAndy Ye 22094aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 2210f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 2211f4e1db95SHisping Lin goto exit; 22124aa61755SAndy Ye 22134aa61755SAndy Ye memcpy(SharedMem0.buffer, ca_response, SharedMem0.size); 22144aa61755SAndy Ye 22154aa61755SAndy Ye TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 22164aa61755SAndy Ye TeecOperation.params[0].tmpref.size = SharedMem0.size; 22174aa61755SAndy Ye 22184aa61755SAndy Ye TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, 22194aa61755SAndy Ye TEEC_NONE, 22204aa61755SAndy Ye TEEC_NONE, 22214aa61755SAndy Ye TEEC_NONE); 22224aa61755SAndy Ye 22234aa61755SAndy Ye TeecResult = TEEC_InvokeCommand(&TeecSession, 22244aa61755SAndy Ye 146, 22254aa61755SAndy Ye &TeecOperation, 22264aa61755SAndy Ye &ErrorOrigin); 2227f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 2228f4e1db95SHisping Lin goto exit; 2229f4e1db95SHisping Lin exit: 22304aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem0); 22314aa61755SAndy Ye TEEC_CloseSession(&TeecSession); 2232f4e1db95SHisping Lin TEEC_FinalizeContext(&TeecContext); 22334aa61755SAndy Ye 22344aa61755SAndy Ye return TeecResult; 22354aa61755SAndy Ye } 2236*437ac8e2SLin Jinhan 2237*437ac8e2SLin Jinhan uint32_t trusty_fw_key_cipher(enum RK_FW_KEYID key_id, rk_cipher_config *config, 2238*437ac8e2SLin Jinhan uint32_t src_phys_addr, uint32_t dst_phys_addr, 2239*437ac8e2SLin Jinhan uint32_t len) 2240*437ac8e2SLin Jinhan { 2241*437ac8e2SLin Jinhan TEEC_Result TeecResult; 2242*437ac8e2SLin Jinhan TEEC_Context TeecContext; 2243*437ac8e2SLin Jinhan TEEC_Session TeecSession; 2244*437ac8e2SLin Jinhan TEEC_Operation TeecOperation = {0}; 2245*437ac8e2SLin Jinhan uint32_t ErrorOrigin; 2246*437ac8e2SLin Jinhan TEEC_UUID uuid = RK_CRYPTO_SERVICE_UUID; 2247*437ac8e2SLin Jinhan TEEC_SharedMemory SharedMem_config = {0}; 2248*437ac8e2SLin Jinhan 2249*437ac8e2SLin Jinhan if (key_id != RK_FW_KEY0) 2250*437ac8e2SLin Jinhan return TEEC_ERROR_BAD_PARAMETERS; 2251*437ac8e2SLin Jinhan 2252*437ac8e2SLin Jinhan if (!config) 2253*437ac8e2SLin Jinhan return TEEC_ERROR_BAD_PARAMETERS; 2254*437ac8e2SLin Jinhan 2255*437ac8e2SLin Jinhan if (config->algo != RK_ALGO_AES && config->algo != RK_ALGO_SM4) 2256*437ac8e2SLin Jinhan return TEEC_ERROR_BAD_PARAMETERS; 2257*437ac8e2SLin Jinhan 2258*437ac8e2SLin Jinhan if (config->mode >= RK_CIPHER_MODE_XTS) 2259*437ac8e2SLin Jinhan return TEEC_ERROR_BAD_PARAMETERS; 2260*437ac8e2SLin Jinhan 2261*437ac8e2SLin Jinhan if (config->operation != RK_MODE_ENCRYPT && 2262*437ac8e2SLin Jinhan config->operation != RK_MODE_DECRYPT) 2263*437ac8e2SLin Jinhan return TEEC_ERROR_BAD_PARAMETERS; 2264*437ac8e2SLin Jinhan 2265*437ac8e2SLin Jinhan if (config->key_len != 16 && 2266*437ac8e2SLin Jinhan config->key_len != 24 && 2267*437ac8e2SLin Jinhan config->key_len != 32) 2268*437ac8e2SLin Jinhan return TEEC_ERROR_BAD_PARAMETERS; 2269*437ac8e2SLin Jinhan 2270*437ac8e2SLin Jinhan if (len % AES_BLOCK_SIZE || len == 0) 2271*437ac8e2SLin Jinhan return TEEC_ERROR_BAD_PARAMETERS; 2272*437ac8e2SLin Jinhan 2273*437ac8e2SLin Jinhan if (!src_phys_addr || !dst_phys_addr) 2274*437ac8e2SLin Jinhan return TEEC_ERROR_BAD_PARAMETERS; 2275*437ac8e2SLin Jinhan 2276*437ac8e2SLin Jinhan TeecResult = OpteeClientApiLibInitialize(); 2277*437ac8e2SLin Jinhan if (TeecResult != TEEC_SUCCESS) 2278*437ac8e2SLin Jinhan return TeecResult; 2279*437ac8e2SLin Jinhan 2280*437ac8e2SLin Jinhan TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 2281*437ac8e2SLin Jinhan if (TeecResult != TEEC_SUCCESS) 2282*437ac8e2SLin Jinhan return TeecResult; 2283*437ac8e2SLin Jinhan 2284*437ac8e2SLin Jinhan TeecResult = TEEC_OpenSession(&TeecContext, 2285*437ac8e2SLin Jinhan &TeecSession, 2286*437ac8e2SLin Jinhan &uuid, 2287*437ac8e2SLin Jinhan TEEC_LOGIN_PUBLIC, 2288*437ac8e2SLin Jinhan NULL, 2289*437ac8e2SLin Jinhan NULL, 2290*437ac8e2SLin Jinhan &ErrorOrigin); 2291*437ac8e2SLin Jinhan if (TeecResult != TEEC_SUCCESS) 2292*437ac8e2SLin Jinhan goto exit; 2293*437ac8e2SLin Jinhan 2294*437ac8e2SLin Jinhan SharedMem_config.size = sizeof(rk_cipher_config); 2295*437ac8e2SLin Jinhan TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem_config); 2296*437ac8e2SLin Jinhan if (TeecResult != TEEC_SUCCESS) 2297*437ac8e2SLin Jinhan goto exit; 2298*437ac8e2SLin Jinhan 2299*437ac8e2SLin Jinhan memcpy(SharedMem_config.buffer, config, sizeof(rk_cipher_config)); 2300*437ac8e2SLin Jinhan TeecOperation.params[0].value.a = key_id; 2301*437ac8e2SLin Jinhan TeecOperation.params[1].tmpref.buffer = SharedMem_config.buffer; 2302*437ac8e2SLin Jinhan TeecOperation.params[1].tmpref.size = SharedMem_config.size; 2303*437ac8e2SLin Jinhan TeecOperation.params[2].value.a = src_phys_addr; 2304*437ac8e2SLin Jinhan TeecOperation.params[2].value.b = len; 2305*437ac8e2SLin Jinhan TeecOperation.params[3].value.a = dst_phys_addr; 2306*437ac8e2SLin Jinhan TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 2307*437ac8e2SLin Jinhan TEEC_MEMREF_TEMP_INPUT, 2308*437ac8e2SLin Jinhan TEEC_VALUE_INPUT, 2309*437ac8e2SLin Jinhan TEEC_VALUE_INPUT); 2310*437ac8e2SLin Jinhan 2311*437ac8e2SLin Jinhan crypto_flush_cacheline(src_phys_addr, len); 2312*437ac8e2SLin Jinhan crypto_flush_cacheline(dst_phys_addr, len); 2313*437ac8e2SLin Jinhan 2314*437ac8e2SLin Jinhan TeecResult = TEEC_InvokeCommand(&TeecSession, 2315*437ac8e2SLin Jinhan CRYPTO_SERVICE_CMD_FW_KEY_PHYS_CIPHER, 2316*437ac8e2SLin Jinhan &TeecOperation, 2317*437ac8e2SLin Jinhan &ErrorOrigin); 2318*437ac8e2SLin Jinhan 2319*437ac8e2SLin Jinhan crypto_invalidate_cacheline(dst_phys_addr, len); 2320*437ac8e2SLin Jinhan 2321*437ac8e2SLin Jinhan exit: 2322*437ac8e2SLin Jinhan TEEC_ReleaseSharedMemory(&SharedMem_config); 2323*437ac8e2SLin Jinhan TEEC_CloseSession(&TeecSession); 2324*437ac8e2SLin Jinhan TEEC_FinalizeContext(&TeecContext); 2325*437ac8e2SLin Jinhan return TeecResult; 2326*437ac8e2SLin Jinhan } 2327*437ac8e2SLin Jinhan 2328