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 38*ac6d8253SHisping Lin #define STORAGE_CMD_WRITE_ESCK_KEY 27 39*ac6d8253SHisping Lin #define STORAGE_CMD_ESCK_KEY_IS_WRITTEN 28 40*ac6d8253SHisping Lin #define STORAGE_CMD_SET_ESCK_KEY_MASK 29 41ae8ec5e1SHisping Lin 422f8c34bdSxb.wang #define CRYPTO_SERVICE_CMD_OEM_OTP_KEY_PHYS_CIPHER 0x00000002 43fc3694d6Sxb.wang 44fc3694d6Sxb.wang #define RK_CRYPTO_SERVICE_UUID { 0x0cacdb5d, 0x4fea, 0x466c, \ 45fc3694d6Sxb.wang { 0x97, 0x16, 0x3d, 0x54, 0x16, 0x52, 0x83, 0x0f } } 46fc3694d6Sxb.wang 47ae8ec5e1SHisping Lin static uint8_t b2hs_add_base(uint8_t in) 48ae8ec5e1SHisping Lin { 49ae8ec5e1SHisping Lin if (in > 9) 50ae8ec5e1SHisping Lin return in + 55; 51ae8ec5e1SHisping Lin else 52ae8ec5e1SHisping Lin return in + 48; 53ae8ec5e1SHisping Lin } 54ae8ec5e1SHisping Lin 55c7de5349SHisping Lin static uint32_t b2hs(uint8_t *b, uint8_t *hs, uint32_t blen, uint32_t hslen) 56ae8ec5e1SHisping Lin { 57ae8ec5e1SHisping Lin uint32_t i = 0; 58ae8ec5e1SHisping Lin 59ae8ec5e1SHisping Lin if (blen * 2 + 1 > hslen) 60ae8ec5e1SHisping Lin return 0; 61ae8ec5e1SHisping Lin 62ae8ec5e1SHisping Lin for (; i < blen; i++) { 63ae8ec5e1SHisping Lin hs[i * 2 + 1] = b2hs_add_base(b[i] & 0xf); 64ae8ec5e1SHisping Lin hs[i * 2] = b2hs_add_base(b[i] >> 4); 65ae8ec5e1SHisping Lin } 66ae8ec5e1SHisping Lin hs[blen * 2] = 0; 67ae8ec5e1SHisping Lin 68ae8ec5e1SHisping Lin return blen * 2; 69ae8ec5e1SHisping Lin } 70ae8ec5e1SHisping Lin 712f8c34bdSxb.wang static void crypto_flush_cacheline(uint32_t addr, uint32_t size) 722f8c34bdSxb.wang { 732f8c34bdSxb.wang ulong alignment = CONFIG_SYS_CACHELINE_SIZE; 742f8c34bdSxb.wang ulong aligned_input, aligned_len; 752f8c34bdSxb.wang 762f8c34bdSxb.wang if (!addr || !size) 772f8c34bdSxb.wang return; 782f8c34bdSxb.wang 792f8c34bdSxb.wang /* Must flush dcache before crypto DMA fetch data region */ 802f8c34bdSxb.wang aligned_input = round_down(addr, alignment); 812f8c34bdSxb.wang aligned_len = round_up(size + (addr - aligned_input), alignment); 822f8c34bdSxb.wang flush_cache(aligned_input, aligned_len); 832f8c34bdSxb.wang } 842f8c34bdSxb.wang 85a900eef3SHisping Lin static void crypto_invalidate_cacheline(uint32_t addr, uint32_t size) 86a900eef3SHisping Lin { 87a900eef3SHisping Lin ulong alignment = CONFIG_SYS_CACHELINE_SIZE; 88a900eef3SHisping Lin ulong aligned_input, aligned_len; 89a900eef3SHisping Lin 90a900eef3SHisping Lin if (!addr || !size) 91a900eef3SHisping Lin return; 92a900eef3SHisping Lin 93a900eef3SHisping Lin /* Must invalidate dcache after crypto DMA write data region */ 94a900eef3SHisping Lin aligned_input = round_down(addr, alignment); 95a900eef3SHisping Lin aligned_len = round_up(size + (addr - aligned_input), alignment); 96a900eef3SHisping Lin invalidate_dcache_range(aligned_input, aligned_input + aligned_len); 97a900eef3SHisping Lin } 98a900eef3SHisping Lin 99c7de5349SHisping Lin static uint32_t trusty_base_write_security_data(char *filename, 100c7de5349SHisping Lin uint32_t filename_size, 101c7de5349SHisping Lin uint8_t *data, 102c7de5349SHisping Lin uint32_t data_size) 103ae8ec5e1SHisping Lin { 104ae8ec5e1SHisping Lin TEEC_Result TeecResult; 105ae8ec5e1SHisping Lin TEEC_Context TeecContext; 106ae8ec5e1SHisping Lin TEEC_Session TeecSession; 107ae8ec5e1SHisping Lin uint32_t ErrorOrigin; 108ae8ec5e1SHisping Lin TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 109ae8ec5e1SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 110ae8ec5e1SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 111ae8ec5e1SHisping Lin TEEC_Operation TeecOperation = {0}; 1123251364cSHisping Lin struct blk_desc *dev_desc; 1133251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 1146651d4c0SJason Zhu if (!dev_desc) { 1156651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 1166651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 1176651d4c0SJason Zhu } 1183251364cSHisping Lin 119f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 120f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 121f4e1db95SHisping Lin return TeecResult; 122ae8ec5e1SHisping Lin 123ae8ec5e1SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 124f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 125f4e1db95SHisping Lin return TeecResult; 126ae8ec5e1SHisping Lin 1273251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 1283251364cSHisping Lin TEEC_NONE, 1293251364cSHisping Lin TEEC_NONE, 1303251364cSHisping Lin TEEC_NONE); 1313251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 132f3c7fe23SHisping Lin if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)//emmc 133f3c7fe23SHisping Lin TeecOperation.params[0].value.a = 1; 134f3c7fe23SHisping Lin else if (dev_desc->if_type == IF_TYPE_SCSI)//ufs 135b9a7e756SHisping Lin TeecOperation.params[0].value.a = 1; 136b9a7e756SHisping Lin else 137b9a7e756SHisping Lin TeecOperation.params[0].value.a = 0; 138f3c7fe23SHisping Lin 1393251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 1403251364cSHisping Lin TeecOperation.params[0].value.a = 0; 1413251364cSHisping Lin #endif 1423251364cSHisping Lin 143ae8ec5e1SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 144ae8ec5e1SHisping Lin &TeecSession, 145ae8ec5e1SHisping Lin TeecUuid, 146ae8ec5e1SHisping Lin TEEC_LOGIN_PUBLIC, 147ae8ec5e1SHisping Lin NULL, 1483251364cSHisping Lin &TeecOperation, 149ae8ec5e1SHisping Lin &ErrorOrigin); 150f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 151f4e1db95SHisping Lin return TeecResult; 152ae8ec5e1SHisping Lin 153ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 154ae8ec5e1SHisping Lin 155c7de5349SHisping Lin SharedMem0.size = filename_size; 156ae8ec5e1SHisping Lin SharedMem0.flags = 0; 157ae8ec5e1SHisping Lin 158ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 159f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 160f4e1db95SHisping Lin goto exit; 161ae8ec5e1SHisping Lin 162c7de5349SHisping Lin memcpy(SharedMem0.buffer, filename, SharedMem0.size); 163ae8ec5e1SHisping Lin 164ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem1 = {0}; 165ae8ec5e1SHisping Lin 166c7de5349SHisping Lin SharedMem1.size = data_size; 167c7de5349SHisping Lin SharedMem1.flags = 0; 168c7de5349SHisping Lin 169c7de5349SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 170c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 171c7de5349SHisping Lin goto exit; 172c7de5349SHisping Lin 173c7de5349SHisping Lin memcpy(SharedMem1.buffer, data, SharedMem1.size); 174c7de5349SHisping Lin 175c7de5349SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 176c7de5349SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 177c7de5349SHisping Lin 178c7de5349SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 179c7de5349SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem1.size; 180c7de5349SHisping Lin 181c7de5349SHisping Lin 182c7de5349SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 183c7de5349SHisping Lin TEEC_MEMREF_TEMP_INOUT, 184c7de5349SHisping Lin TEEC_NONE, 185c7de5349SHisping Lin TEEC_NONE); 186c7de5349SHisping Lin 187c7de5349SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 188c7de5349SHisping Lin 1, 189c7de5349SHisping Lin &TeecOperation, 190c7de5349SHisping Lin &ErrorOrigin); 191c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 192c7de5349SHisping Lin goto exit; 193c7de5349SHisping Lin exit: 194c7de5349SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 195c7de5349SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem1); 196c7de5349SHisping Lin TEEC_CloseSession(&TeecSession); 197c7de5349SHisping Lin TEEC_FinalizeContext(&TeecContext); 198c7de5349SHisping Lin 199c7de5349SHisping Lin return TeecResult; 200c7de5349SHisping Lin } 201c7de5349SHisping Lin 202c7de5349SHisping Lin static uint32_t trusty_base_read_security_data(char *filename, 203c7de5349SHisping Lin uint32_t filename_size, 204c7de5349SHisping Lin uint8_t *data, 205c7de5349SHisping Lin uint32_t data_size) 206c7de5349SHisping Lin { 207c7de5349SHisping Lin TEEC_Result TeecResult; 208c7de5349SHisping Lin TEEC_Context TeecContext; 209c7de5349SHisping Lin TEEC_Session TeecSession; 210c7de5349SHisping Lin uint32_t ErrorOrigin; 211c7de5349SHisping Lin TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 212c7de5349SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 213c7de5349SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 214c7de5349SHisping Lin TEEC_Operation TeecOperation = {0}; 215c7de5349SHisping Lin 216c7de5349SHisping Lin struct blk_desc *dev_desc; 217c7de5349SHisping Lin dev_desc = rockchip_get_bootdev(); 218c7de5349SHisping Lin if (!dev_desc) { 219c7de5349SHisping Lin printf("%s: dev_desc is NULL!\n", __func__); 220c7de5349SHisping Lin return -TEEC_ERROR_GENERIC; 221c7de5349SHisping Lin } 222c7de5349SHisping Lin 223c7de5349SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 224c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 225c7de5349SHisping Lin return TeecResult; 226c7de5349SHisping Lin 227c7de5349SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 228c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 229c7de5349SHisping Lin return TeecResult; 230c7de5349SHisping Lin 231c7de5349SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 232c7de5349SHisping Lin TEEC_NONE, 233c7de5349SHisping Lin TEEC_NONE, 234c7de5349SHisping Lin TEEC_NONE); 235c7de5349SHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 236f3c7fe23SHisping Lin if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)//emmc 237f3c7fe23SHisping Lin TeecOperation.params[0].value.a = 1; 238f3c7fe23SHisping Lin else if (dev_desc->if_type == IF_TYPE_SCSI)//ufs 239c7de5349SHisping Lin TeecOperation.params[0].value.a = 1; 240c7de5349SHisping Lin else 241c7de5349SHisping Lin TeecOperation.params[0].value.a = 0; 242f3c7fe23SHisping Lin 243c7de5349SHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 244c7de5349SHisping Lin TeecOperation.params[0].value.a = 0; 245c7de5349SHisping Lin #endif 246c7de5349SHisping Lin 247c7de5349SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 248c7de5349SHisping Lin &TeecSession, 249c7de5349SHisping Lin TeecUuid, 250c7de5349SHisping Lin TEEC_LOGIN_PUBLIC, 251c7de5349SHisping Lin NULL, 252c7de5349SHisping Lin &TeecOperation, 253c7de5349SHisping Lin &ErrorOrigin); 254c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 255c7de5349SHisping Lin return TeecResult; 256c7de5349SHisping Lin 257c7de5349SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 258c7de5349SHisping Lin 259c7de5349SHisping Lin SharedMem0.size = filename_size; 260c7de5349SHisping Lin SharedMem0.flags = 0; 261c7de5349SHisping Lin 262c7de5349SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 263c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 264c7de5349SHisping Lin goto exit; 265c7de5349SHisping Lin 266c7de5349SHisping Lin memcpy(SharedMem0.buffer, filename, SharedMem0.size); 267c7de5349SHisping Lin 268c7de5349SHisping Lin TEEC_SharedMemory SharedMem1 = {0}; 269c7de5349SHisping Lin 270c7de5349SHisping Lin SharedMem1.size = data_size; 271ae8ec5e1SHisping Lin SharedMem1.flags = 0; 272ae8ec5e1SHisping Lin 273ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 274f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 275f4e1db95SHisping Lin goto exit; 276ae8ec5e1SHisping Lin 277ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 278ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 279ae8ec5e1SHisping Lin 280ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 281ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem1.size; 282ae8ec5e1SHisping Lin 283ae8ec5e1SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 284ae8ec5e1SHisping Lin TEEC_MEMREF_TEMP_INOUT, 285ae8ec5e1SHisping Lin TEEC_NONE, 286ae8ec5e1SHisping Lin TEEC_NONE); 287ae8ec5e1SHisping Lin 288ae8ec5e1SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 289ae8ec5e1SHisping Lin 0, 290ae8ec5e1SHisping Lin &TeecOperation, 291ae8ec5e1SHisping Lin &ErrorOrigin); 29246b2a054SHisping Lin if (TeecResult == TEEC_SUCCESS) 293c7de5349SHisping Lin memcpy(data, SharedMem1.buffer, SharedMem1.size); 294f4e1db95SHisping Lin exit: 295ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 296ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem1); 297ae8ec5e1SHisping Lin TEEC_CloseSession(&TeecSession); 29846b2a054SHisping Lin TEEC_FinalizeContext(&TeecContext); 299ae8ec5e1SHisping Lin 300ae8ec5e1SHisping Lin return TeecResult; 301ae8ec5e1SHisping Lin } 302ae8ec5e1SHisping Lin 303c7de5349SHisping Lin static uint32_t trusty_base_end_security_data(void) 304c7de5349SHisping Lin { 305c7de5349SHisping Lin TEEC_Result TeecResult; 306c7de5349SHisping Lin TEEC_Context TeecContext; 307c7de5349SHisping Lin TEEC_Session TeecSession; 308c7de5349SHisping Lin uint32_t ErrorOrigin; 309c7de5349SHisping Lin TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 310c7de5349SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 311c7de5349SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 312c7de5349SHisping Lin TEEC_Operation TeecOperation = {0}; 313c7de5349SHisping Lin 314c7de5349SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 315c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 316c7de5349SHisping Lin return TeecResult; 317c7de5349SHisping Lin 318c7de5349SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 319c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 320c7de5349SHisping Lin return TeecResult; 321c7de5349SHisping Lin 322c7de5349SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 323c7de5349SHisping Lin &TeecSession, 324c7de5349SHisping Lin TeecUuid, 325c7de5349SHisping Lin TEEC_LOGIN_PUBLIC, 326c7de5349SHisping Lin NULL, 327c7de5349SHisping Lin NULL, 328c7de5349SHisping Lin &ErrorOrigin); 329c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 330c7de5349SHisping Lin return TeecResult; 331c7de5349SHisping Lin 332c7de5349SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE, 333c7de5349SHisping Lin TEEC_NONE, 334c7de5349SHisping Lin TEEC_NONE, 335c7de5349SHisping Lin TEEC_NONE); 336c7de5349SHisping Lin 337c7de5349SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 338c7de5349SHisping Lin 2, 339c7de5349SHisping Lin &TeecOperation, 340c7de5349SHisping Lin &ErrorOrigin); 341c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 342c7de5349SHisping Lin goto exit; 343c7de5349SHisping Lin exit: 344c7de5349SHisping Lin TEEC_CloseSession(&TeecSession); 345c7de5349SHisping Lin TEEC_FinalizeContext(&TeecContext); 346c7de5349SHisping Lin 347c7de5349SHisping Lin return TeecResult; 348c7de5349SHisping Lin } 349c7de5349SHisping Lin 35034f2e8f6SHisping Lin static void trusty_notify_always_use_security(void) 35134f2e8f6SHisping Lin { 35234f2e8f6SHisping Lin #if defined(CONFIG_OPTEE_V2) && defined(CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION) 35334f2e8f6SHisping Lin TEEC_Result TeecResult; 35434f2e8f6SHisping Lin TEEC_Context TeecContext; 35534f2e8f6SHisping Lin TEEC_Session TeecSession; 35634f2e8f6SHisping Lin uint32_t ErrorOrigin; 35734f2e8f6SHisping Lin TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 35834f2e8f6SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 35934f2e8f6SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 36034f2e8f6SHisping Lin TEEC_Operation TeecOperation = {0}; 36134f2e8f6SHisping Lin 36234f2e8f6SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 36334f2e8f6SHisping Lin if (TeecResult != TEEC_SUCCESS) 36434f2e8f6SHisping Lin return; 36534f2e8f6SHisping Lin 36634f2e8f6SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 36734f2e8f6SHisping Lin if (TeecResult != TEEC_SUCCESS) 36834f2e8f6SHisping Lin return; 36934f2e8f6SHisping Lin 37034f2e8f6SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 37134f2e8f6SHisping Lin &TeecSession, 37234f2e8f6SHisping Lin TeecUuid, 37334f2e8f6SHisping Lin TEEC_LOGIN_PUBLIC, 37434f2e8f6SHisping Lin NULL, 37534f2e8f6SHisping Lin NULL, 37634f2e8f6SHisping Lin &ErrorOrigin); 37734f2e8f6SHisping Lin if (TeecResult != TEEC_SUCCESS) 37834f2e8f6SHisping Lin return; 37934f2e8f6SHisping Lin 38034f2e8f6SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE, 38134f2e8f6SHisping Lin TEEC_NONE, 38234f2e8f6SHisping Lin TEEC_NONE, 38334f2e8f6SHisping Lin TEEC_NONE); 38434f2e8f6SHisping Lin 38534f2e8f6SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 38634f2e8f6SHisping Lin 9, 38734f2e8f6SHisping Lin &TeecOperation, 38834f2e8f6SHisping Lin &ErrorOrigin); 38934f2e8f6SHisping Lin if (TeecResult != TEEC_SUCCESS) 39034f2e8f6SHisping Lin debug("notify always use security fail! please update optee!"); 39134f2e8f6SHisping Lin 39234f2e8f6SHisping Lin TEEC_CloseSession(&TeecSession); 39334f2e8f6SHisping Lin TEEC_FinalizeContext(&TeecContext); 39434f2e8f6SHisping Lin 39534f2e8f6SHisping Lin return; 39634f2e8f6SHisping Lin #endif 39734f2e8f6SHisping Lin } 39834f2e8f6SHisping Lin 399c7de5349SHisping Lin uint32_t trusty_read_rollback_index(uint32_t slot, uint64_t *value) 400c7de5349SHisping Lin { 401c7de5349SHisping Lin char hs[9]; 402c7de5349SHisping Lin 403c7de5349SHisping Lin b2hs((uint8_t *)&slot, (uint8_t *)hs, 4, 9); 404c7de5349SHisping Lin 405c7de5349SHisping Lin return trusty_base_read_security_data(hs, 8, (uint8_t *)value, 8); 406c7de5349SHisping Lin } 407c7de5349SHisping Lin 408ae8ec5e1SHisping Lin uint32_t trusty_write_rollback_index(uint32_t slot, uint64_t value) 409ae8ec5e1SHisping Lin { 410c7de5349SHisping Lin char hs[9]; 4113251364cSHisping Lin 412c7de5349SHisping Lin b2hs((uint8_t *)&slot, (uint8_t *)hs, 4, 9); 413ae8ec5e1SHisping Lin 414c7de5349SHisping Lin return trusty_base_write_security_data(hs, 8, (uint8_t *)&value, 8); 415ae8ec5e1SHisping Lin } 416ae8ec5e1SHisping Lin 417ae8ec5e1SHisping Lin uint32_t trusty_read_permanent_attributes(uint8_t *attributes, uint32_t size) 418ae8ec5e1SHisping Lin { 419c7de5349SHisping Lin return trusty_base_read_security_data("attributes", 420c7de5349SHisping Lin sizeof("attributes"), attributes, size); 421ae8ec5e1SHisping Lin } 422ae8ec5e1SHisping Lin 423ae8ec5e1SHisping Lin uint32_t trusty_write_permanent_attributes(uint8_t *attributes, uint32_t size) 424ae8ec5e1SHisping Lin { 425c7de5349SHisping Lin return trusty_base_write_security_data("attributes", 426c7de5349SHisping Lin sizeof("attributes"), attributes, size); 4276651d4c0SJason Zhu } 428ae8ec5e1SHisping Lin 429c7de5349SHisping Lin uint32_t trusty_read_permanent_attributes_flag(uint8_t *attributes) 430c7de5349SHisping Lin { 431c7de5349SHisping Lin return trusty_base_read_security_data("attributes_flag", 432c7de5349SHisping Lin sizeof("attributes_flag"), attributes, 1); 433c7de5349SHisping Lin } 434ae8ec5e1SHisping Lin 435c7de5349SHisping Lin uint32_t trusty_write_permanent_attributes_flag(uint8_t attributes) 436c7de5349SHisping Lin { 437c7de5349SHisping Lin return trusty_base_write_security_data("attributes_flag", 438c7de5349SHisping Lin sizeof("attributes_flag"), &attributes, 1); 439ae8ec5e1SHisping Lin } 440ae8ec5e1SHisping Lin 441564654ebSJason Zhu uint32_t trusty_read_permanent_attributes_cer(uint8_t *attributes, 442564654ebSJason Zhu uint32_t size) 443564654ebSJason Zhu { 444c7de5349SHisping Lin return trusty_base_read_security_data("rsacer", 445c7de5349SHisping Lin sizeof("rsacer"), attributes, size); 446564654ebSJason Zhu } 447564654ebSJason Zhu 448564654ebSJason Zhu uint32_t trusty_write_permanent_attributes_cer(uint8_t *attributes, 449564654ebSJason Zhu uint32_t size) 450564654ebSJason Zhu { 451c7de5349SHisping Lin return trusty_base_write_security_data("rsacer", 452c7de5349SHisping Lin sizeof("rsacer"), attributes, size); 453564654ebSJason Zhu } 454564654ebSJason Zhu 455ae8ec5e1SHisping Lin uint32_t trusty_read_lock_state(uint8_t *lock_state) 456ae8ec5e1SHisping Lin { 457c7de5349SHisping Lin return trusty_base_read_security_data("lock_state", 458c7de5349SHisping Lin sizeof("lock_state"), lock_state, 1); 459ae8ec5e1SHisping Lin } 460ae8ec5e1SHisping Lin 461ae8ec5e1SHisping Lin uint32_t trusty_write_lock_state(uint8_t lock_state) 462ae8ec5e1SHisping Lin { 463c7de5349SHisping Lin return trusty_base_write_security_data("lock_state", 464c7de5349SHisping Lin sizeof("lock_state"), &lock_state, 1); 465ae8ec5e1SHisping Lin } 466ae8ec5e1SHisping Lin 467ae8ec5e1SHisping Lin uint32_t trusty_read_flash_lock_state(uint8_t *flash_lock_state) 468ae8ec5e1SHisping Lin { 469c7de5349SHisping Lin return trusty_base_read_security_data("flash_lock_state", 470c7de5349SHisping Lin sizeof("flash_lock_state"), flash_lock_state, 1); 471c7de5349SHisping Lin } 472c7de5349SHisping Lin 473c7de5349SHisping Lin uint32_t trusty_write_flash_lock_state(uint8_t flash_lock_state) 474c7de5349SHisping Lin { 475c7de5349SHisping Lin return trusty_base_write_security_data("flash_lock_state", 476c7de5349SHisping Lin sizeof("flash_lock_state"), &flash_lock_state, 1); 477c7de5349SHisping Lin } 478c7de5349SHisping Lin 479c7de5349SHisping Lin static uint32_t trusty_base_end_efuse_or_otp(void) 480c7de5349SHisping Lin { 481ae8ec5e1SHisping Lin TEEC_Result TeecResult; 482ae8ec5e1SHisping Lin TEEC_Context TeecContext; 483ae8ec5e1SHisping Lin TEEC_Session TeecSession; 484ae8ec5e1SHisping Lin uint32_t ErrorOrigin; 485c7de5349SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 486c7de5349SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 487c7de5349SHisping Lin 488ae8ec5e1SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 489ae8ec5e1SHisping Lin TEEC_Operation TeecOperation = {0}; 490ae8ec5e1SHisping Lin 491f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 492f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 493f4e1db95SHisping Lin return TeecResult; 494ae8ec5e1SHisping Lin 495ae8ec5e1SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 496f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 497f4e1db95SHisping Lin return TeecResult; 498ae8ec5e1SHisping Lin 499ae8ec5e1SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 500ae8ec5e1SHisping Lin &TeecSession, 501ae8ec5e1SHisping Lin TeecUuid, 502ae8ec5e1SHisping Lin TEEC_LOGIN_PUBLIC, 503ae8ec5e1SHisping Lin NULL, 504c7de5349SHisping Lin NULL, 505ae8ec5e1SHisping Lin &ErrorOrigin); 506f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 507f4e1db95SHisping Lin return TeecResult; 508ae8ec5e1SHisping Lin 509c7de5349SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE, 510c7de5349SHisping Lin TEEC_NONE, 511ae8ec5e1SHisping Lin TEEC_NONE, 512ae8ec5e1SHisping Lin TEEC_NONE); 513ae8ec5e1SHisping Lin 514ae8ec5e1SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 515c7de5349SHisping Lin STORAGE_CMD_UBOOT_END_OTP, 516ae8ec5e1SHisping Lin &TeecOperation, 517ae8ec5e1SHisping Lin &ErrorOrigin); 518c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 519c7de5349SHisping Lin goto exit; 520f4e1db95SHisping Lin exit: 521ae8ec5e1SHisping Lin TEEC_CloseSession(&TeecSession); 52246b2a054SHisping Lin TEEC_FinalizeContext(&TeecContext); 523ae8ec5e1SHisping Lin 524ae8ec5e1SHisping Lin return TeecResult; 525ae8ec5e1SHisping Lin } 526ae8ec5e1SHisping Lin 527c7de5349SHisping Lin static uint32_t trusty_base_efuse_or_otp_operation(uint32_t cmd, 528c7de5349SHisping Lin uint8_t is_write, 529c7de5349SHisping Lin uint32_t *buf, 530c7de5349SHisping Lin uint32_t length) 531ae8ec5e1SHisping Lin { 532ae8ec5e1SHisping Lin TEEC_Result TeecResult; 533ae8ec5e1SHisping Lin TEEC_Context TeecContext; 534ae8ec5e1SHisping Lin TEEC_Session TeecSession; 535ae8ec5e1SHisping Lin uint32_t ErrorOrigin; 536c7de5349SHisping Lin 537c7de5349SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 538c7de5349SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 539ae8ec5e1SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 540ae8ec5e1SHisping Lin TEEC_Operation TeecOperation = {0}; 541ae8ec5e1SHisping Lin 542f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 543f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 544f4e1db95SHisping Lin return TeecResult; 545ae8ec5e1SHisping Lin 546ae8ec5e1SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 547f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 548f4e1db95SHisping Lin return TeecResult; 549ae8ec5e1SHisping Lin 550ae8ec5e1SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 551ae8ec5e1SHisping Lin &TeecSession, 552ae8ec5e1SHisping Lin TeecUuid, 553ae8ec5e1SHisping Lin TEEC_LOGIN_PUBLIC, 554ae8ec5e1SHisping Lin NULL, 555c7de5349SHisping Lin NULL, 556ae8ec5e1SHisping Lin &ErrorOrigin); 557f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 558f4e1db95SHisping Lin return TeecResult; 559ae8ec5e1SHisping Lin 560ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 561ae8ec5e1SHisping Lin 562c7de5349SHisping Lin SharedMem0.size = length * sizeof(uint32_t); 563ae8ec5e1SHisping Lin SharedMem0.flags = 0; 564ae8ec5e1SHisping Lin 565ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 566f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 567f4e1db95SHisping Lin goto exit; 568ae8ec5e1SHisping Lin 569ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 570ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 571ae8ec5e1SHisping Lin 572c7de5349SHisping Lin if (is_write) { 573c7de5349SHisping Lin memcpy(SharedMem0.buffer, buf, SharedMem0.size); 574ae8ec5e1SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 575c7de5349SHisping Lin TEEC_NONE, 576ae8ec5e1SHisping Lin TEEC_NONE, 577ae8ec5e1SHisping Lin TEEC_NONE); 578ae8ec5e1SHisping Lin 579c7de5349SHisping Lin } else { 580c7de5349SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT, 581c7de5349SHisping Lin TEEC_NONE, 582c7de5349SHisping Lin TEEC_NONE, 583c7de5349SHisping Lin TEEC_NONE); 584c7de5349SHisping Lin } 585c7de5349SHisping Lin 586ae8ec5e1SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 587c7de5349SHisping Lin cmd, 588ae8ec5e1SHisping Lin &TeecOperation, 589ae8ec5e1SHisping Lin &ErrorOrigin); 590f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 591f4e1db95SHisping Lin goto exit; 592c7de5349SHisping Lin 593c7de5349SHisping Lin if (!is_write) 594c7de5349SHisping Lin memcpy(buf, SharedMem0.buffer, SharedMem0.size); 595c7de5349SHisping Lin 596f4e1db95SHisping Lin exit: 597ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 598ae8ec5e1SHisping Lin TEEC_CloseSession(&TeecSession); 59946b2a054SHisping Lin TEEC_FinalizeContext(&TeecContext); 600ae8ec5e1SHisping Lin 601ae8ec5e1SHisping Lin return TeecResult; 602ae8ec5e1SHisping Lin } 603ae8ec5e1SHisping Lin 6046ef445a4SHisping Lin uint32_t trusty_read_attribute_hash(uint32_t *buf, uint32_t length) 6056ef445a4SHisping Lin { 606c7de5349SHisping Lin return trusty_base_efuse_or_otp_operation(STORAGE_CMD_READ_ATTRIBUTE_HASH, 607c7de5349SHisping Lin false, buf, length); 6086ef445a4SHisping Lin } 6096ef445a4SHisping Lin 6106ef445a4SHisping Lin uint32_t trusty_write_attribute_hash(uint32_t *buf, uint32_t length) 6116ef445a4SHisping Lin { 612c7de5349SHisping Lin return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_ATTRIBUTE_HASH, 613c7de5349SHisping Lin true, buf, length); 61416539616SHisping Lin } 61516539616SHisping Lin 61616539616SHisping Lin uint32_t trusty_notify_optee_uboot_end(void) 61716539616SHisping Lin { 61816539616SHisping Lin TEEC_Result res; 619c7de5349SHisping Lin 620c7de5349SHisping Lin res = trusty_base_end_security_data(); 621c7de5349SHisping Lin res |= trusty_base_end_efuse_or_otp(); 62216539616SHisping Lin return res; 62316539616SHisping Lin } 6242cd27853SHisping Lin 6252cd27853SHisping Lin uint32_t trusty_read_vbootkey_hash(uint32_t *buf, uint32_t length) 6262cd27853SHisping Lin { 627c7de5349SHisping Lin return trusty_base_efuse_or_otp_operation(STORAGE_CMD_READ_VBOOTKEY_HASH, 628c7de5349SHisping Lin false, buf, length); 6292cd27853SHisping Lin } 630c7de5349SHisping Lin 6312cd27853SHisping Lin uint32_t trusty_write_vbootkey_hash(uint32_t *buf, uint32_t length) 6322cd27853SHisping Lin { 633c7de5349SHisping Lin return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_VBOOTKEY_HASH, 634c7de5349SHisping Lin true, buf, length); 6352cd27853SHisping Lin } 636095e2a82SHisping Lin 637468df3b2SHisping Lin uint32_t trusty_read_vbootkey_enable_flag(uint8_t *flag) 638468df3b2SHisping Lin { 639468df3b2SHisping Lin uint32_t bootflag; 640c7de5349SHisping Lin TEEC_Result TeecResult; 641468df3b2SHisping Lin 642f07e1686SHisping Lin *flag = 0; 643f07e1686SHisping Lin 644c7de5349SHisping Lin TeecResult = trusty_base_efuse_or_otp_operation(STORAGE_CMD_READ_ENABLE_FLAG, 645c7de5349SHisping Lin false, &bootflag, 1); 646468df3b2SHisping Lin 647468df3b2SHisping Lin if (TeecResult == TEEC_SUCCESS) { 6480202ee8aSHisping Lin #if defined(CONFIG_ROCKCHIP_RK3288) 6490202ee8aSHisping Lin if (bootflag == 0x00000001) 6500202ee8aSHisping Lin *flag = 1; 6510202ee8aSHisping Lin #else 652468df3b2SHisping Lin if (bootflag == 0x000000FF) 653468df3b2SHisping Lin *flag = 1; 6540202ee8aSHisping Lin #endif 655468df3b2SHisping Lin } 656095e2a82SHisping Lin return TeecResult; 657095e2a82SHisping Lin } 6584aa61755SAndy Ye 6591ef63c75SHisping Lin uint32_t trusty_write_ta_encryption_key(uint32_t *buf, uint32_t length) 6601ef63c75SHisping Lin { 6611ef63c75SHisping Lin return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_TA_ENCRYPTION_KEY, 6621ef63c75SHisping Lin true, buf, length); 6631ef63c75SHisping Lin } 6641ef63c75SHisping Lin 66510f41197SHisping Lin uint32_t trusty_ta_encryption_key_is_written(uint8_t *value) 66610f41197SHisping Lin { 66710f41197SHisping Lin TEEC_Result TeecResult; 66810f41197SHisping Lin TEEC_Context TeecContext; 66910f41197SHisping Lin TEEC_Session TeecSession; 67010f41197SHisping Lin uint32_t ErrorOrigin; 67110f41197SHisping Lin 67210f41197SHisping Lin *value = 0; 67310f41197SHisping Lin 67410f41197SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 67510f41197SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 67610f41197SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 67710f41197SHisping Lin TEEC_Operation TeecOperation = {0}; 67810f41197SHisping Lin 67910f41197SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 68010f41197SHisping Lin if (TeecResult != TEEC_SUCCESS) 68110f41197SHisping Lin return TeecResult; 68210f41197SHisping Lin 68310f41197SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 68410f41197SHisping Lin if (TeecResult != TEEC_SUCCESS) 68510f41197SHisping Lin return TeecResult; 68610f41197SHisping Lin 68710f41197SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 68810f41197SHisping Lin &TeecSession, 68910f41197SHisping Lin TeecUuid, 69010f41197SHisping Lin TEEC_LOGIN_PUBLIC, 69110f41197SHisping Lin NULL, 69210f41197SHisping Lin NULL, 69310f41197SHisping Lin &ErrorOrigin); 69410f41197SHisping Lin if (TeecResult != TEEC_SUCCESS) 69510f41197SHisping Lin return TeecResult; 69610f41197SHisping Lin 69710f41197SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_OUTPUT, 69810f41197SHisping Lin TEEC_NONE, 69910f41197SHisping Lin TEEC_NONE, 70010f41197SHisping Lin TEEC_NONE); 70110f41197SHisping Lin 70210f41197SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 70310f41197SHisping Lin STORAGE_CMD_TA_ENCRYPTION_KEY_IS_WRITTEN, 70410f41197SHisping Lin &TeecOperation, 70510f41197SHisping Lin &ErrorOrigin); 70610f41197SHisping Lin if (TeecResult == TEEC_SUCCESS) 70710f41197SHisping Lin *value = TeecOperation.params[0].value.a; 70810f41197SHisping Lin 70910f41197SHisping Lin TEEC_CloseSession(&TeecSession); 71010f41197SHisping Lin TEEC_FinalizeContext(&TeecContext); 71110f41197SHisping Lin 71210f41197SHisping Lin return TeecResult; 71310f41197SHisping Lin } 71410f41197SHisping Lin 7151ac64e8aSHisping Lin uint32_t trusty_write_oem_encrypt_data(uint32_t *buf, uint32_t length) 7161ac64e8aSHisping Lin { 7171ac64e8aSHisping Lin return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_OEM_ENCRYPT_DATA, 7181ac64e8aSHisping Lin true, buf, length); 7191ac64e8aSHisping Lin } 7201ac64e8aSHisping Lin 721fc383442SHisping Lin uint32_t trusty_oem_encrypt_data_is_written(uint8_t *value) 722fc383442SHisping Lin { 723fc383442SHisping Lin TEEC_Result TeecResult; 724fc383442SHisping Lin TEEC_Context TeecContext; 725fc383442SHisping Lin TEEC_Session TeecSession; 726fc383442SHisping Lin uint32_t ErrorOrigin; 727fc383442SHisping Lin 728fc383442SHisping Lin *value = 0; 729fc383442SHisping Lin 730fc383442SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 731fc383442SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 732fc383442SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 733fc383442SHisping Lin TEEC_Operation TeecOperation = {0}; 734fc383442SHisping Lin 735fc383442SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 736fc383442SHisping Lin if (TeecResult != TEEC_SUCCESS) 737fc383442SHisping Lin return TeecResult; 738fc383442SHisping Lin 739fc383442SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 740fc383442SHisping Lin if (TeecResult != TEEC_SUCCESS) 741fc383442SHisping Lin return TeecResult; 742fc383442SHisping Lin 743fc383442SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 744fc383442SHisping Lin &TeecSession, 745fc383442SHisping Lin TeecUuid, 746fc383442SHisping Lin TEEC_LOGIN_PUBLIC, 747fc383442SHisping Lin NULL, 748fc383442SHisping Lin NULL, 749fc383442SHisping Lin &ErrorOrigin); 750fc383442SHisping Lin if (TeecResult != TEEC_SUCCESS) 751fc383442SHisping Lin return TeecResult; 752fc383442SHisping Lin 753fc383442SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_OUTPUT, 754fc383442SHisping Lin TEEC_NONE, 755fc383442SHisping Lin TEEC_NONE, 756fc383442SHisping Lin TEEC_NONE); 757fc383442SHisping Lin 758fc383442SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 759fc383442SHisping Lin STORAGE_CMD_OEM_ENCRYPT_DATA_IS_WRITTEN, 760fc383442SHisping Lin &TeecOperation, 761fc383442SHisping Lin &ErrorOrigin); 762fc383442SHisping Lin if (TeecResult == TEEC_SUCCESS) 763fc383442SHisping Lin *value = TeecOperation.params[0].value.a; 764fc383442SHisping Lin 765fc383442SHisping Lin TEEC_CloseSession(&TeecSession); 766fc383442SHisping Lin TEEC_FinalizeContext(&TeecContext); 767fc383442SHisping Lin 768fc383442SHisping Lin return TeecResult; 769fc383442SHisping Lin } 770fc383442SHisping Lin 771fbf29bfbSHisping Lin uint32_t trusty_check_security_level_flag(uint8_t flag) 772fbf29bfbSHisping Lin { 773fbf29bfbSHisping Lin uint32_t levelflag; 774fbf29bfbSHisping Lin 775fbf29bfbSHisping Lin levelflag = flag; 776fbf29bfbSHisping Lin return trusty_base_efuse_or_otp_operation(STORAGE_CMD_CHECK_SECURITY_LEVEL_FLAG, 777fbf29bfbSHisping Lin true, &levelflag, 1); 778fbf29bfbSHisping Lin } 779fbf29bfbSHisping Lin 780f39d4289SHisping Lin uint32_t trusty_write_oem_huk(uint32_t *buf, uint32_t length) 781f39d4289SHisping Lin { 782f39d4289SHisping Lin return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_OEM_HUK, 783f39d4289SHisping Lin true, buf, length); 784f39d4289SHisping Lin } 785f39d4289SHisping Lin 78634f2e8f6SHisping Lin static void trusty_select_security_level(void) 7877504da74SHisping Lin { 788b2858095SHisping Lin #ifdef CONFIG_OPTEE_SECURITY_LEVEL 7897504da74SHisping Lin TEEC_Result TeecResult; 7907504da74SHisping Lin 7917504da74SHisping Lin TeecResult = trusty_check_security_level_flag(CONFIG_OPTEE_SECURITY_LEVEL); 7927504da74SHisping Lin if (TeecResult == TEE_ERROR_CANCEL) { 7937504da74SHisping Lin run_command("download", 0); 7947504da74SHisping Lin return; 7957504da74SHisping Lin } 7967504da74SHisping Lin 7977504da74SHisping Lin if (TeecResult == TEEC_SUCCESS) 7987504da74SHisping Lin debug("optee select security level success!"); 799b2858095SHisping Lin else if (TeecResult == TEEC_ERROR_NOT_SUPPORTED) 800b2858095SHisping Lin debug("optee not support security level!"); 8017504da74SHisping Lin else 8027504da74SHisping Lin panic("optee select security level fail!"); 8037504da74SHisping Lin 8047504da74SHisping Lin return; 8057504da74SHisping Lin #endif 8067504da74SHisping Lin } 8077504da74SHisping Lin 80851ac7005SHisping Lin void optee_client_init(void) 80951ac7005SHisping Lin { 81051ac7005SHisping Lin trusty_select_security_level(); 81134f2e8f6SHisping Lin trusty_notify_always_use_security(); 81251ac7005SHisping Lin } 81351ac7005SHisping Lin 814d5913350SHisping Lin uint32_t trusty_write_oem_ns_otp(uint32_t byte_off, uint8_t *byte_buf, uint32_t byte_len) 815d5913350SHisping Lin { 816d5913350SHisping Lin TEEC_Result TeecResult; 817d5913350SHisping Lin TEEC_Context TeecContext; 818d5913350SHisping Lin TEEC_Session TeecSession; 819d5913350SHisping Lin uint32_t ErrorOrigin; 820d5913350SHisping Lin 821d5913350SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 822d5913350SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 823d5913350SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 824d5913350SHisping Lin TEEC_Operation TeecOperation = {0}; 825d5913350SHisping Lin 826d5913350SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 827d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 828d5913350SHisping Lin return TeecResult; 829d5913350SHisping Lin 830d5913350SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 831d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 832d5913350SHisping Lin return TeecResult; 833d5913350SHisping Lin 834d5913350SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 835d5913350SHisping Lin &TeecSession, 836d5913350SHisping Lin TeecUuid, 837d5913350SHisping Lin TEEC_LOGIN_PUBLIC, 838d5913350SHisping Lin NULL, 839d5913350SHisping Lin NULL, 840d5913350SHisping Lin &ErrorOrigin); 841d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 842d5913350SHisping Lin return TeecResult; 843d5913350SHisping Lin 844d5913350SHisping Lin TeecOperation.params[0].value.a = byte_off; 845d5913350SHisping Lin 846d5913350SHisping Lin TEEC_SharedMemory SharedMem = {0}; 847d5913350SHisping Lin 848d5913350SHisping Lin SharedMem.size = byte_len; 849d5913350SHisping Lin SharedMem.flags = 0; 850d5913350SHisping Lin 851d5913350SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem); 852d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 853d5913350SHisping Lin goto exit; 854d5913350SHisping Lin 855d5913350SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem.buffer; 856d5913350SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem.size; 857d5913350SHisping Lin 858d5913350SHisping Lin memcpy(SharedMem.buffer, byte_buf, SharedMem.size); 859d5913350SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 860d5913350SHisping Lin TEEC_MEMREF_TEMP_INPUT, 861d5913350SHisping Lin TEEC_NONE, 862d5913350SHisping Lin TEEC_NONE); 863d5913350SHisping Lin 864d5913350SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 865d5913350SHisping Lin STORAGE_CMD_WRITE_OEM_NS_OTP, 866d5913350SHisping Lin &TeecOperation, 867d5913350SHisping Lin &ErrorOrigin); 868d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 869d5913350SHisping Lin goto exit; 870d5913350SHisping Lin 871d5913350SHisping Lin exit: 872d5913350SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem); 873d5913350SHisping Lin TEEC_CloseSession(&TeecSession); 874d5913350SHisping Lin TEEC_FinalizeContext(&TeecContext); 875d5913350SHisping Lin 876d5913350SHisping Lin return TeecResult; 877d5913350SHisping Lin } 878d5913350SHisping Lin 879d5913350SHisping Lin uint32_t trusty_read_oem_ns_otp(uint32_t byte_off, uint8_t *byte_buf, uint32_t byte_len) 880d5913350SHisping Lin { 881d5913350SHisping Lin TEEC_Result TeecResult; 882d5913350SHisping Lin TEEC_Context TeecContext; 883d5913350SHisping Lin TEEC_Session TeecSession; 884d5913350SHisping Lin uint32_t ErrorOrigin; 885d5913350SHisping Lin 886d5913350SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 887d5913350SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 888d5913350SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 889d5913350SHisping Lin TEEC_Operation TeecOperation = {0}; 890d5913350SHisping Lin 891d5913350SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 892d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 893d5913350SHisping Lin return TeecResult; 894d5913350SHisping Lin 895d5913350SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 896d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 897d5913350SHisping Lin return TeecResult; 898d5913350SHisping Lin 899d5913350SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 900d5913350SHisping Lin &TeecSession, 901d5913350SHisping Lin TeecUuid, 902d5913350SHisping Lin TEEC_LOGIN_PUBLIC, 903d5913350SHisping Lin NULL, 904d5913350SHisping Lin NULL, 905d5913350SHisping Lin &ErrorOrigin); 906d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 907d5913350SHisping Lin return TeecResult; 908d5913350SHisping Lin 909d5913350SHisping Lin TeecOperation.params[0].value.a = byte_off; 910d5913350SHisping Lin 911d5913350SHisping Lin TEEC_SharedMemory SharedMem = {0}; 912d5913350SHisping Lin 913d5913350SHisping Lin SharedMem.size = byte_len; 914d5913350SHisping Lin SharedMem.flags = 0; 915d5913350SHisping Lin 916d5913350SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem); 917d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 918d5913350SHisping Lin goto exit; 919d5913350SHisping Lin 920d5913350SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem.buffer; 921d5913350SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem.size; 922d5913350SHisping Lin 923d5913350SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 924d5913350SHisping Lin TEEC_MEMREF_TEMP_OUTPUT, 925d5913350SHisping Lin TEEC_NONE, 926d5913350SHisping Lin TEEC_NONE); 927d5913350SHisping Lin 928d5913350SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 929d5913350SHisping Lin STORAGE_CMD_READ_OEM_NS_OTP, 930d5913350SHisping Lin &TeecOperation, 931d5913350SHisping Lin &ErrorOrigin); 932d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 933d5913350SHisping Lin goto exit; 934d5913350SHisping Lin 935d5913350SHisping Lin memcpy(byte_buf, SharedMem.buffer, SharedMem.size); 936d5913350SHisping Lin 937d5913350SHisping Lin exit: 938d5913350SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem); 939d5913350SHisping Lin TEEC_CloseSession(&TeecSession); 940d5913350SHisping Lin TEEC_FinalizeContext(&TeecContext); 941d5913350SHisping Lin 942d5913350SHisping Lin return TeecResult; 943d5913350SHisping Lin } 944d5913350SHisping Lin 94590e849a0Sxb.wang uint32_t trusty_write_oem_otp_key(enum RK_OEM_OTP_KEYID key_id, 946bb1ba6acSHisping Lin uint8_t *byte_buf, uint32_t byte_len) 947bb1ba6acSHisping Lin { 948bb1ba6acSHisping Lin TEEC_Result TeecResult; 949bb1ba6acSHisping Lin TEEC_Context TeecContext; 950bb1ba6acSHisping Lin TEEC_Session TeecSession; 951bb1ba6acSHisping Lin uint32_t ErrorOrigin; 952bb1ba6acSHisping Lin 953bb1ba6acSHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 954bb1ba6acSHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 955bb1ba6acSHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 956bb1ba6acSHisping Lin TEEC_Operation TeecOperation = {0}; 957bb1ba6acSHisping Lin 958bb1ba6acSHisping Lin TeecResult = OpteeClientApiLibInitialize(); 959bb1ba6acSHisping Lin if (TeecResult != TEEC_SUCCESS) 960bb1ba6acSHisping Lin return TeecResult; 961bb1ba6acSHisping Lin 962bb1ba6acSHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 963bb1ba6acSHisping Lin if (TeecResult != TEEC_SUCCESS) 964bb1ba6acSHisping Lin return TeecResult; 965bb1ba6acSHisping Lin 966bb1ba6acSHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 967bb1ba6acSHisping Lin &TeecSession, 968bb1ba6acSHisping Lin TeecUuid, 969bb1ba6acSHisping Lin TEEC_LOGIN_PUBLIC, 970bb1ba6acSHisping Lin NULL, 971bb1ba6acSHisping Lin NULL, 972bb1ba6acSHisping Lin &ErrorOrigin); 973bb1ba6acSHisping Lin if (TeecResult != TEEC_SUCCESS) 974bb1ba6acSHisping Lin return TeecResult; 975bb1ba6acSHisping Lin 976bb1ba6acSHisping Lin TeecOperation.params[0].value.a = key_id; 977bb1ba6acSHisping Lin 978bb1ba6acSHisping Lin TEEC_SharedMemory SharedMem = {0}; 979bb1ba6acSHisping Lin 980bb1ba6acSHisping Lin SharedMem.size = byte_len; 981bb1ba6acSHisping Lin SharedMem.flags = 0; 982bb1ba6acSHisping Lin 983bb1ba6acSHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem); 984bb1ba6acSHisping Lin if (TeecResult != TEEC_SUCCESS) 985bb1ba6acSHisping Lin goto exit; 986bb1ba6acSHisping Lin 987bb1ba6acSHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem.buffer; 988bb1ba6acSHisping Lin TeecOperation.params[1].tmpref.size = SharedMem.size; 989bb1ba6acSHisping Lin 990bb1ba6acSHisping Lin memcpy(SharedMem.buffer, byte_buf, SharedMem.size); 991bb1ba6acSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 992bb1ba6acSHisping Lin TEEC_MEMREF_TEMP_INPUT, 993bb1ba6acSHisping Lin TEEC_NONE, 994bb1ba6acSHisping Lin TEEC_NONE); 995bb1ba6acSHisping Lin 996bb1ba6acSHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 99790e849a0Sxb.wang STORAGE_CMD_WRITE_OEM_OTP_KEY, 998bb1ba6acSHisping Lin &TeecOperation, 999bb1ba6acSHisping Lin &ErrorOrigin); 1000bb1ba6acSHisping Lin if (TeecResult != TEEC_SUCCESS) 1001bb1ba6acSHisping Lin goto exit; 1002bb1ba6acSHisping Lin 1003bb1ba6acSHisping Lin exit: 1004bb1ba6acSHisping Lin TEEC_ReleaseSharedMemory(&SharedMem); 1005bb1ba6acSHisping Lin TEEC_CloseSession(&TeecSession); 1006bb1ba6acSHisping Lin TEEC_FinalizeContext(&TeecContext); 1007bb1ba6acSHisping Lin 1008bb1ba6acSHisping Lin return TeecResult; 1009bb1ba6acSHisping Lin } 1010bb1ba6acSHisping Lin 10119deb34f6SHisping Lin uint32_t trusty_oem_otp_key_is_written(enum RK_OEM_OTP_KEYID key_id, uint8_t *value) 10129deb34f6SHisping Lin { 10139deb34f6SHisping Lin TEEC_Result TeecResult; 10149deb34f6SHisping Lin TEEC_Context TeecContext; 10159deb34f6SHisping Lin TEEC_Session TeecSession; 10169deb34f6SHisping Lin uint32_t ErrorOrigin; 10179deb34f6SHisping Lin 10189deb34f6SHisping Lin *value = 0xFF; 10199deb34f6SHisping Lin 10209deb34f6SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 10219deb34f6SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 10229deb34f6SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 10239deb34f6SHisping Lin TEEC_Operation TeecOperation = {0}; 10249deb34f6SHisping Lin 10259deb34f6SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 10269deb34f6SHisping Lin if (TeecResult != TEEC_SUCCESS) 10279deb34f6SHisping Lin return TeecResult; 10289deb34f6SHisping Lin 10299deb34f6SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 10309deb34f6SHisping Lin if (TeecResult != TEEC_SUCCESS) 10319deb34f6SHisping Lin return TeecResult; 10329deb34f6SHisping Lin 10339deb34f6SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 10349deb34f6SHisping Lin &TeecSession, 10359deb34f6SHisping Lin TeecUuid, 10369deb34f6SHisping Lin TEEC_LOGIN_PUBLIC, 10379deb34f6SHisping Lin NULL, 10389deb34f6SHisping Lin NULL, 10399deb34f6SHisping Lin &ErrorOrigin); 10409deb34f6SHisping Lin if (TeecResult != TEEC_SUCCESS) 10419deb34f6SHisping Lin return TeecResult; 10429deb34f6SHisping Lin 10439deb34f6SHisping Lin TeecOperation.params[0].value.a = key_id; 10449deb34f6SHisping Lin 10459deb34f6SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INOUT, 10469deb34f6SHisping Lin TEEC_NONE, 10479deb34f6SHisping Lin TEEC_NONE, 10489deb34f6SHisping Lin TEEC_NONE); 10499deb34f6SHisping Lin 10509deb34f6SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 10519deb34f6SHisping Lin STORAGE_CMD_OEM_OTP_KEY_IS_WRITTEN, 10529deb34f6SHisping Lin &TeecOperation, 10539deb34f6SHisping Lin &ErrorOrigin); 10549deb34f6SHisping Lin if (TeecResult == TEEC_SUCCESS) 10559deb34f6SHisping Lin *value = TeecOperation.params[0].value.b; 10569deb34f6SHisping Lin 10579deb34f6SHisping Lin TEEC_CloseSession(&TeecSession); 10589deb34f6SHisping Lin TEEC_FinalizeContext(&TeecContext); 10599deb34f6SHisping Lin 10609deb34f6SHisping Lin return TeecResult; 10619deb34f6SHisping Lin } 10629deb34f6SHisping Lin 106390e849a0Sxb.wang uint32_t trusty_set_oem_hr_otp_read_lock(enum RK_OEM_OTP_KEYID key_id) 1064a405238aSHisping Lin { 1065a405238aSHisping Lin TEEC_Result TeecResult; 1066a405238aSHisping Lin TEEC_Context TeecContext; 1067a405238aSHisping Lin TEEC_Session TeecSession; 1068a405238aSHisping Lin uint32_t ErrorOrigin; 1069a405238aSHisping Lin 1070a405238aSHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 1071a405238aSHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 1072a405238aSHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 1073a405238aSHisping Lin TEEC_Operation TeecOperation = {0}; 1074a405238aSHisping Lin 1075a405238aSHisping Lin TeecResult = OpteeClientApiLibInitialize(); 1076a405238aSHisping Lin if (TeecResult != TEEC_SUCCESS) 1077a405238aSHisping Lin return TeecResult; 1078a405238aSHisping Lin 1079a405238aSHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1080a405238aSHisping Lin if (TeecResult != TEEC_SUCCESS) 1081a405238aSHisping Lin return TeecResult; 1082a405238aSHisping Lin 1083a405238aSHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 1084a405238aSHisping Lin &TeecSession, 1085a405238aSHisping Lin TeecUuid, 1086a405238aSHisping Lin TEEC_LOGIN_PUBLIC, 1087a405238aSHisping Lin NULL, 1088a405238aSHisping Lin NULL, 1089a405238aSHisping Lin &ErrorOrigin); 1090a405238aSHisping Lin if (TeecResult != TEEC_SUCCESS) 1091a405238aSHisping Lin return TeecResult; 1092a405238aSHisping Lin 1093a405238aSHisping Lin TeecOperation.params[0].value.a = key_id; 1094a405238aSHisping Lin 1095a405238aSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 1096a405238aSHisping Lin TEEC_NONE, 1097a405238aSHisping Lin TEEC_NONE, 1098a405238aSHisping Lin TEEC_NONE); 1099a405238aSHisping Lin 1100a405238aSHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 1101a405238aSHisping Lin STORAGE_CMD_SET_OEM_HR_OTP_READ_LOCK, 1102a405238aSHisping Lin &TeecOperation, 1103a405238aSHisping Lin &ErrorOrigin); 1104a405238aSHisping Lin if (TeecResult != TEEC_SUCCESS) 1105a405238aSHisping Lin goto exit; 1106a405238aSHisping Lin 1107a405238aSHisping Lin exit: 1108a405238aSHisping Lin TEEC_CloseSession(&TeecSession); 1109a405238aSHisping Lin TEEC_FinalizeContext(&TeecContext); 1110a405238aSHisping Lin 1111a405238aSHisping Lin return TeecResult; 1112a405238aSHisping Lin } 1113a405238aSHisping Lin 11142f8c34bdSxb.wang uint32_t trusty_oem_otp_key_cipher(enum RK_OEM_OTP_KEYID key_id, rk_cipher_config *config, 11152f8c34bdSxb.wang uint32_t src_phys_addr, uint32_t dst_phys_addr, 11162f8c34bdSxb.wang uint32_t len) 1117fc3694d6Sxb.wang { 1118fc3694d6Sxb.wang TEEC_Result TeecResult; 1119fc3694d6Sxb.wang TEEC_Context TeecContext; 1120fc3694d6Sxb.wang TEEC_Session TeecSession; 1121fc3694d6Sxb.wang TEEC_Operation TeecOperation = {0}; 1122fc3694d6Sxb.wang uint32_t ErrorOrigin; 1123fc3694d6Sxb.wang TEEC_UUID uuid = RK_CRYPTO_SERVICE_UUID; 1124fc3694d6Sxb.wang TEEC_SharedMemory SharedMem_config = {0}; 1125fc3694d6Sxb.wang 11262f8c34bdSxb.wang if (key_id != RK_OEM_OTP_KEY0 && 11272f8c34bdSxb.wang key_id != RK_OEM_OTP_KEY1 && 11282f8c34bdSxb.wang key_id != RK_OEM_OTP_KEY2 && 11292f8c34bdSxb.wang key_id != RK_OEM_OTP_KEY3 && 11302f8c34bdSxb.wang key_id != RK_OEM_OTP_KEY_FW) 1131fc3694d6Sxb.wang return TEEC_ERROR_BAD_PARAMETERS; 1132fc3694d6Sxb.wang 11332f8c34bdSxb.wang if (!config) 1134fc3694d6Sxb.wang return TEEC_ERROR_BAD_PARAMETERS; 1135fc3694d6Sxb.wang 1136fc3694d6Sxb.wang if (config->algo != RK_ALGO_AES && config->algo != RK_ALGO_SM4) 1137fc3694d6Sxb.wang return TEEC_ERROR_BAD_PARAMETERS; 1138fc3694d6Sxb.wang 1139fc3694d6Sxb.wang if (config->mode >= RK_CIPHER_MODE_XTS) 1140fc3694d6Sxb.wang return TEEC_ERROR_BAD_PARAMETERS; 1141fc3694d6Sxb.wang 1142fc3694d6Sxb.wang if (config->operation != RK_MODE_ENCRYPT && 1143fc3694d6Sxb.wang config->operation != RK_MODE_DECRYPT) 1144fc3694d6Sxb.wang return TEEC_ERROR_BAD_PARAMETERS; 1145fc3694d6Sxb.wang 1146fc3694d6Sxb.wang if (config->key_len != 16 && 1147fc3694d6Sxb.wang config->key_len != 24 && 1148fc3694d6Sxb.wang config->key_len != 32) 1149fc3694d6Sxb.wang return TEEC_ERROR_BAD_PARAMETERS; 1150fc3694d6Sxb.wang 11512f8c34bdSxb.wang if (key_id == RK_OEM_OTP_KEY_FW && config->key_len != 16) 11522f8c34bdSxb.wang return TEEC_ERROR_BAD_PARAMETERS; 11532f8c34bdSxb.wang 11542f8c34bdSxb.wang #if defined(CONFIG_ROCKCHIP_RV1126) 11552f8c34bdSxb.wang if (config->key_len == 24) 11562f8c34bdSxb.wang return TEEC_ERROR_BAD_PARAMETERS; 11572f8c34bdSxb.wang #endif 11582f8c34bdSxb.wang 1159fc3694d6Sxb.wang if (len % AES_BLOCK_SIZE || 1160fc3694d6Sxb.wang len == 0) 1161fc3694d6Sxb.wang return TEEC_ERROR_BAD_PARAMETERS; 1162fc3694d6Sxb.wang 11632f8c34bdSxb.wang if (!src_phys_addr || !dst_phys_addr) 11642f8c34bdSxb.wang return TEEC_ERROR_BAD_PARAMETERS; 11652f8c34bdSxb.wang 1166fc3694d6Sxb.wang TeecResult = OpteeClientApiLibInitialize(); 1167fc3694d6Sxb.wang if (TeecResult != TEEC_SUCCESS) 1168fc3694d6Sxb.wang return TeecResult; 1169fc3694d6Sxb.wang 1170fc3694d6Sxb.wang TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1171fc3694d6Sxb.wang if (TeecResult != TEEC_SUCCESS) 1172fc3694d6Sxb.wang return TeecResult; 1173fc3694d6Sxb.wang 1174fc3694d6Sxb.wang TeecResult = TEEC_OpenSession(&TeecContext, 1175fc3694d6Sxb.wang &TeecSession, 1176fc3694d6Sxb.wang &uuid, 1177fc3694d6Sxb.wang TEEC_LOGIN_PUBLIC, 1178fc3694d6Sxb.wang NULL, 1179fc3694d6Sxb.wang NULL, 1180fc3694d6Sxb.wang &ErrorOrigin); 1181fc3694d6Sxb.wang if (TeecResult != TEEC_SUCCESS) 1182fc3694d6Sxb.wang goto exit; 1183fc3694d6Sxb.wang 1184fc3694d6Sxb.wang SharedMem_config.size = sizeof(rk_cipher_config); 1185fc3694d6Sxb.wang TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem_config); 1186fc3694d6Sxb.wang if (TeecResult != TEEC_SUCCESS) 1187fc3694d6Sxb.wang goto exit; 1188fc3694d6Sxb.wang 1189fc3694d6Sxb.wang memcpy(SharedMem_config.buffer, config, sizeof(rk_cipher_config)); 1190fc3694d6Sxb.wang TeecOperation.params[0].value.a = key_id; 1191fc3694d6Sxb.wang TeecOperation.params[1].tmpref.buffer = SharedMem_config.buffer; 1192fc3694d6Sxb.wang TeecOperation.params[1].tmpref.size = SharedMem_config.size; 11932f8c34bdSxb.wang TeecOperation.params[2].value.a = src_phys_addr; 11942f8c34bdSxb.wang TeecOperation.params[2].value.b = len; 11952f8c34bdSxb.wang TeecOperation.params[3].value.a = dst_phys_addr; 1196fc3694d6Sxb.wang TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 1197fc3694d6Sxb.wang TEEC_MEMREF_TEMP_INPUT, 11982f8c34bdSxb.wang TEEC_VALUE_INPUT, 11992f8c34bdSxb.wang TEEC_VALUE_INPUT); 12002f8c34bdSxb.wang 12012f8c34bdSxb.wang crypto_flush_cacheline(src_phys_addr, len); 12022f8c34bdSxb.wang crypto_flush_cacheline(dst_phys_addr, len); 12032f8c34bdSxb.wang 1204fc3694d6Sxb.wang TeecResult = TEEC_InvokeCommand(&TeecSession, 12052f8c34bdSxb.wang CRYPTO_SERVICE_CMD_OEM_OTP_KEY_PHYS_CIPHER, 1206fc3694d6Sxb.wang &TeecOperation, 1207fc3694d6Sxb.wang &ErrorOrigin); 1208fc3694d6Sxb.wang 1209a900eef3SHisping Lin crypto_invalidate_cacheline(dst_phys_addr, len); 1210a900eef3SHisping Lin 1211fc3694d6Sxb.wang exit: 1212fc3694d6Sxb.wang TEEC_ReleaseSharedMemory(&SharedMem_config); 1213fc3694d6Sxb.wang TEEC_CloseSession(&TeecSession); 1214fc3694d6Sxb.wang TEEC_FinalizeContext(&TeecContext); 1215fc3694d6Sxb.wang return TeecResult; 1216fc3694d6Sxb.wang } 1217fc3694d6Sxb.wang 1218a828eba9SHisping Lin uint32_t trusty_write_oem_hdcp_key(enum RK_HDCP_KEYID key_id, 1219a828eba9SHisping Lin uint8_t *byte_buf, uint32_t byte_len) 1220a828eba9SHisping Lin { 1221a828eba9SHisping Lin TEEC_Result TeecResult; 1222a828eba9SHisping Lin TEEC_Context TeecContext; 1223a828eba9SHisping Lin TEEC_Session TeecSession; 1224a828eba9SHisping Lin uint32_t ErrorOrigin; 1225a828eba9SHisping Lin 1226a828eba9SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 1227a828eba9SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 1228a828eba9SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 1229a828eba9SHisping Lin TEEC_Operation TeecOperation = {0}; 1230a828eba9SHisping Lin 1231a828eba9SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 1232a828eba9SHisping Lin if (TeecResult != TEEC_SUCCESS) 1233a828eba9SHisping Lin return TeecResult; 1234a828eba9SHisping Lin 1235a828eba9SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1236a828eba9SHisping Lin if (TeecResult != TEEC_SUCCESS) 1237a828eba9SHisping Lin return TeecResult; 1238a828eba9SHisping Lin 1239a828eba9SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 1240a828eba9SHisping Lin &TeecSession, 1241a828eba9SHisping Lin TeecUuid, 1242a828eba9SHisping Lin TEEC_LOGIN_PUBLIC, 1243a828eba9SHisping Lin NULL, 1244a828eba9SHisping Lin NULL, 1245a828eba9SHisping Lin &ErrorOrigin); 1246a828eba9SHisping Lin if (TeecResult != TEEC_SUCCESS) 1247a828eba9SHisping Lin return TeecResult; 1248a828eba9SHisping Lin 1249a828eba9SHisping Lin TeecOperation.params[0].value.a = key_id; 1250a828eba9SHisping Lin 1251a828eba9SHisping Lin TEEC_SharedMemory SharedMem = {0}; 1252a828eba9SHisping Lin 1253a828eba9SHisping Lin SharedMem.size = byte_len; 1254a828eba9SHisping Lin SharedMem.flags = 0; 1255a828eba9SHisping Lin 1256a828eba9SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem); 1257a828eba9SHisping Lin if (TeecResult != TEEC_SUCCESS) 1258a828eba9SHisping Lin goto exit; 1259a828eba9SHisping Lin 1260a828eba9SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem.buffer; 1261a828eba9SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem.size; 1262a828eba9SHisping Lin 1263a828eba9SHisping Lin memcpy(SharedMem.buffer, byte_buf, SharedMem.size); 1264a828eba9SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 1265a828eba9SHisping Lin TEEC_MEMREF_TEMP_INPUT, 1266a828eba9SHisping Lin TEEC_NONE, 1267a828eba9SHisping Lin TEEC_NONE); 1268a828eba9SHisping Lin 1269a828eba9SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 1270a828eba9SHisping Lin STORAGE_CMD_WRITE_OEM_HDCP_KEY, 1271a828eba9SHisping Lin &TeecOperation, 1272a828eba9SHisping Lin &ErrorOrigin); 1273a828eba9SHisping Lin if (TeecResult != TEEC_SUCCESS) 1274a828eba9SHisping Lin goto exit; 1275a828eba9SHisping Lin 1276a828eba9SHisping Lin exit: 1277a828eba9SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem); 1278a828eba9SHisping Lin TEEC_CloseSession(&TeecSession); 1279a828eba9SHisping Lin TEEC_FinalizeContext(&TeecContext); 1280a828eba9SHisping Lin 1281a828eba9SHisping Lin return TeecResult; 1282a828eba9SHisping Lin } 1283a828eba9SHisping Lin 1284e8bc2655SHisping Lin uint32_t trusty_oem_hdcp_key_is_written(enum RK_HDCP_KEYID key_id, uint8_t *value) 1285e8bc2655SHisping Lin { 1286e8bc2655SHisping Lin TEEC_Result TeecResult; 1287e8bc2655SHisping Lin TEEC_Context TeecContext; 1288e8bc2655SHisping Lin TEEC_Session TeecSession; 1289e8bc2655SHisping Lin uint32_t ErrorOrigin; 1290e8bc2655SHisping Lin 1291e8bc2655SHisping Lin *value = 0xFF; 1292e8bc2655SHisping Lin 1293e8bc2655SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 1294e8bc2655SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 1295e8bc2655SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 1296e8bc2655SHisping Lin TEEC_Operation TeecOperation = {0}; 1297e8bc2655SHisping Lin 1298e8bc2655SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 1299e8bc2655SHisping Lin if (TeecResult != TEEC_SUCCESS) 1300e8bc2655SHisping Lin return TeecResult; 1301e8bc2655SHisping Lin 1302e8bc2655SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1303e8bc2655SHisping Lin if (TeecResult != TEEC_SUCCESS) 1304e8bc2655SHisping Lin return TeecResult; 1305e8bc2655SHisping Lin 1306e8bc2655SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 1307e8bc2655SHisping Lin &TeecSession, 1308e8bc2655SHisping Lin TeecUuid, 1309e8bc2655SHisping Lin TEEC_LOGIN_PUBLIC, 1310e8bc2655SHisping Lin NULL, 1311e8bc2655SHisping Lin NULL, 1312e8bc2655SHisping Lin &ErrorOrigin); 1313e8bc2655SHisping Lin if (TeecResult != TEEC_SUCCESS) 1314e8bc2655SHisping Lin return TeecResult; 1315e8bc2655SHisping Lin 1316e8bc2655SHisping Lin TeecOperation.params[0].value.a = key_id; 1317e8bc2655SHisping Lin 1318e8bc2655SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INOUT, 1319e8bc2655SHisping Lin TEEC_NONE, 1320e8bc2655SHisping Lin TEEC_NONE, 1321e8bc2655SHisping Lin TEEC_NONE); 1322e8bc2655SHisping Lin 1323e8bc2655SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 1324e8bc2655SHisping Lin STORAGE_CMD_OEM_HDCP_KEY_IS_WRITTEN, 1325e8bc2655SHisping Lin &TeecOperation, 1326e8bc2655SHisping Lin &ErrorOrigin); 1327e8bc2655SHisping Lin if (TeecResult == TEEC_SUCCESS) 1328e8bc2655SHisping Lin *value = TeecOperation.params[0].value.b; 1329e8bc2655SHisping Lin 1330e8bc2655SHisping Lin TEEC_CloseSession(&TeecSession); 1331e8bc2655SHisping Lin TEEC_FinalizeContext(&TeecContext); 1332e8bc2655SHisping Lin 1333e8bc2655SHisping Lin return TeecResult; 1334e8bc2655SHisping Lin } 1335e8bc2655SHisping Lin 1336bfd9cea4SHisping Lin uint32_t trusty_set_oem_hdcp_key_mask(enum RK_HDCP_KEYID key_id) 1337bfd9cea4SHisping Lin { 1338bfd9cea4SHisping Lin TEEC_Result TeecResult; 1339bfd9cea4SHisping Lin TEEC_Context TeecContext; 1340bfd9cea4SHisping Lin TEEC_Session TeecSession; 1341bfd9cea4SHisping Lin uint32_t ErrorOrigin; 1342bfd9cea4SHisping Lin 1343bfd9cea4SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 1344bfd9cea4SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 1345bfd9cea4SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 1346bfd9cea4SHisping Lin TEEC_Operation TeecOperation = {0}; 1347bfd9cea4SHisping Lin 1348bfd9cea4SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 1349bfd9cea4SHisping Lin if (TeecResult != TEEC_SUCCESS) 1350bfd9cea4SHisping Lin return TeecResult; 1351bfd9cea4SHisping Lin 1352bfd9cea4SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1353bfd9cea4SHisping Lin if (TeecResult != TEEC_SUCCESS) 1354bfd9cea4SHisping Lin return TeecResult; 1355bfd9cea4SHisping Lin 1356bfd9cea4SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 1357bfd9cea4SHisping Lin &TeecSession, 1358bfd9cea4SHisping Lin TeecUuid, 1359bfd9cea4SHisping Lin TEEC_LOGIN_PUBLIC, 1360bfd9cea4SHisping Lin NULL, 1361bfd9cea4SHisping Lin NULL, 1362bfd9cea4SHisping Lin &ErrorOrigin); 1363bfd9cea4SHisping Lin if (TeecResult != TEEC_SUCCESS) 1364bfd9cea4SHisping Lin return TeecResult; 1365bfd9cea4SHisping Lin 1366bfd9cea4SHisping Lin TeecOperation.params[0].value.a = key_id; 1367bfd9cea4SHisping Lin 1368bfd9cea4SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 1369bfd9cea4SHisping Lin TEEC_NONE, 1370bfd9cea4SHisping Lin TEEC_NONE, 1371bfd9cea4SHisping Lin TEEC_NONE); 1372bfd9cea4SHisping Lin 1373bfd9cea4SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 1374bfd9cea4SHisping Lin STORAGE_CMD_SET_OEM_HDCP_KEY_MASK, 1375bfd9cea4SHisping Lin &TeecOperation, 1376bfd9cea4SHisping Lin &ErrorOrigin); 1377bfd9cea4SHisping Lin if (TeecResult != TEEC_SUCCESS) 1378bfd9cea4SHisping Lin goto exit; 1379bfd9cea4SHisping Lin 1380bfd9cea4SHisping Lin exit: 1381bfd9cea4SHisping Lin TEEC_CloseSession(&TeecSession); 1382bfd9cea4SHisping Lin TEEC_FinalizeContext(&TeecContext); 1383bfd9cea4SHisping Lin 1384bfd9cea4SHisping Lin return TeecResult; 1385bfd9cea4SHisping Lin } 1386bfd9cea4SHisping Lin 1387*ac6d8253SHisping Lin uint32_t trusty_write_esck_key(enum RK_ESCK_KEYID key_id, 1388*ac6d8253SHisping Lin uint8_t *byte_buf, uint32_t byte_len) 1389*ac6d8253SHisping Lin { 1390*ac6d8253SHisping Lin TEEC_Result TeecResult; 1391*ac6d8253SHisping Lin TEEC_Context TeecContext; 1392*ac6d8253SHisping Lin TEEC_Session TeecSession; 1393*ac6d8253SHisping Lin uint32_t ErrorOrigin; 1394*ac6d8253SHisping Lin 1395*ac6d8253SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 1396*ac6d8253SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 1397*ac6d8253SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 1398*ac6d8253SHisping Lin TEEC_Operation TeecOperation = {0}; 1399*ac6d8253SHisping Lin 1400*ac6d8253SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 1401*ac6d8253SHisping Lin if (TeecResult != TEEC_SUCCESS) 1402*ac6d8253SHisping Lin return TeecResult; 1403*ac6d8253SHisping Lin 1404*ac6d8253SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1405*ac6d8253SHisping Lin if (TeecResult != TEEC_SUCCESS) 1406*ac6d8253SHisping Lin return TeecResult; 1407*ac6d8253SHisping Lin 1408*ac6d8253SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 1409*ac6d8253SHisping Lin &TeecSession, 1410*ac6d8253SHisping Lin TeecUuid, 1411*ac6d8253SHisping Lin TEEC_LOGIN_PUBLIC, 1412*ac6d8253SHisping Lin NULL, 1413*ac6d8253SHisping Lin NULL, 1414*ac6d8253SHisping Lin &ErrorOrigin); 1415*ac6d8253SHisping Lin if (TeecResult != TEEC_SUCCESS) 1416*ac6d8253SHisping Lin return TeecResult; 1417*ac6d8253SHisping Lin 1418*ac6d8253SHisping Lin TeecOperation.params[0].value.a = key_id; 1419*ac6d8253SHisping Lin 1420*ac6d8253SHisping Lin TEEC_SharedMemory SharedMem = {0}; 1421*ac6d8253SHisping Lin 1422*ac6d8253SHisping Lin SharedMem.size = byte_len; 1423*ac6d8253SHisping Lin SharedMem.flags = 0; 1424*ac6d8253SHisping Lin 1425*ac6d8253SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem); 1426*ac6d8253SHisping Lin if (TeecResult != TEEC_SUCCESS) 1427*ac6d8253SHisping Lin goto exit; 1428*ac6d8253SHisping Lin 1429*ac6d8253SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem.buffer; 1430*ac6d8253SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem.size; 1431*ac6d8253SHisping Lin 1432*ac6d8253SHisping Lin memcpy(SharedMem.buffer, byte_buf, SharedMem.size); 1433*ac6d8253SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 1434*ac6d8253SHisping Lin TEEC_MEMREF_TEMP_INPUT, 1435*ac6d8253SHisping Lin TEEC_NONE, 1436*ac6d8253SHisping Lin TEEC_NONE); 1437*ac6d8253SHisping Lin 1438*ac6d8253SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 1439*ac6d8253SHisping Lin STORAGE_CMD_WRITE_ESCK_KEY, 1440*ac6d8253SHisping Lin &TeecOperation, 1441*ac6d8253SHisping Lin &ErrorOrigin); 1442*ac6d8253SHisping Lin if (TeecResult != TEEC_SUCCESS) 1443*ac6d8253SHisping Lin goto exit; 1444*ac6d8253SHisping Lin 1445*ac6d8253SHisping Lin exit: 1446*ac6d8253SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem); 1447*ac6d8253SHisping Lin TEEC_CloseSession(&TeecSession); 1448*ac6d8253SHisping Lin TEEC_FinalizeContext(&TeecContext); 1449*ac6d8253SHisping Lin 1450*ac6d8253SHisping Lin return TeecResult; 1451*ac6d8253SHisping Lin } 1452*ac6d8253SHisping Lin 1453*ac6d8253SHisping Lin uint32_t trusty_esck_key_is_written(enum RK_ESCK_KEYID key_id, uint8_t *value) 1454*ac6d8253SHisping Lin { 1455*ac6d8253SHisping Lin TEEC_Result TeecResult; 1456*ac6d8253SHisping Lin TEEC_Context TeecContext; 1457*ac6d8253SHisping Lin TEEC_Session TeecSession; 1458*ac6d8253SHisping Lin uint32_t ErrorOrigin; 1459*ac6d8253SHisping Lin 1460*ac6d8253SHisping Lin *value = 0xFF; 1461*ac6d8253SHisping Lin 1462*ac6d8253SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 1463*ac6d8253SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 1464*ac6d8253SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 1465*ac6d8253SHisping Lin TEEC_Operation TeecOperation = {0}; 1466*ac6d8253SHisping Lin 1467*ac6d8253SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 1468*ac6d8253SHisping Lin if (TeecResult != TEEC_SUCCESS) 1469*ac6d8253SHisping Lin return TeecResult; 1470*ac6d8253SHisping Lin 1471*ac6d8253SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1472*ac6d8253SHisping Lin if (TeecResult != TEEC_SUCCESS) 1473*ac6d8253SHisping Lin return TeecResult; 1474*ac6d8253SHisping Lin 1475*ac6d8253SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 1476*ac6d8253SHisping Lin &TeecSession, 1477*ac6d8253SHisping Lin TeecUuid, 1478*ac6d8253SHisping Lin TEEC_LOGIN_PUBLIC, 1479*ac6d8253SHisping Lin NULL, 1480*ac6d8253SHisping Lin NULL, 1481*ac6d8253SHisping Lin &ErrorOrigin); 1482*ac6d8253SHisping Lin if (TeecResult != TEEC_SUCCESS) 1483*ac6d8253SHisping Lin return TeecResult; 1484*ac6d8253SHisping Lin 1485*ac6d8253SHisping Lin TeecOperation.params[0].value.a = key_id; 1486*ac6d8253SHisping Lin 1487*ac6d8253SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INOUT, 1488*ac6d8253SHisping Lin TEEC_NONE, 1489*ac6d8253SHisping Lin TEEC_NONE, 1490*ac6d8253SHisping Lin TEEC_NONE); 1491*ac6d8253SHisping Lin 1492*ac6d8253SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 1493*ac6d8253SHisping Lin STORAGE_CMD_ESCK_KEY_IS_WRITTEN, 1494*ac6d8253SHisping Lin &TeecOperation, 1495*ac6d8253SHisping Lin &ErrorOrigin); 1496*ac6d8253SHisping Lin if (TeecResult == TEEC_SUCCESS) 1497*ac6d8253SHisping Lin *value = TeecOperation.params[0].value.b; 1498*ac6d8253SHisping Lin 1499*ac6d8253SHisping Lin TEEC_CloseSession(&TeecSession); 1500*ac6d8253SHisping Lin TEEC_FinalizeContext(&TeecContext); 1501*ac6d8253SHisping Lin 1502*ac6d8253SHisping Lin return TeecResult; 1503*ac6d8253SHisping Lin } 1504*ac6d8253SHisping Lin 1505*ac6d8253SHisping Lin uint32_t trusty_set_esck_key_mask(enum RK_ESCK_KEYID key_id) 1506*ac6d8253SHisping Lin { 1507*ac6d8253SHisping Lin TEEC_Result TeecResult; 1508*ac6d8253SHisping Lin TEEC_Context TeecContext; 1509*ac6d8253SHisping Lin TEEC_Session TeecSession; 1510*ac6d8253SHisping Lin uint32_t ErrorOrigin; 1511*ac6d8253SHisping Lin 1512*ac6d8253SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 1513*ac6d8253SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 1514*ac6d8253SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 1515*ac6d8253SHisping Lin TEEC_Operation TeecOperation = {0}; 1516*ac6d8253SHisping Lin 1517*ac6d8253SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 1518*ac6d8253SHisping Lin if (TeecResult != TEEC_SUCCESS) 1519*ac6d8253SHisping Lin return TeecResult; 1520*ac6d8253SHisping Lin 1521*ac6d8253SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1522*ac6d8253SHisping Lin if (TeecResult != TEEC_SUCCESS) 1523*ac6d8253SHisping Lin return TeecResult; 1524*ac6d8253SHisping Lin 1525*ac6d8253SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 1526*ac6d8253SHisping Lin &TeecSession, 1527*ac6d8253SHisping Lin TeecUuid, 1528*ac6d8253SHisping Lin TEEC_LOGIN_PUBLIC, 1529*ac6d8253SHisping Lin NULL, 1530*ac6d8253SHisping Lin NULL, 1531*ac6d8253SHisping Lin &ErrorOrigin); 1532*ac6d8253SHisping Lin if (TeecResult != TEEC_SUCCESS) 1533*ac6d8253SHisping Lin return TeecResult; 1534*ac6d8253SHisping Lin 1535*ac6d8253SHisping Lin TeecOperation.params[0].value.a = key_id; 1536*ac6d8253SHisping Lin 1537*ac6d8253SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 1538*ac6d8253SHisping Lin TEEC_NONE, 1539*ac6d8253SHisping Lin TEEC_NONE, 1540*ac6d8253SHisping Lin TEEC_NONE); 1541*ac6d8253SHisping Lin 1542*ac6d8253SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 1543*ac6d8253SHisping Lin STORAGE_CMD_SET_ESCK_KEY_MASK, 1544*ac6d8253SHisping Lin &TeecOperation, 1545*ac6d8253SHisping Lin &ErrorOrigin); 1546*ac6d8253SHisping Lin if (TeecResult != TEEC_SUCCESS) 1547*ac6d8253SHisping Lin goto exit; 1548*ac6d8253SHisping Lin 1549*ac6d8253SHisping Lin exit: 1550*ac6d8253SHisping Lin TEEC_CloseSession(&TeecSession); 1551*ac6d8253SHisping Lin TEEC_FinalizeContext(&TeecContext); 1552*ac6d8253SHisping Lin 1553*ac6d8253SHisping Lin return TeecResult; 1554*ac6d8253SHisping Lin } 1555*ac6d8253SHisping Lin 15564d4c5043SHisping Lin uint32_t trusty_oem_user_ta_transfer(void) 15574d4c5043SHisping Lin { 15584d4c5043SHisping Lin TEEC_Result TeecResult; 15594d4c5043SHisping Lin TEEC_Context TeecContext; 15604d4c5043SHisping Lin TEEC_Session TeecSession; 15614d4c5043SHisping Lin uint32_t ErrorOrigin; 15624d4c5043SHisping Lin TEEC_UUID tempuuid = { 0x1db57234, 0xdacd, 0x462d, 15634d4c5043SHisping Lin { 0x9b, 0xb1, 0xae, 0x79, 0xde, 0x44, 0xe2, 0xa5} }; 15644d4c5043SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 15654d4c5043SHisping Lin TEEC_Operation TeecOperation = {0}; 15664d4c5043SHisping Lin const uint8_t transfer_inout[] = "Transfer data test."; 15674d4c5043SHisping Lin 15684d4c5043SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 15694d4c5043SHisping Lin if (TeecResult != TEEC_SUCCESS) 15704d4c5043SHisping Lin return TeecResult; 15714d4c5043SHisping Lin 15724d4c5043SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 15734d4c5043SHisping Lin if (TeecResult != TEEC_SUCCESS) 15744d4c5043SHisping Lin return TeecResult; 15754d4c5043SHisping Lin 15764d4c5043SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE, 15774d4c5043SHisping Lin TEEC_NONE, 15784d4c5043SHisping Lin TEEC_NONE, 15794d4c5043SHisping Lin TEEC_NONE); 15804d4c5043SHisping Lin 15814d4c5043SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 15824d4c5043SHisping Lin &TeecSession, 15834d4c5043SHisping Lin TeecUuid, 15844d4c5043SHisping Lin TEEC_LOGIN_PUBLIC, 15854d4c5043SHisping Lin NULL, 15864d4c5043SHisping Lin &TeecOperation, 15874d4c5043SHisping Lin &ErrorOrigin); 15884d4c5043SHisping Lin if (TeecResult != TEEC_SUCCESS) 15894d4c5043SHisping Lin return TeecResult; 15904d4c5043SHisping Lin 15914d4c5043SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 15924d4c5043SHisping Lin 15934d4c5043SHisping Lin SharedMem0.size = sizeof(transfer_inout); 15944d4c5043SHisping Lin SharedMem0.flags = 0; 15954d4c5043SHisping Lin 15964d4c5043SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 15974d4c5043SHisping Lin if (TeecResult != TEEC_SUCCESS) 15984d4c5043SHisping Lin goto exit; 15994d4c5043SHisping Lin 16004d4c5043SHisping Lin memcpy(SharedMem0.buffer, transfer_inout, SharedMem0.size); 16014d4c5043SHisping Lin 16024d4c5043SHisping Lin TEEC_SharedMemory SharedMem1 = {0}; 16034d4c5043SHisping Lin 16044d4c5043SHisping Lin SharedMem1.size = sizeof(transfer_inout); 16054d4c5043SHisping Lin SharedMem1.flags = 0; 16064d4c5043SHisping Lin 16074d4c5043SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 16084d4c5043SHisping Lin if (TeecResult != TEEC_SUCCESS) 16094d4c5043SHisping Lin goto exit; 16104d4c5043SHisping Lin 16114d4c5043SHisping Lin TeecOperation.params[0].value.a = 66; 16124d4c5043SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem0.buffer; 16134d4c5043SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem0.size; 16144d4c5043SHisping Lin TeecOperation.params[2].tmpref.buffer = SharedMem1.buffer; 16154d4c5043SHisping Lin TeecOperation.params[2].tmpref.size = SharedMem1.size; 16164d4c5043SHisping Lin 16174d4c5043SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INOUT, 16184d4c5043SHisping Lin TEEC_MEMREF_TEMP_INPUT, 16194d4c5043SHisping Lin TEEC_MEMREF_TEMP_OUTPUT, 16204d4c5043SHisping Lin TEEC_NONE); 16214d4c5043SHisping Lin 16224d4c5043SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 16234d4c5043SHisping Lin 102, 16244d4c5043SHisping Lin &TeecOperation, 16254d4c5043SHisping Lin &ErrorOrigin); 16264d4c5043SHisping Lin if (TeecResult != TEEC_SUCCESS) 16274d4c5043SHisping Lin goto exit; 16284d4c5043SHisping Lin 16294d4c5043SHisping Lin //Check the result 16304d4c5043SHisping Lin if (TeecOperation.params[0].value.a == 66 + 1 && 16314d4c5043SHisping Lin TeecOperation.params[0].value.b == TeecOperation.params[0].value.a) 16324d4c5043SHisping Lin printf("test value : Pass!\n"); 16334d4c5043SHisping Lin else 16344d4c5043SHisping Lin printf("test value : Fail! (mismatch values)\n"); 16354d4c5043SHisping Lin 16364d4c5043SHisping Lin if (memcmp(SharedMem1.buffer, transfer_inout, sizeof(transfer_inout)) == 0) 16374d4c5043SHisping Lin printf("test buffer : Pass!\n"); 16384d4c5043SHisping Lin else 16394d4c5043SHisping Lin printf("test buffer : Fail! (mismatch buffer)\n"); 16404d4c5043SHisping Lin 16414d4c5043SHisping Lin exit: 16424d4c5043SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 16434d4c5043SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem1); 16444d4c5043SHisping Lin TEEC_CloseSession(&TeecSession); 16454d4c5043SHisping Lin TEEC_FinalizeContext(&TeecContext); 16464d4c5043SHisping Lin 16474d4c5043SHisping Lin return TeecResult; 16484d4c5043SHisping Lin } 16494d4c5043SHisping Lin 16504d4c5043SHisping Lin uint32_t trusty_oem_user_ta_storage(void) 16514d4c5043SHisping Lin { 16524d4c5043SHisping Lin TEEC_Result TeecResult; 16534d4c5043SHisping Lin TEEC_Context TeecContext; 16544d4c5043SHisping Lin TEEC_Session TeecSession; 16554d4c5043SHisping Lin uint32_t ErrorOrigin; 16564d4c5043SHisping Lin TEEC_UUID tempuuid = { 0x1db57234, 0xdacd, 0x462d, 16574d4c5043SHisping Lin { 0x9b, 0xb1, 0xae, 0x79, 0xde, 0x44, 0xe2, 0xa5} }; 16584d4c5043SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 16594d4c5043SHisping Lin TEEC_Operation TeecOperation = {0}; 16604d4c5043SHisping Lin 16614d4c5043SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 16624d4c5043SHisping Lin if (TeecResult != TEEC_SUCCESS) 16634d4c5043SHisping Lin return TeecResult; 16644d4c5043SHisping Lin 16654d4c5043SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 16664d4c5043SHisping Lin if (TeecResult != TEEC_SUCCESS) 16674d4c5043SHisping Lin return TeecResult; 16684d4c5043SHisping Lin 16694d4c5043SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE, 16704d4c5043SHisping Lin TEEC_NONE, 16714d4c5043SHisping Lin TEEC_NONE, 16724d4c5043SHisping Lin TEEC_NONE); 16734d4c5043SHisping Lin 16744d4c5043SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 16754d4c5043SHisping Lin &TeecSession, 16764d4c5043SHisping Lin TeecUuid, 16774d4c5043SHisping Lin TEEC_LOGIN_PUBLIC, 16784d4c5043SHisping Lin NULL, 16794d4c5043SHisping Lin &TeecOperation, 16804d4c5043SHisping Lin &ErrorOrigin); 16814d4c5043SHisping Lin if (TeecResult != TEEC_SUCCESS) 16824d4c5043SHisping Lin return TeecResult; 16834d4c5043SHisping Lin 16844d4c5043SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE, 16854d4c5043SHisping Lin TEEC_NONE, 16864d4c5043SHisping Lin TEEC_NONE, 16874d4c5043SHisping Lin TEEC_NONE); 16884d4c5043SHisping Lin 16894d4c5043SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 16904d4c5043SHisping Lin 103, 16914d4c5043SHisping Lin &TeecOperation, 16924d4c5043SHisping Lin &ErrorOrigin); 16934d4c5043SHisping Lin if (TeecResult != TEEC_SUCCESS) 16944d4c5043SHisping Lin goto exit; 16954d4c5043SHisping Lin 16964d4c5043SHisping Lin exit: 16974d4c5043SHisping Lin TEEC_CloseSession(&TeecSession); 16984d4c5043SHisping Lin TEEC_FinalizeContext(&TeecContext); 16994d4c5043SHisping Lin 17004d4c5043SHisping Lin return TeecResult; 17014d4c5043SHisping Lin } 17024d4c5043SHisping Lin 17034aa61755SAndy Ye uint32_t trusty_attest_dh(uint8_t *dh, uint32_t *dh_size) 17044aa61755SAndy Ye { 17054aa61755SAndy Ye TEEC_Result TeecResult; 17064aa61755SAndy Ye TEEC_Context TeecContext; 17074aa61755SAndy Ye TEEC_Session TeecSession; 17084aa61755SAndy Ye uint32_t ErrorOrigin; 17094aa61755SAndy Ye TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6, 17104aa61755SAndy Ye { 0xa8, 0x69, 0x9c, 0xe6, 17114aa61755SAndy Ye 0x88, 0x6c, 0x5d, 0x5d 17124aa61755SAndy Ye } 17134aa61755SAndy Ye }; 17144aa61755SAndy Ye TEEC_UUID *TeecUuid = &tempuuid; 17154aa61755SAndy Ye TEEC_Operation TeecOperation = {0}; 17163251364cSHisping Lin struct blk_desc *dev_desc; 17173251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 17186651d4c0SJason Zhu if (!dev_desc) { 17196651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 17206651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 17216651d4c0SJason Zhu } 17224aa61755SAndy Ye 1723f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 1724f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1725f4e1db95SHisping Lin return TeecResult; 17264aa61755SAndy Ye 17274aa61755SAndy Ye TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1728f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1729f4e1db95SHisping Lin return TeecResult; 17304aa61755SAndy Ye 17313251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 17323251364cSHisping Lin TEEC_NONE, 17333251364cSHisping Lin TEEC_NONE, 17343251364cSHisping Lin TEEC_NONE); 17353251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 1736b9a7e756SHisping Lin if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0) 1737b9a7e756SHisping Lin TeecOperation.params[0].value.a = 1; 1738b9a7e756SHisping Lin else 1739b9a7e756SHisping Lin TeecOperation.params[0].value.a = 0; 1740b9a7e756SHisping Lin 17413251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 17423251364cSHisping Lin TeecOperation.params[0].value.a = 0; 17433251364cSHisping Lin #endif 17443251364cSHisping Lin 17454aa61755SAndy Ye TeecResult = TEEC_OpenSession(&TeecContext, 17464aa61755SAndy Ye &TeecSession, 17474aa61755SAndy Ye TeecUuid, 17484aa61755SAndy Ye TEEC_LOGIN_PUBLIC, 17494aa61755SAndy Ye NULL, 17503251364cSHisping Lin &TeecOperation, 17514aa61755SAndy Ye &ErrorOrigin); 1752f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1753f4e1db95SHisping Lin return TeecResult; 17544aa61755SAndy Ye 17554aa61755SAndy Ye TEEC_SharedMemory SharedMem0 = {0}; 17564aa61755SAndy Ye 17574aa61755SAndy Ye SharedMem0.size = *dh_size; 17584aa61755SAndy Ye SharedMem0.flags = 0; 17594aa61755SAndy Ye 17604aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 1761f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1762f4e1db95SHisping Lin goto exit; 17634aa61755SAndy Ye 17644aa61755SAndy Ye TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 17654aa61755SAndy Ye TeecOperation.params[0].tmpref.size = SharedMem0.size; 17664aa61755SAndy Ye 17674aa61755SAndy Ye TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, 17684aa61755SAndy Ye TEEC_NONE, 17694aa61755SAndy Ye TEEC_NONE, 17704aa61755SAndy Ye TEEC_NONE); 17714aa61755SAndy Ye 17724aa61755SAndy Ye TeecResult = TEEC_InvokeCommand(&TeecSession, 17734aa61755SAndy Ye 143, 17744aa61755SAndy Ye &TeecOperation, 17754aa61755SAndy Ye &ErrorOrigin); 1776f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1777f4e1db95SHisping Lin goto exit; 17784aa61755SAndy Ye 17794aa61755SAndy Ye *dh_size = TeecOperation.params[0].tmpref.size; 17804aa61755SAndy Ye memcpy(dh, SharedMem0.buffer, SharedMem0.size); 1781f4e1db95SHisping Lin exit: 17824aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem0); 17834aa61755SAndy Ye TEEC_CloseSession(&TeecSession); 1784f4e1db95SHisping Lin TEEC_FinalizeContext(&TeecContext); 17854aa61755SAndy Ye 17864aa61755SAndy Ye return TeecResult; 17874aa61755SAndy Ye } 17884aa61755SAndy Ye 17894aa61755SAndy Ye uint32_t trusty_attest_uuid(uint8_t *uuid, uint32_t *uuid_size) 17904aa61755SAndy Ye { 17914aa61755SAndy Ye TEEC_Result TeecResult; 17924aa61755SAndy Ye TEEC_Context TeecContext; 17934aa61755SAndy Ye TEEC_Session TeecSession; 17944aa61755SAndy Ye uint32_t ErrorOrigin; 17954aa61755SAndy Ye TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6, 17964aa61755SAndy Ye { 0xa8, 0x69, 0x9c, 0xe6, 17974aa61755SAndy Ye 0x88, 0x6c, 0x5d, 0x5d 17984aa61755SAndy Ye } 17994aa61755SAndy Ye }; 18004aa61755SAndy Ye TEEC_UUID *TeecUuid = &tempuuid; 18014aa61755SAndy Ye TEEC_Operation TeecOperation = {0}; 18023251364cSHisping Lin struct blk_desc *dev_desc; 18033251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 18046651d4c0SJason Zhu if (!dev_desc) { 18056651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 18066651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 18076651d4c0SJason Zhu } 18084aa61755SAndy Ye 1809f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 1810f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1811f4e1db95SHisping Lin return TeecResult; 18124aa61755SAndy Ye 18134aa61755SAndy Ye TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1814f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1815f4e1db95SHisping Lin return TeecResult; 18164aa61755SAndy Ye 18173251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 18183251364cSHisping Lin TEEC_NONE, 18193251364cSHisping Lin TEEC_NONE, 18203251364cSHisping Lin TEEC_NONE); 18213251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 1822b9a7e756SHisping Lin if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0) 1823b9a7e756SHisping Lin TeecOperation.params[0].value.a = 1; 1824b9a7e756SHisping Lin else 1825b9a7e756SHisping Lin TeecOperation.params[0].value.a = 0; 1826b9a7e756SHisping Lin 18273251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 18283251364cSHisping Lin TeecOperation.params[0].value.a = 0; 18293251364cSHisping Lin #endif 18303251364cSHisping Lin 18314aa61755SAndy Ye TeecResult = TEEC_OpenSession(&TeecContext, 18324aa61755SAndy Ye &TeecSession, 18334aa61755SAndy Ye TeecUuid, 18344aa61755SAndy Ye TEEC_LOGIN_PUBLIC, 18354aa61755SAndy Ye NULL, 18363251364cSHisping Lin &TeecOperation, 18374aa61755SAndy Ye &ErrorOrigin); 1838f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1839f4e1db95SHisping Lin return TeecResult; 18404aa61755SAndy Ye 18414aa61755SAndy Ye TEEC_SharedMemory SharedMem0 = {0}; 18424aa61755SAndy Ye 18434aa61755SAndy Ye SharedMem0.size = *uuid_size; 18444aa61755SAndy Ye SharedMem0.flags = 0; 18454aa61755SAndy Ye 18464aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 1847f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1848f4e1db95SHisping Lin goto exit; 18494aa61755SAndy Ye 18504aa61755SAndy Ye TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 18514aa61755SAndy Ye TeecOperation.params[0].tmpref.size = SharedMem0.size; 18524aa61755SAndy Ye 18534aa61755SAndy Ye TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, 18544aa61755SAndy Ye TEEC_NONE, 18554aa61755SAndy Ye TEEC_NONE, 18564aa61755SAndy Ye TEEC_NONE); 18574aa61755SAndy Ye 18584aa61755SAndy Ye TeecResult = TEEC_InvokeCommand(&TeecSession, 18594aa61755SAndy Ye 144, 18604aa61755SAndy Ye &TeecOperation, 18614aa61755SAndy Ye &ErrorOrigin); 1862f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1863f4e1db95SHisping Lin goto exit; 18644aa61755SAndy Ye 18654aa61755SAndy Ye *uuid_size = TeecOperation.params[0].tmpref.size; 18664aa61755SAndy Ye memcpy(uuid, SharedMem0.buffer, SharedMem0.size); 1867f4e1db95SHisping Lin exit: 18684aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem0); 18694aa61755SAndy Ye TEEC_CloseSession(&TeecSession); 1870f4e1db95SHisping Lin TEEC_FinalizeContext(&TeecContext); 18714aa61755SAndy Ye 18724aa61755SAndy Ye return TeecResult; 18734aa61755SAndy Ye } 18744aa61755SAndy Ye 18754aa61755SAndy Ye uint32_t trusty_attest_get_ca(uint8_t *operation_start, 18764aa61755SAndy Ye uint32_t *operation_size, 18774aa61755SAndy Ye uint8_t *out, 18784aa61755SAndy Ye uint32_t *out_len) 18794aa61755SAndy Ye { 18804aa61755SAndy Ye TEEC_Result TeecResult; 18814aa61755SAndy Ye TEEC_Context TeecContext; 18824aa61755SAndy Ye TEEC_Session TeecSession; 18834aa61755SAndy Ye uint32_t ErrorOrigin; 18844aa61755SAndy Ye 18854aa61755SAndy Ye TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6, 18864aa61755SAndy Ye { 0xa8, 0x69, 0x9c, 0xe6, 18874aa61755SAndy Ye 0x88, 0x6c, 0x5d, 0x5d 18884aa61755SAndy Ye } 18894aa61755SAndy Ye }; 18904aa61755SAndy Ye 18914aa61755SAndy Ye TEEC_UUID *TeecUuid = &tempuuid; 18924aa61755SAndy Ye TEEC_Operation TeecOperation = {0}; 18933251364cSHisping Lin struct blk_desc *dev_desc; 18943251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 18956651d4c0SJason Zhu if (!dev_desc) { 18966651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 18976651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 18986651d4c0SJason Zhu } 18994aa61755SAndy Ye 1900f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 1901f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1902f4e1db95SHisping Lin return TeecResult; 19034aa61755SAndy Ye 19044aa61755SAndy Ye TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1905f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1906f4e1db95SHisping Lin return TeecResult; 19074aa61755SAndy Ye 19083251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 19093251364cSHisping Lin TEEC_NONE, 19103251364cSHisping Lin TEEC_NONE, 19113251364cSHisping Lin TEEC_NONE); 19123251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 1913b9a7e756SHisping Lin if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0) 1914b9a7e756SHisping Lin TeecOperation.params[0].value.a = 1; 1915b9a7e756SHisping Lin else 1916b9a7e756SHisping Lin TeecOperation.params[0].value.a = 0; 1917b9a7e756SHisping Lin 19183251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 19193251364cSHisping Lin TeecOperation.params[0].value.a = 0; 19203251364cSHisping Lin #endif 19213251364cSHisping Lin 19224aa61755SAndy Ye TeecResult = TEEC_OpenSession(&TeecContext, 19234aa61755SAndy Ye &TeecSession, 19244aa61755SAndy Ye TeecUuid, 19254aa61755SAndy Ye TEEC_LOGIN_PUBLIC, 19264aa61755SAndy Ye NULL, 19273251364cSHisping Lin &TeecOperation, 19284aa61755SAndy Ye &ErrorOrigin); 1929f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1930f4e1db95SHisping Lin return TeecResult; 19314aa61755SAndy Ye 19324aa61755SAndy Ye TEEC_SharedMemory SharedMem0 = {0}; 19334aa61755SAndy Ye 19344aa61755SAndy Ye SharedMem0.size = *operation_size; 19354aa61755SAndy Ye SharedMem0.flags = 0; 19364aa61755SAndy Ye 19374aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 1938f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1939f4e1db95SHisping Lin goto exit; 19404aa61755SAndy Ye 19414aa61755SAndy Ye memcpy(SharedMem0.buffer, operation_start, SharedMem0.size); 19424aa61755SAndy Ye 19434aa61755SAndy Ye TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 19444aa61755SAndy Ye TeecOperation.params[0].tmpref.size = SharedMem0.size; 19454aa61755SAndy Ye 19464aa61755SAndy Ye TEEC_SharedMemory SharedMem1 = {0}; 19474aa61755SAndy Ye 19484aa61755SAndy Ye SharedMem1.size = *out_len; 19494aa61755SAndy Ye SharedMem1.flags = 0; 19504aa61755SAndy Ye 19514aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 1952f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1953f4e1db95SHisping Lin goto exit; 19544aa61755SAndy Ye 19554aa61755SAndy Ye TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 19564aa61755SAndy Ye TeecOperation.params[1].tmpref.size = SharedMem1.size; 19574aa61755SAndy Ye 19584aa61755SAndy Ye TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, 19594aa61755SAndy Ye TEEC_MEMREF_TEMP_INOUT, 19604aa61755SAndy Ye TEEC_NONE, 19614aa61755SAndy Ye TEEC_NONE); 19624aa61755SAndy Ye 19634aa61755SAndy Ye TeecResult = TEEC_InvokeCommand(&TeecSession, 19644aa61755SAndy Ye 145, 19654aa61755SAndy Ye &TeecOperation, 19664aa61755SAndy Ye &ErrorOrigin); 1967f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1968f4e1db95SHisping Lin goto exit; 19694aa61755SAndy Ye 19704aa61755SAndy Ye *out_len = TeecOperation.params[1].tmpref.size; 19714aa61755SAndy Ye memcpy(out, SharedMem1.buffer, SharedMem1.size); 1972f4e1db95SHisping Lin exit: 19734aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem0); 19744aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem1); 1975f4e1db95SHisping Lin TEEC_CloseSession(&TeecSession); 1976f4e1db95SHisping Lin TEEC_FinalizeContext(&TeecContext); 19774aa61755SAndy Ye 19784aa61755SAndy Ye return TeecResult; 19794aa61755SAndy Ye } 19804aa61755SAndy Ye 19814aa61755SAndy Ye uint32_t trusty_attest_set_ca(uint8_t *ca_response, uint32_t *ca_response_size) 19824aa61755SAndy Ye { 19834aa61755SAndy Ye TEEC_Result TeecResult; 19844aa61755SAndy Ye TEEC_Context TeecContext; 19854aa61755SAndy Ye TEEC_Session TeecSession; 19864aa61755SAndy Ye uint32_t ErrorOrigin; 19874aa61755SAndy Ye TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6, 19884aa61755SAndy Ye { 0xa8, 0x69, 0x9c, 0xe6, 19894aa61755SAndy Ye 0x88, 0x6c, 0x5d, 0x5d 19904aa61755SAndy Ye } 19914aa61755SAndy Ye }; 19924aa61755SAndy Ye TEEC_UUID *TeecUuid = &tempuuid; 19934aa61755SAndy Ye TEEC_Operation TeecOperation = {0}; 19943251364cSHisping Lin struct blk_desc *dev_desc; 19953251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 19966651d4c0SJason Zhu if (!dev_desc) { 19976651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 19986651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 19996651d4c0SJason Zhu } 2000f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 2001f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 2002f4e1db95SHisping Lin return TeecResult; 20034aa61755SAndy Ye 20044aa61755SAndy Ye TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 2005f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 2006f4e1db95SHisping Lin return TeecResult; 20074aa61755SAndy Ye 20083251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 20093251364cSHisping Lin TEEC_NONE, 20103251364cSHisping Lin TEEC_NONE, 20113251364cSHisping Lin TEEC_NONE); 20123251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 2013b9a7e756SHisping Lin if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0) 2014b9a7e756SHisping Lin TeecOperation.params[0].value.a = 1; 2015b9a7e756SHisping Lin else 2016b9a7e756SHisping Lin TeecOperation.params[0].value.a = 0; 2017b9a7e756SHisping Lin 20183251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 20193251364cSHisping Lin TeecOperation.params[0].value.a = 0; 20203251364cSHisping Lin #endif 20213251364cSHisping Lin 20224aa61755SAndy Ye TeecResult = TEEC_OpenSession(&TeecContext, 20234aa61755SAndy Ye &TeecSession, 20244aa61755SAndy Ye TeecUuid, 20254aa61755SAndy Ye TEEC_LOGIN_PUBLIC, 20264aa61755SAndy Ye NULL, 20273251364cSHisping Lin &TeecOperation, 20284aa61755SAndy Ye &ErrorOrigin); 2029f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 2030f4e1db95SHisping Lin return TeecResult; 20314aa61755SAndy Ye 20324aa61755SAndy Ye TEEC_SharedMemory SharedMem0 = {0}; 20334aa61755SAndy Ye 20344aa61755SAndy Ye SharedMem0.size = *ca_response_size; 20354aa61755SAndy Ye SharedMem0.flags = 0; 20364aa61755SAndy Ye 20374aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 2038f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 2039f4e1db95SHisping Lin goto exit; 20404aa61755SAndy Ye 20414aa61755SAndy Ye memcpy(SharedMem0.buffer, ca_response, SharedMem0.size); 20424aa61755SAndy Ye 20434aa61755SAndy Ye TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 20444aa61755SAndy Ye TeecOperation.params[0].tmpref.size = SharedMem0.size; 20454aa61755SAndy Ye 20464aa61755SAndy Ye TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, 20474aa61755SAndy Ye TEEC_NONE, 20484aa61755SAndy Ye TEEC_NONE, 20494aa61755SAndy Ye TEEC_NONE); 20504aa61755SAndy Ye 20514aa61755SAndy Ye TeecResult = TEEC_InvokeCommand(&TeecSession, 20524aa61755SAndy Ye 146, 20534aa61755SAndy Ye &TeecOperation, 20544aa61755SAndy Ye &ErrorOrigin); 2055f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 2056f4e1db95SHisping Lin goto exit; 2057f4e1db95SHisping Lin exit: 20584aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem0); 20594aa61755SAndy Ye TEEC_CloseSession(&TeecSession); 2060f4e1db95SHisping Lin TEEC_FinalizeContext(&TeecContext); 20614aa61755SAndy Ye 20624aa61755SAndy Ye return TeecResult; 20634aa61755SAndy Ye } 2064