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 34*e8bc2655SHisping Lin #define STORAGE_CMD_OEM_HDCP_KEY_IS_WRITTEN 22 35ae8ec5e1SHisping Lin 362f8c34bdSxb.wang #define CRYPTO_SERVICE_CMD_OEM_OTP_KEY_PHYS_CIPHER 0x00000002 37fc3694d6Sxb.wang 38fc3694d6Sxb.wang #define RK_CRYPTO_SERVICE_UUID { 0x0cacdb5d, 0x4fea, 0x466c, \ 39fc3694d6Sxb.wang { 0x97, 0x16, 0x3d, 0x54, 0x16, 0x52, 0x83, 0x0f } } 40fc3694d6Sxb.wang 41ae8ec5e1SHisping Lin static uint8_t b2hs_add_base(uint8_t in) 42ae8ec5e1SHisping Lin { 43ae8ec5e1SHisping Lin if (in > 9) 44ae8ec5e1SHisping Lin return in + 55; 45ae8ec5e1SHisping Lin else 46ae8ec5e1SHisping Lin return in + 48; 47ae8ec5e1SHisping Lin } 48ae8ec5e1SHisping Lin 49c7de5349SHisping Lin static uint32_t b2hs(uint8_t *b, uint8_t *hs, uint32_t blen, uint32_t hslen) 50ae8ec5e1SHisping Lin { 51ae8ec5e1SHisping Lin uint32_t i = 0; 52ae8ec5e1SHisping Lin 53ae8ec5e1SHisping Lin if (blen * 2 + 1 > hslen) 54ae8ec5e1SHisping Lin return 0; 55ae8ec5e1SHisping Lin 56ae8ec5e1SHisping Lin for (; i < blen; i++) { 57ae8ec5e1SHisping Lin hs[i * 2 + 1] = b2hs_add_base(b[i] & 0xf); 58ae8ec5e1SHisping Lin hs[i * 2] = b2hs_add_base(b[i] >> 4); 59ae8ec5e1SHisping Lin } 60ae8ec5e1SHisping Lin hs[blen * 2] = 0; 61ae8ec5e1SHisping Lin 62ae8ec5e1SHisping Lin return blen * 2; 63ae8ec5e1SHisping Lin } 64ae8ec5e1SHisping Lin 652f8c34bdSxb.wang static void crypto_flush_cacheline(uint32_t addr, uint32_t size) 662f8c34bdSxb.wang { 672f8c34bdSxb.wang ulong alignment = CONFIG_SYS_CACHELINE_SIZE; 682f8c34bdSxb.wang ulong aligned_input, aligned_len; 692f8c34bdSxb.wang 702f8c34bdSxb.wang if (!addr || !size) 712f8c34bdSxb.wang return; 722f8c34bdSxb.wang 732f8c34bdSxb.wang /* Must flush dcache before crypto DMA fetch data region */ 742f8c34bdSxb.wang aligned_input = round_down(addr, alignment); 752f8c34bdSxb.wang aligned_len = round_up(size + (addr - aligned_input), alignment); 762f8c34bdSxb.wang flush_cache(aligned_input, aligned_len); 772f8c34bdSxb.wang } 782f8c34bdSxb.wang 79a900eef3SHisping Lin static void crypto_invalidate_cacheline(uint32_t addr, uint32_t size) 80a900eef3SHisping Lin { 81a900eef3SHisping Lin ulong alignment = CONFIG_SYS_CACHELINE_SIZE; 82a900eef3SHisping Lin ulong aligned_input, aligned_len; 83a900eef3SHisping Lin 84a900eef3SHisping Lin if (!addr || !size) 85a900eef3SHisping Lin return; 86a900eef3SHisping Lin 87a900eef3SHisping Lin /* Must invalidate dcache after crypto DMA write data region */ 88a900eef3SHisping Lin aligned_input = round_down(addr, alignment); 89a900eef3SHisping Lin aligned_len = round_up(size + (addr - aligned_input), alignment); 90a900eef3SHisping Lin invalidate_dcache_range(aligned_input, aligned_input + aligned_len); 91a900eef3SHisping Lin } 92a900eef3SHisping Lin 93c7de5349SHisping Lin static uint32_t trusty_base_write_security_data(char *filename, 94c7de5349SHisping Lin uint32_t filename_size, 95c7de5349SHisping Lin uint8_t *data, 96c7de5349SHisping Lin uint32_t data_size) 97ae8ec5e1SHisping Lin { 98ae8ec5e1SHisping Lin TEEC_Result TeecResult; 99ae8ec5e1SHisping Lin TEEC_Context TeecContext; 100ae8ec5e1SHisping Lin TEEC_Session TeecSession; 101ae8ec5e1SHisping Lin uint32_t ErrorOrigin; 102ae8ec5e1SHisping Lin TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 103ae8ec5e1SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 104ae8ec5e1SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 105ae8ec5e1SHisping Lin TEEC_Operation TeecOperation = {0}; 1063251364cSHisping Lin struct blk_desc *dev_desc; 1073251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 1086651d4c0SJason Zhu if (!dev_desc) { 1096651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 1106651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 1116651d4c0SJason Zhu } 1123251364cSHisping Lin 113f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 114f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 115f4e1db95SHisping Lin return TeecResult; 116ae8ec5e1SHisping Lin 117ae8ec5e1SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 118f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 119f4e1db95SHisping Lin return TeecResult; 120ae8ec5e1SHisping Lin 1213251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 1223251364cSHisping Lin TEEC_NONE, 1233251364cSHisping Lin TEEC_NONE, 1243251364cSHisping Lin TEEC_NONE); 1253251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 126b9a7e756SHisping Lin if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0) 127b9a7e756SHisping Lin TeecOperation.params[0].value.a = 1; 128b9a7e756SHisping Lin else 129b9a7e756SHisping Lin TeecOperation.params[0].value.a = 0; 1303251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 1313251364cSHisping Lin TeecOperation.params[0].value.a = 0; 1323251364cSHisping Lin #endif 1333251364cSHisping Lin 134ae8ec5e1SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 135ae8ec5e1SHisping Lin &TeecSession, 136ae8ec5e1SHisping Lin TeecUuid, 137ae8ec5e1SHisping Lin TEEC_LOGIN_PUBLIC, 138ae8ec5e1SHisping Lin NULL, 1393251364cSHisping Lin &TeecOperation, 140ae8ec5e1SHisping Lin &ErrorOrigin); 141f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 142f4e1db95SHisping Lin return TeecResult; 143ae8ec5e1SHisping Lin 144ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 145ae8ec5e1SHisping Lin 146c7de5349SHisping Lin SharedMem0.size = filename_size; 147ae8ec5e1SHisping Lin SharedMem0.flags = 0; 148ae8ec5e1SHisping Lin 149ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 150f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 151f4e1db95SHisping Lin goto exit; 152ae8ec5e1SHisping Lin 153c7de5349SHisping Lin memcpy(SharedMem0.buffer, filename, SharedMem0.size); 154ae8ec5e1SHisping Lin 155ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem1 = {0}; 156ae8ec5e1SHisping Lin 157c7de5349SHisping Lin SharedMem1.size = data_size; 158c7de5349SHisping Lin SharedMem1.flags = 0; 159c7de5349SHisping Lin 160c7de5349SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 161c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 162c7de5349SHisping Lin goto exit; 163c7de5349SHisping Lin 164c7de5349SHisping Lin memcpy(SharedMem1.buffer, data, SharedMem1.size); 165c7de5349SHisping Lin 166c7de5349SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 167c7de5349SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 168c7de5349SHisping Lin 169c7de5349SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 170c7de5349SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem1.size; 171c7de5349SHisping Lin 172c7de5349SHisping Lin 173c7de5349SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 174c7de5349SHisping Lin TEEC_MEMREF_TEMP_INOUT, 175c7de5349SHisping Lin TEEC_NONE, 176c7de5349SHisping Lin TEEC_NONE); 177c7de5349SHisping Lin 178c7de5349SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 179c7de5349SHisping Lin 1, 180c7de5349SHisping Lin &TeecOperation, 181c7de5349SHisping Lin &ErrorOrigin); 182c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 183c7de5349SHisping Lin goto exit; 184c7de5349SHisping Lin exit: 185c7de5349SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 186c7de5349SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem1); 187c7de5349SHisping Lin TEEC_CloseSession(&TeecSession); 188c7de5349SHisping Lin TEEC_FinalizeContext(&TeecContext); 189c7de5349SHisping Lin 190c7de5349SHisping Lin return TeecResult; 191c7de5349SHisping Lin } 192c7de5349SHisping Lin 193c7de5349SHisping Lin static uint32_t trusty_base_read_security_data(char *filename, 194c7de5349SHisping Lin uint32_t filename_size, 195c7de5349SHisping Lin uint8_t *data, 196c7de5349SHisping Lin uint32_t data_size) 197c7de5349SHisping Lin { 198c7de5349SHisping Lin TEEC_Result TeecResult; 199c7de5349SHisping Lin TEEC_Context TeecContext; 200c7de5349SHisping Lin TEEC_Session TeecSession; 201c7de5349SHisping Lin uint32_t ErrorOrigin; 202c7de5349SHisping Lin TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 203c7de5349SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 204c7de5349SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 205c7de5349SHisping Lin TEEC_Operation TeecOperation = {0}; 206c7de5349SHisping Lin 207c7de5349SHisping Lin struct blk_desc *dev_desc; 208c7de5349SHisping Lin dev_desc = rockchip_get_bootdev(); 209c7de5349SHisping Lin if (!dev_desc) { 210c7de5349SHisping Lin printf("%s: dev_desc is NULL!\n", __func__); 211c7de5349SHisping Lin return -TEEC_ERROR_GENERIC; 212c7de5349SHisping Lin } 213c7de5349SHisping Lin 214c7de5349SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 215c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 216c7de5349SHisping Lin return TeecResult; 217c7de5349SHisping Lin 218c7de5349SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 219c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 220c7de5349SHisping Lin return TeecResult; 221c7de5349SHisping Lin 222c7de5349SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 223c7de5349SHisping Lin TEEC_NONE, 224c7de5349SHisping Lin TEEC_NONE, 225c7de5349SHisping Lin TEEC_NONE); 226c7de5349SHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 227c7de5349SHisping Lin if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0) 228c7de5349SHisping Lin TeecOperation.params[0].value.a = 1; 229c7de5349SHisping Lin else 230c7de5349SHisping Lin TeecOperation.params[0].value.a = 0; 231c7de5349SHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 232c7de5349SHisping Lin TeecOperation.params[0].value.a = 0; 233c7de5349SHisping Lin #endif 234c7de5349SHisping Lin 235c7de5349SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 236c7de5349SHisping Lin &TeecSession, 237c7de5349SHisping Lin TeecUuid, 238c7de5349SHisping Lin TEEC_LOGIN_PUBLIC, 239c7de5349SHisping Lin NULL, 240c7de5349SHisping Lin &TeecOperation, 241c7de5349SHisping Lin &ErrorOrigin); 242c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 243c7de5349SHisping Lin return TeecResult; 244c7de5349SHisping Lin 245c7de5349SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 246c7de5349SHisping Lin 247c7de5349SHisping Lin SharedMem0.size = filename_size; 248c7de5349SHisping Lin SharedMem0.flags = 0; 249c7de5349SHisping Lin 250c7de5349SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 251c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 252c7de5349SHisping Lin goto exit; 253c7de5349SHisping Lin 254c7de5349SHisping Lin memcpy(SharedMem0.buffer, filename, SharedMem0.size); 255c7de5349SHisping Lin 256c7de5349SHisping Lin TEEC_SharedMemory SharedMem1 = {0}; 257c7de5349SHisping Lin 258c7de5349SHisping Lin SharedMem1.size = data_size; 259ae8ec5e1SHisping Lin SharedMem1.flags = 0; 260ae8ec5e1SHisping Lin 261ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 262f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 263f4e1db95SHisping Lin goto exit; 264ae8ec5e1SHisping Lin 265ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 266ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 267ae8ec5e1SHisping Lin 268ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 269ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem1.size; 270ae8ec5e1SHisping Lin 271ae8ec5e1SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 272ae8ec5e1SHisping Lin TEEC_MEMREF_TEMP_INOUT, 273ae8ec5e1SHisping Lin TEEC_NONE, 274ae8ec5e1SHisping Lin TEEC_NONE); 275ae8ec5e1SHisping Lin 276ae8ec5e1SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 277ae8ec5e1SHisping Lin 0, 278ae8ec5e1SHisping Lin &TeecOperation, 279ae8ec5e1SHisping Lin &ErrorOrigin); 28046b2a054SHisping Lin if (TeecResult == TEEC_SUCCESS) 281c7de5349SHisping Lin memcpy(data, SharedMem1.buffer, SharedMem1.size); 282f4e1db95SHisping Lin exit: 283ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 284ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem1); 285ae8ec5e1SHisping Lin TEEC_CloseSession(&TeecSession); 28646b2a054SHisping Lin TEEC_FinalizeContext(&TeecContext); 287ae8ec5e1SHisping Lin 288ae8ec5e1SHisping Lin return TeecResult; 289ae8ec5e1SHisping Lin } 290ae8ec5e1SHisping Lin 291c7de5349SHisping Lin static uint32_t trusty_base_end_security_data(void) 292c7de5349SHisping Lin { 293c7de5349SHisping Lin TEEC_Result TeecResult; 294c7de5349SHisping Lin TEEC_Context TeecContext; 295c7de5349SHisping Lin TEEC_Session TeecSession; 296c7de5349SHisping Lin uint32_t ErrorOrigin; 297c7de5349SHisping Lin TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 298c7de5349SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 299c7de5349SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 300c7de5349SHisping Lin TEEC_Operation TeecOperation = {0}; 301c7de5349SHisping Lin 302c7de5349SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 303c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 304c7de5349SHisping Lin return TeecResult; 305c7de5349SHisping Lin 306c7de5349SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 307c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 308c7de5349SHisping Lin return TeecResult; 309c7de5349SHisping Lin 310c7de5349SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 311c7de5349SHisping Lin &TeecSession, 312c7de5349SHisping Lin TeecUuid, 313c7de5349SHisping Lin TEEC_LOGIN_PUBLIC, 314c7de5349SHisping Lin NULL, 315c7de5349SHisping Lin NULL, 316c7de5349SHisping Lin &ErrorOrigin); 317c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 318c7de5349SHisping Lin return TeecResult; 319c7de5349SHisping Lin 320c7de5349SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE, 321c7de5349SHisping Lin TEEC_NONE, 322c7de5349SHisping Lin TEEC_NONE, 323c7de5349SHisping Lin TEEC_NONE); 324c7de5349SHisping Lin 325c7de5349SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 326c7de5349SHisping Lin 2, 327c7de5349SHisping Lin &TeecOperation, 328c7de5349SHisping Lin &ErrorOrigin); 329c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 330c7de5349SHisping Lin goto exit; 331c7de5349SHisping Lin exit: 332c7de5349SHisping Lin TEEC_CloseSession(&TeecSession); 333c7de5349SHisping Lin TEEC_FinalizeContext(&TeecContext); 334c7de5349SHisping Lin 335c7de5349SHisping Lin return TeecResult; 336c7de5349SHisping Lin } 337c7de5349SHisping Lin 33834f2e8f6SHisping Lin static void trusty_notify_always_use_security(void) 33934f2e8f6SHisping Lin { 34034f2e8f6SHisping Lin #if defined(CONFIG_OPTEE_V2) && defined(CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION) 34134f2e8f6SHisping Lin TEEC_Result TeecResult; 34234f2e8f6SHisping Lin TEEC_Context TeecContext; 34334f2e8f6SHisping Lin TEEC_Session TeecSession; 34434f2e8f6SHisping Lin uint32_t ErrorOrigin; 34534f2e8f6SHisping Lin TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 34634f2e8f6SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 34734f2e8f6SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 34834f2e8f6SHisping Lin TEEC_Operation TeecOperation = {0}; 34934f2e8f6SHisping Lin 35034f2e8f6SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 35134f2e8f6SHisping Lin if (TeecResult != TEEC_SUCCESS) 35234f2e8f6SHisping Lin return; 35334f2e8f6SHisping Lin 35434f2e8f6SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 35534f2e8f6SHisping Lin if (TeecResult != TEEC_SUCCESS) 35634f2e8f6SHisping Lin return; 35734f2e8f6SHisping Lin 35834f2e8f6SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 35934f2e8f6SHisping Lin &TeecSession, 36034f2e8f6SHisping Lin TeecUuid, 36134f2e8f6SHisping Lin TEEC_LOGIN_PUBLIC, 36234f2e8f6SHisping Lin NULL, 36334f2e8f6SHisping Lin NULL, 36434f2e8f6SHisping Lin &ErrorOrigin); 36534f2e8f6SHisping Lin if (TeecResult != TEEC_SUCCESS) 36634f2e8f6SHisping Lin return; 36734f2e8f6SHisping Lin 36834f2e8f6SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE, 36934f2e8f6SHisping Lin TEEC_NONE, 37034f2e8f6SHisping Lin TEEC_NONE, 37134f2e8f6SHisping Lin TEEC_NONE); 37234f2e8f6SHisping Lin 37334f2e8f6SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 37434f2e8f6SHisping Lin 9, 37534f2e8f6SHisping Lin &TeecOperation, 37634f2e8f6SHisping Lin &ErrorOrigin); 37734f2e8f6SHisping Lin if (TeecResult != TEEC_SUCCESS) 37834f2e8f6SHisping Lin debug("notify always use security fail! please update optee!"); 37934f2e8f6SHisping Lin 38034f2e8f6SHisping Lin TEEC_CloseSession(&TeecSession); 38134f2e8f6SHisping Lin TEEC_FinalizeContext(&TeecContext); 38234f2e8f6SHisping Lin 38334f2e8f6SHisping Lin return; 38434f2e8f6SHisping Lin #endif 38534f2e8f6SHisping Lin } 38634f2e8f6SHisping Lin 387c7de5349SHisping Lin uint32_t trusty_read_rollback_index(uint32_t slot, uint64_t *value) 388c7de5349SHisping Lin { 389c7de5349SHisping Lin char hs[9]; 390c7de5349SHisping Lin 391c7de5349SHisping Lin b2hs((uint8_t *)&slot, (uint8_t *)hs, 4, 9); 392c7de5349SHisping Lin 393c7de5349SHisping Lin return trusty_base_read_security_data(hs, 8, (uint8_t *)value, 8); 394c7de5349SHisping Lin } 395c7de5349SHisping Lin 396ae8ec5e1SHisping Lin uint32_t trusty_write_rollback_index(uint32_t slot, uint64_t value) 397ae8ec5e1SHisping Lin { 398c7de5349SHisping Lin char hs[9]; 3993251364cSHisping Lin 400c7de5349SHisping Lin b2hs((uint8_t *)&slot, (uint8_t *)hs, 4, 9); 401ae8ec5e1SHisping Lin 402c7de5349SHisping Lin return trusty_base_write_security_data(hs, 8, (uint8_t *)&value, 8); 403ae8ec5e1SHisping Lin } 404ae8ec5e1SHisping Lin 405ae8ec5e1SHisping Lin uint32_t trusty_read_permanent_attributes(uint8_t *attributes, uint32_t size) 406ae8ec5e1SHisping Lin { 407c7de5349SHisping Lin return trusty_base_read_security_data("attributes", 408c7de5349SHisping Lin sizeof("attributes"), attributes, size); 409ae8ec5e1SHisping Lin } 410ae8ec5e1SHisping Lin 411ae8ec5e1SHisping Lin uint32_t trusty_write_permanent_attributes(uint8_t *attributes, uint32_t size) 412ae8ec5e1SHisping Lin { 413c7de5349SHisping Lin return trusty_base_write_security_data("attributes", 414c7de5349SHisping Lin sizeof("attributes"), attributes, size); 4156651d4c0SJason Zhu } 416ae8ec5e1SHisping Lin 417c7de5349SHisping Lin uint32_t trusty_read_permanent_attributes_flag(uint8_t *attributes) 418c7de5349SHisping Lin { 419c7de5349SHisping Lin return trusty_base_read_security_data("attributes_flag", 420c7de5349SHisping Lin sizeof("attributes_flag"), attributes, 1); 421c7de5349SHisping Lin } 422ae8ec5e1SHisping Lin 423c7de5349SHisping Lin uint32_t trusty_write_permanent_attributes_flag(uint8_t attributes) 424c7de5349SHisping Lin { 425c7de5349SHisping Lin return trusty_base_write_security_data("attributes_flag", 426c7de5349SHisping Lin sizeof("attributes_flag"), &attributes, 1); 427ae8ec5e1SHisping Lin } 428ae8ec5e1SHisping Lin 429564654ebSJason Zhu uint32_t trusty_read_permanent_attributes_cer(uint8_t *attributes, 430564654ebSJason Zhu uint32_t size) 431564654ebSJason Zhu { 432c7de5349SHisping Lin return trusty_base_read_security_data("rsacer", 433c7de5349SHisping Lin sizeof("rsacer"), attributes, size); 434564654ebSJason Zhu } 435564654ebSJason Zhu 436564654ebSJason Zhu uint32_t trusty_write_permanent_attributes_cer(uint8_t *attributes, 437564654ebSJason Zhu uint32_t size) 438564654ebSJason Zhu { 439c7de5349SHisping Lin return trusty_base_write_security_data("rsacer", 440c7de5349SHisping Lin sizeof("rsacer"), attributes, size); 441564654ebSJason Zhu } 442564654ebSJason Zhu 443ae8ec5e1SHisping Lin uint32_t trusty_read_lock_state(uint8_t *lock_state) 444ae8ec5e1SHisping Lin { 445c7de5349SHisping Lin return trusty_base_read_security_data("lock_state", 446c7de5349SHisping Lin sizeof("lock_state"), lock_state, 1); 447ae8ec5e1SHisping Lin } 448ae8ec5e1SHisping Lin 449ae8ec5e1SHisping Lin uint32_t trusty_write_lock_state(uint8_t lock_state) 450ae8ec5e1SHisping Lin { 451c7de5349SHisping Lin return trusty_base_write_security_data("lock_state", 452c7de5349SHisping Lin sizeof("lock_state"), &lock_state, 1); 453ae8ec5e1SHisping Lin } 454ae8ec5e1SHisping Lin 455ae8ec5e1SHisping Lin uint32_t trusty_read_flash_lock_state(uint8_t *flash_lock_state) 456ae8ec5e1SHisping Lin { 457c7de5349SHisping Lin return trusty_base_read_security_data("flash_lock_state", 458c7de5349SHisping Lin sizeof("flash_lock_state"), flash_lock_state, 1); 459c7de5349SHisping Lin } 460c7de5349SHisping Lin 461c7de5349SHisping Lin uint32_t trusty_write_flash_lock_state(uint8_t flash_lock_state) 462c7de5349SHisping Lin { 463c7de5349SHisping Lin return trusty_base_write_security_data("flash_lock_state", 464c7de5349SHisping Lin sizeof("flash_lock_state"), &flash_lock_state, 1); 465c7de5349SHisping Lin } 466c7de5349SHisping Lin 467c7de5349SHisping Lin static uint32_t trusty_base_end_efuse_or_otp(void) 468c7de5349SHisping Lin { 469ae8ec5e1SHisping Lin TEEC_Result TeecResult; 470ae8ec5e1SHisping Lin TEEC_Context TeecContext; 471ae8ec5e1SHisping Lin TEEC_Session TeecSession; 472ae8ec5e1SHisping Lin uint32_t ErrorOrigin; 473c7de5349SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 474c7de5349SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 475c7de5349SHisping Lin 476ae8ec5e1SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 477ae8ec5e1SHisping Lin TEEC_Operation TeecOperation = {0}; 478ae8ec5e1SHisping Lin 479f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 480f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 481f4e1db95SHisping Lin return TeecResult; 482ae8ec5e1SHisping Lin 483ae8ec5e1SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 484f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 485f4e1db95SHisping Lin return TeecResult; 486ae8ec5e1SHisping Lin 487ae8ec5e1SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 488ae8ec5e1SHisping Lin &TeecSession, 489ae8ec5e1SHisping Lin TeecUuid, 490ae8ec5e1SHisping Lin TEEC_LOGIN_PUBLIC, 491ae8ec5e1SHisping Lin NULL, 492c7de5349SHisping Lin NULL, 493ae8ec5e1SHisping Lin &ErrorOrigin); 494f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 495f4e1db95SHisping Lin return TeecResult; 496ae8ec5e1SHisping Lin 497c7de5349SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE, 498c7de5349SHisping Lin TEEC_NONE, 499ae8ec5e1SHisping Lin TEEC_NONE, 500ae8ec5e1SHisping Lin TEEC_NONE); 501ae8ec5e1SHisping Lin 502ae8ec5e1SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 503c7de5349SHisping Lin STORAGE_CMD_UBOOT_END_OTP, 504ae8ec5e1SHisping Lin &TeecOperation, 505ae8ec5e1SHisping Lin &ErrorOrigin); 506c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 507c7de5349SHisping Lin goto exit; 508f4e1db95SHisping Lin exit: 509ae8ec5e1SHisping Lin TEEC_CloseSession(&TeecSession); 51046b2a054SHisping Lin TEEC_FinalizeContext(&TeecContext); 511ae8ec5e1SHisping Lin 512ae8ec5e1SHisping Lin return TeecResult; 513ae8ec5e1SHisping Lin } 514ae8ec5e1SHisping Lin 515c7de5349SHisping Lin static uint32_t trusty_base_efuse_or_otp_operation(uint32_t cmd, 516c7de5349SHisping Lin uint8_t is_write, 517c7de5349SHisping Lin uint32_t *buf, 518c7de5349SHisping Lin uint32_t length) 519ae8ec5e1SHisping Lin { 520ae8ec5e1SHisping Lin TEEC_Result TeecResult; 521ae8ec5e1SHisping Lin TEEC_Context TeecContext; 522ae8ec5e1SHisping Lin TEEC_Session TeecSession; 523ae8ec5e1SHisping Lin uint32_t ErrorOrigin; 524c7de5349SHisping Lin 525c7de5349SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 526c7de5349SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 527ae8ec5e1SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 528ae8ec5e1SHisping Lin TEEC_Operation TeecOperation = {0}; 529ae8ec5e1SHisping Lin 530f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 531f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 532f4e1db95SHisping Lin return TeecResult; 533ae8ec5e1SHisping Lin 534ae8ec5e1SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 535f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 536f4e1db95SHisping Lin return TeecResult; 537ae8ec5e1SHisping Lin 538ae8ec5e1SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 539ae8ec5e1SHisping Lin &TeecSession, 540ae8ec5e1SHisping Lin TeecUuid, 541ae8ec5e1SHisping Lin TEEC_LOGIN_PUBLIC, 542ae8ec5e1SHisping Lin NULL, 543c7de5349SHisping Lin NULL, 544ae8ec5e1SHisping Lin &ErrorOrigin); 545f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 546f4e1db95SHisping Lin return TeecResult; 547ae8ec5e1SHisping Lin 548ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 549ae8ec5e1SHisping Lin 550c7de5349SHisping Lin SharedMem0.size = length * sizeof(uint32_t); 551ae8ec5e1SHisping Lin SharedMem0.flags = 0; 552ae8ec5e1SHisping Lin 553ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 554f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 555f4e1db95SHisping Lin goto exit; 556ae8ec5e1SHisping Lin 557ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 558ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 559ae8ec5e1SHisping Lin 560c7de5349SHisping Lin if (is_write) { 561c7de5349SHisping Lin memcpy(SharedMem0.buffer, buf, SharedMem0.size); 562ae8ec5e1SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 563c7de5349SHisping Lin TEEC_NONE, 564ae8ec5e1SHisping Lin TEEC_NONE, 565ae8ec5e1SHisping Lin TEEC_NONE); 566ae8ec5e1SHisping Lin 567c7de5349SHisping Lin } else { 568c7de5349SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT, 569c7de5349SHisping Lin TEEC_NONE, 570c7de5349SHisping Lin TEEC_NONE, 571c7de5349SHisping Lin TEEC_NONE); 572c7de5349SHisping Lin } 573c7de5349SHisping Lin 574ae8ec5e1SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 575c7de5349SHisping Lin cmd, 576ae8ec5e1SHisping Lin &TeecOperation, 577ae8ec5e1SHisping Lin &ErrorOrigin); 578f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 579f4e1db95SHisping Lin goto exit; 580c7de5349SHisping Lin 581c7de5349SHisping Lin if (!is_write) 582c7de5349SHisping Lin memcpy(buf, SharedMem0.buffer, SharedMem0.size); 583c7de5349SHisping Lin 584f4e1db95SHisping Lin exit: 585ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 586ae8ec5e1SHisping Lin TEEC_CloseSession(&TeecSession); 58746b2a054SHisping Lin TEEC_FinalizeContext(&TeecContext); 588ae8ec5e1SHisping Lin 589ae8ec5e1SHisping Lin return TeecResult; 590ae8ec5e1SHisping Lin } 591ae8ec5e1SHisping Lin 5926ef445a4SHisping Lin uint32_t trusty_read_attribute_hash(uint32_t *buf, uint32_t length) 5936ef445a4SHisping Lin { 594c7de5349SHisping Lin return trusty_base_efuse_or_otp_operation(STORAGE_CMD_READ_ATTRIBUTE_HASH, 595c7de5349SHisping Lin false, buf, length); 5966ef445a4SHisping Lin } 5976ef445a4SHisping Lin 5986ef445a4SHisping Lin uint32_t trusty_write_attribute_hash(uint32_t *buf, uint32_t length) 5996ef445a4SHisping Lin { 600c7de5349SHisping Lin return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_ATTRIBUTE_HASH, 601c7de5349SHisping Lin true, buf, length); 60216539616SHisping Lin } 60316539616SHisping Lin 60416539616SHisping Lin uint32_t trusty_notify_optee_uboot_end(void) 60516539616SHisping Lin { 60616539616SHisping Lin TEEC_Result res; 607c7de5349SHisping Lin 608c7de5349SHisping Lin res = trusty_base_end_security_data(); 609c7de5349SHisping Lin res |= trusty_base_end_efuse_or_otp(); 61016539616SHisping Lin return res; 61116539616SHisping Lin } 6122cd27853SHisping Lin 6132cd27853SHisping Lin uint32_t trusty_read_vbootkey_hash(uint32_t *buf, uint32_t length) 6142cd27853SHisping Lin { 615c7de5349SHisping Lin return trusty_base_efuse_or_otp_operation(STORAGE_CMD_READ_VBOOTKEY_HASH, 616c7de5349SHisping Lin false, buf, length); 6172cd27853SHisping Lin } 618c7de5349SHisping Lin 6192cd27853SHisping Lin uint32_t trusty_write_vbootkey_hash(uint32_t *buf, uint32_t length) 6202cd27853SHisping Lin { 621c7de5349SHisping Lin return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_VBOOTKEY_HASH, 622c7de5349SHisping Lin true, buf, length); 6232cd27853SHisping Lin } 624095e2a82SHisping Lin 625468df3b2SHisping Lin uint32_t trusty_read_vbootkey_enable_flag(uint8_t *flag) 626468df3b2SHisping Lin { 627468df3b2SHisping Lin uint32_t bootflag; 628c7de5349SHisping Lin TEEC_Result TeecResult; 629468df3b2SHisping Lin 630f07e1686SHisping Lin *flag = 0; 631f07e1686SHisping Lin 632c7de5349SHisping Lin TeecResult = trusty_base_efuse_or_otp_operation(STORAGE_CMD_READ_ENABLE_FLAG, 633c7de5349SHisping Lin false, &bootflag, 1); 634468df3b2SHisping Lin 635468df3b2SHisping Lin if (TeecResult == TEEC_SUCCESS) { 6360202ee8aSHisping Lin #if defined(CONFIG_ROCKCHIP_RK3288) 6370202ee8aSHisping Lin if (bootflag == 0x00000001) 6380202ee8aSHisping Lin *flag = 1; 6390202ee8aSHisping Lin #else 640468df3b2SHisping Lin if (bootflag == 0x000000FF) 641468df3b2SHisping Lin *flag = 1; 6420202ee8aSHisping Lin #endif 643468df3b2SHisping Lin } 644095e2a82SHisping Lin return TeecResult; 645095e2a82SHisping Lin } 6464aa61755SAndy Ye 6471ef63c75SHisping Lin uint32_t trusty_write_ta_encryption_key(uint32_t *buf, uint32_t length) 6481ef63c75SHisping Lin { 6491ef63c75SHisping Lin return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_TA_ENCRYPTION_KEY, 6501ef63c75SHisping Lin true, buf, length); 6511ef63c75SHisping Lin } 6521ef63c75SHisping Lin 65310f41197SHisping Lin uint32_t trusty_ta_encryption_key_is_written(uint8_t *value) 65410f41197SHisping Lin { 65510f41197SHisping Lin TEEC_Result TeecResult; 65610f41197SHisping Lin TEEC_Context TeecContext; 65710f41197SHisping Lin TEEC_Session TeecSession; 65810f41197SHisping Lin uint32_t ErrorOrigin; 65910f41197SHisping Lin 66010f41197SHisping Lin *value = 0; 66110f41197SHisping Lin 66210f41197SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 66310f41197SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 66410f41197SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 66510f41197SHisping Lin TEEC_Operation TeecOperation = {0}; 66610f41197SHisping Lin 66710f41197SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 66810f41197SHisping Lin if (TeecResult != TEEC_SUCCESS) 66910f41197SHisping Lin return TeecResult; 67010f41197SHisping Lin 67110f41197SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 67210f41197SHisping Lin if (TeecResult != TEEC_SUCCESS) 67310f41197SHisping Lin return TeecResult; 67410f41197SHisping Lin 67510f41197SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 67610f41197SHisping Lin &TeecSession, 67710f41197SHisping Lin TeecUuid, 67810f41197SHisping Lin TEEC_LOGIN_PUBLIC, 67910f41197SHisping Lin NULL, 68010f41197SHisping Lin NULL, 68110f41197SHisping Lin &ErrorOrigin); 68210f41197SHisping Lin if (TeecResult != TEEC_SUCCESS) 68310f41197SHisping Lin return TeecResult; 68410f41197SHisping Lin 68510f41197SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_OUTPUT, 68610f41197SHisping Lin TEEC_NONE, 68710f41197SHisping Lin TEEC_NONE, 68810f41197SHisping Lin TEEC_NONE); 68910f41197SHisping Lin 69010f41197SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 69110f41197SHisping Lin STORAGE_CMD_TA_ENCRYPTION_KEY_IS_WRITTEN, 69210f41197SHisping Lin &TeecOperation, 69310f41197SHisping Lin &ErrorOrigin); 69410f41197SHisping Lin if (TeecResult == TEEC_SUCCESS) 69510f41197SHisping Lin *value = TeecOperation.params[0].value.a; 69610f41197SHisping Lin 69710f41197SHisping Lin TEEC_CloseSession(&TeecSession); 69810f41197SHisping Lin TEEC_FinalizeContext(&TeecContext); 69910f41197SHisping Lin 70010f41197SHisping Lin return TeecResult; 70110f41197SHisping Lin } 70210f41197SHisping Lin 703fbf29bfbSHisping Lin uint32_t trusty_check_security_level_flag(uint8_t flag) 704fbf29bfbSHisping Lin { 705fbf29bfbSHisping Lin uint32_t levelflag; 706fbf29bfbSHisping Lin 707fbf29bfbSHisping Lin levelflag = flag; 708fbf29bfbSHisping Lin return trusty_base_efuse_or_otp_operation(STORAGE_CMD_CHECK_SECURITY_LEVEL_FLAG, 709fbf29bfbSHisping Lin true, &levelflag, 1); 710fbf29bfbSHisping Lin } 711fbf29bfbSHisping Lin 712f39d4289SHisping Lin uint32_t trusty_write_oem_huk(uint32_t *buf, uint32_t length) 713f39d4289SHisping Lin { 714f39d4289SHisping Lin return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_OEM_HUK, 715f39d4289SHisping Lin true, buf, length); 716f39d4289SHisping Lin } 717f39d4289SHisping Lin 71834f2e8f6SHisping Lin static void trusty_select_security_level(void) 7197504da74SHisping Lin { 7207504da74SHisping Lin #if (CONFIG_OPTEE_SECURITY_LEVEL > 0) 7217504da74SHisping Lin TEEC_Result TeecResult; 7227504da74SHisping Lin 7237504da74SHisping Lin TeecResult = trusty_check_security_level_flag(CONFIG_OPTEE_SECURITY_LEVEL); 7247504da74SHisping Lin if (TeecResult == TEE_ERROR_CANCEL) { 7257504da74SHisping Lin run_command("download", 0); 7267504da74SHisping Lin return; 7277504da74SHisping Lin } 7287504da74SHisping Lin 7297504da74SHisping Lin if (TeecResult == TEEC_SUCCESS) 7307504da74SHisping Lin debug("optee select security level success!"); 7317504da74SHisping Lin else 7327504da74SHisping Lin panic("optee select security level fail!"); 7337504da74SHisping Lin 7347504da74SHisping Lin return; 7357504da74SHisping Lin #endif 7367504da74SHisping Lin } 7377504da74SHisping Lin 73851ac7005SHisping Lin void optee_client_init(void) 73951ac7005SHisping Lin { 74051ac7005SHisping Lin trusty_select_security_level(); 74134f2e8f6SHisping Lin trusty_notify_always_use_security(); 74251ac7005SHisping Lin } 74351ac7005SHisping Lin 744d5913350SHisping Lin uint32_t trusty_write_oem_ns_otp(uint32_t byte_off, uint8_t *byte_buf, uint32_t byte_len) 745d5913350SHisping Lin { 746d5913350SHisping Lin TEEC_Result TeecResult; 747d5913350SHisping Lin TEEC_Context TeecContext; 748d5913350SHisping Lin TEEC_Session TeecSession; 749d5913350SHisping Lin uint32_t ErrorOrigin; 750d5913350SHisping Lin 751d5913350SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 752d5913350SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 753d5913350SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 754d5913350SHisping Lin TEEC_Operation TeecOperation = {0}; 755d5913350SHisping Lin 756d5913350SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 757d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 758d5913350SHisping Lin return TeecResult; 759d5913350SHisping Lin 760d5913350SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 761d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 762d5913350SHisping Lin return TeecResult; 763d5913350SHisping Lin 764d5913350SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 765d5913350SHisping Lin &TeecSession, 766d5913350SHisping Lin TeecUuid, 767d5913350SHisping Lin TEEC_LOGIN_PUBLIC, 768d5913350SHisping Lin NULL, 769d5913350SHisping Lin NULL, 770d5913350SHisping Lin &ErrorOrigin); 771d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 772d5913350SHisping Lin return TeecResult; 773d5913350SHisping Lin 774d5913350SHisping Lin TeecOperation.params[0].value.a = byte_off; 775d5913350SHisping Lin 776d5913350SHisping Lin TEEC_SharedMemory SharedMem = {0}; 777d5913350SHisping Lin 778d5913350SHisping Lin SharedMem.size = byte_len; 779d5913350SHisping Lin SharedMem.flags = 0; 780d5913350SHisping Lin 781d5913350SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem); 782d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 783d5913350SHisping Lin goto exit; 784d5913350SHisping Lin 785d5913350SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem.buffer; 786d5913350SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem.size; 787d5913350SHisping Lin 788d5913350SHisping Lin memcpy(SharedMem.buffer, byte_buf, SharedMem.size); 789d5913350SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 790d5913350SHisping Lin TEEC_MEMREF_TEMP_INPUT, 791d5913350SHisping Lin TEEC_NONE, 792d5913350SHisping Lin TEEC_NONE); 793d5913350SHisping Lin 794d5913350SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 795d5913350SHisping Lin STORAGE_CMD_WRITE_OEM_NS_OTP, 796d5913350SHisping Lin &TeecOperation, 797d5913350SHisping Lin &ErrorOrigin); 798d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 799d5913350SHisping Lin goto exit; 800d5913350SHisping Lin 801d5913350SHisping Lin exit: 802d5913350SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem); 803d5913350SHisping Lin TEEC_CloseSession(&TeecSession); 804d5913350SHisping Lin TEEC_FinalizeContext(&TeecContext); 805d5913350SHisping Lin 806d5913350SHisping Lin return TeecResult; 807d5913350SHisping Lin } 808d5913350SHisping Lin 809d5913350SHisping Lin uint32_t trusty_read_oem_ns_otp(uint32_t byte_off, uint8_t *byte_buf, uint32_t byte_len) 810d5913350SHisping Lin { 811d5913350SHisping Lin TEEC_Result TeecResult; 812d5913350SHisping Lin TEEC_Context TeecContext; 813d5913350SHisping Lin TEEC_Session TeecSession; 814d5913350SHisping Lin uint32_t ErrorOrigin; 815d5913350SHisping Lin 816d5913350SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 817d5913350SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 818d5913350SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 819d5913350SHisping Lin TEEC_Operation TeecOperation = {0}; 820d5913350SHisping Lin 821d5913350SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 822d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 823d5913350SHisping Lin return TeecResult; 824d5913350SHisping Lin 825d5913350SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 826d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 827d5913350SHisping Lin return TeecResult; 828d5913350SHisping Lin 829d5913350SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 830d5913350SHisping Lin &TeecSession, 831d5913350SHisping Lin TeecUuid, 832d5913350SHisping Lin TEEC_LOGIN_PUBLIC, 833d5913350SHisping Lin NULL, 834d5913350SHisping Lin NULL, 835d5913350SHisping Lin &ErrorOrigin); 836d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 837d5913350SHisping Lin return TeecResult; 838d5913350SHisping Lin 839d5913350SHisping Lin TeecOperation.params[0].value.a = byte_off; 840d5913350SHisping Lin 841d5913350SHisping Lin TEEC_SharedMemory SharedMem = {0}; 842d5913350SHisping Lin 843d5913350SHisping Lin SharedMem.size = byte_len; 844d5913350SHisping Lin SharedMem.flags = 0; 845d5913350SHisping Lin 846d5913350SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem); 847d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 848d5913350SHisping Lin goto exit; 849d5913350SHisping Lin 850d5913350SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem.buffer; 851d5913350SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem.size; 852d5913350SHisping Lin 853d5913350SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 854d5913350SHisping Lin TEEC_MEMREF_TEMP_OUTPUT, 855d5913350SHisping Lin TEEC_NONE, 856d5913350SHisping Lin TEEC_NONE); 857d5913350SHisping Lin 858d5913350SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 859d5913350SHisping Lin STORAGE_CMD_READ_OEM_NS_OTP, 860d5913350SHisping Lin &TeecOperation, 861d5913350SHisping Lin &ErrorOrigin); 862d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 863d5913350SHisping Lin goto exit; 864d5913350SHisping Lin 865d5913350SHisping Lin memcpy(byte_buf, SharedMem.buffer, SharedMem.size); 866d5913350SHisping Lin 867d5913350SHisping Lin exit: 868d5913350SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem); 869d5913350SHisping Lin TEEC_CloseSession(&TeecSession); 870d5913350SHisping Lin TEEC_FinalizeContext(&TeecContext); 871d5913350SHisping Lin 872d5913350SHisping Lin return TeecResult; 873d5913350SHisping Lin } 874d5913350SHisping Lin 87590e849a0Sxb.wang uint32_t trusty_write_oem_otp_key(enum RK_OEM_OTP_KEYID key_id, 876bb1ba6acSHisping Lin uint8_t *byte_buf, uint32_t byte_len) 877bb1ba6acSHisping Lin { 878bb1ba6acSHisping Lin TEEC_Result TeecResult; 879bb1ba6acSHisping Lin TEEC_Context TeecContext; 880bb1ba6acSHisping Lin TEEC_Session TeecSession; 881bb1ba6acSHisping Lin uint32_t ErrorOrigin; 882bb1ba6acSHisping Lin 883bb1ba6acSHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 884bb1ba6acSHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 885bb1ba6acSHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 886bb1ba6acSHisping Lin TEEC_Operation TeecOperation = {0}; 887bb1ba6acSHisping Lin 888bb1ba6acSHisping Lin TeecResult = OpteeClientApiLibInitialize(); 889bb1ba6acSHisping Lin if (TeecResult != TEEC_SUCCESS) 890bb1ba6acSHisping Lin return TeecResult; 891bb1ba6acSHisping Lin 892bb1ba6acSHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 893bb1ba6acSHisping Lin if (TeecResult != TEEC_SUCCESS) 894bb1ba6acSHisping Lin return TeecResult; 895bb1ba6acSHisping Lin 896bb1ba6acSHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 897bb1ba6acSHisping Lin &TeecSession, 898bb1ba6acSHisping Lin TeecUuid, 899bb1ba6acSHisping Lin TEEC_LOGIN_PUBLIC, 900bb1ba6acSHisping Lin NULL, 901bb1ba6acSHisping Lin NULL, 902bb1ba6acSHisping Lin &ErrorOrigin); 903bb1ba6acSHisping Lin if (TeecResult != TEEC_SUCCESS) 904bb1ba6acSHisping Lin return TeecResult; 905bb1ba6acSHisping Lin 906bb1ba6acSHisping Lin TeecOperation.params[0].value.a = key_id; 907bb1ba6acSHisping Lin 908bb1ba6acSHisping Lin TEEC_SharedMemory SharedMem = {0}; 909bb1ba6acSHisping Lin 910bb1ba6acSHisping Lin SharedMem.size = byte_len; 911bb1ba6acSHisping Lin SharedMem.flags = 0; 912bb1ba6acSHisping Lin 913bb1ba6acSHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem); 914bb1ba6acSHisping Lin if (TeecResult != TEEC_SUCCESS) 915bb1ba6acSHisping Lin goto exit; 916bb1ba6acSHisping Lin 917bb1ba6acSHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem.buffer; 918bb1ba6acSHisping Lin TeecOperation.params[1].tmpref.size = SharedMem.size; 919bb1ba6acSHisping Lin 920bb1ba6acSHisping Lin memcpy(SharedMem.buffer, byte_buf, SharedMem.size); 921bb1ba6acSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 922bb1ba6acSHisping Lin TEEC_MEMREF_TEMP_INPUT, 923bb1ba6acSHisping Lin TEEC_NONE, 924bb1ba6acSHisping Lin TEEC_NONE); 925bb1ba6acSHisping Lin 926bb1ba6acSHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 92790e849a0Sxb.wang STORAGE_CMD_WRITE_OEM_OTP_KEY, 928bb1ba6acSHisping Lin &TeecOperation, 929bb1ba6acSHisping Lin &ErrorOrigin); 930bb1ba6acSHisping Lin if (TeecResult != TEEC_SUCCESS) 931bb1ba6acSHisping Lin goto exit; 932bb1ba6acSHisping Lin 933bb1ba6acSHisping Lin exit: 934bb1ba6acSHisping Lin TEEC_ReleaseSharedMemory(&SharedMem); 935bb1ba6acSHisping Lin TEEC_CloseSession(&TeecSession); 936bb1ba6acSHisping Lin TEEC_FinalizeContext(&TeecContext); 937bb1ba6acSHisping Lin 938bb1ba6acSHisping Lin return TeecResult; 939bb1ba6acSHisping Lin } 940bb1ba6acSHisping Lin 9419deb34f6SHisping Lin uint32_t trusty_oem_otp_key_is_written(enum RK_OEM_OTP_KEYID key_id, uint8_t *value) 9429deb34f6SHisping Lin { 9439deb34f6SHisping Lin TEEC_Result TeecResult; 9449deb34f6SHisping Lin TEEC_Context TeecContext; 9459deb34f6SHisping Lin TEEC_Session TeecSession; 9469deb34f6SHisping Lin uint32_t ErrorOrigin; 9479deb34f6SHisping Lin 9489deb34f6SHisping Lin *value = 0xFF; 9499deb34f6SHisping Lin 9509deb34f6SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 9519deb34f6SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 9529deb34f6SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 9539deb34f6SHisping Lin TEEC_Operation TeecOperation = {0}; 9549deb34f6SHisping Lin 9559deb34f6SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 9569deb34f6SHisping Lin if (TeecResult != TEEC_SUCCESS) 9579deb34f6SHisping Lin return TeecResult; 9589deb34f6SHisping Lin 9599deb34f6SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 9609deb34f6SHisping Lin if (TeecResult != TEEC_SUCCESS) 9619deb34f6SHisping Lin return TeecResult; 9629deb34f6SHisping Lin 9639deb34f6SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 9649deb34f6SHisping Lin &TeecSession, 9659deb34f6SHisping Lin TeecUuid, 9669deb34f6SHisping Lin TEEC_LOGIN_PUBLIC, 9679deb34f6SHisping Lin NULL, 9689deb34f6SHisping Lin NULL, 9699deb34f6SHisping Lin &ErrorOrigin); 9709deb34f6SHisping Lin if (TeecResult != TEEC_SUCCESS) 9719deb34f6SHisping Lin return TeecResult; 9729deb34f6SHisping Lin 9739deb34f6SHisping Lin TeecOperation.params[0].value.a = key_id; 9749deb34f6SHisping Lin 9759deb34f6SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INOUT, 9769deb34f6SHisping Lin TEEC_NONE, 9779deb34f6SHisping Lin TEEC_NONE, 9789deb34f6SHisping Lin TEEC_NONE); 9799deb34f6SHisping Lin 9809deb34f6SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 9819deb34f6SHisping Lin STORAGE_CMD_OEM_OTP_KEY_IS_WRITTEN, 9829deb34f6SHisping Lin &TeecOperation, 9839deb34f6SHisping Lin &ErrorOrigin); 9849deb34f6SHisping Lin if (TeecResult == TEEC_SUCCESS) 9859deb34f6SHisping Lin *value = TeecOperation.params[0].value.b; 9869deb34f6SHisping Lin 9879deb34f6SHisping Lin TEEC_CloseSession(&TeecSession); 9889deb34f6SHisping Lin TEEC_FinalizeContext(&TeecContext); 9899deb34f6SHisping Lin 9909deb34f6SHisping Lin return TeecResult; 9919deb34f6SHisping Lin } 9929deb34f6SHisping Lin 99390e849a0Sxb.wang uint32_t trusty_set_oem_hr_otp_read_lock(enum RK_OEM_OTP_KEYID key_id) 994a405238aSHisping Lin { 995a405238aSHisping Lin TEEC_Result TeecResult; 996a405238aSHisping Lin TEEC_Context TeecContext; 997a405238aSHisping Lin TEEC_Session TeecSession; 998a405238aSHisping Lin uint32_t ErrorOrigin; 999a405238aSHisping Lin 1000a405238aSHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 1001a405238aSHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 1002a405238aSHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 1003a405238aSHisping Lin TEEC_Operation TeecOperation = {0}; 1004a405238aSHisping Lin 1005a405238aSHisping Lin TeecResult = OpteeClientApiLibInitialize(); 1006a405238aSHisping Lin if (TeecResult != TEEC_SUCCESS) 1007a405238aSHisping Lin return TeecResult; 1008a405238aSHisping Lin 1009a405238aSHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1010a405238aSHisping Lin if (TeecResult != TEEC_SUCCESS) 1011a405238aSHisping Lin return TeecResult; 1012a405238aSHisping Lin 1013a405238aSHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 1014a405238aSHisping Lin &TeecSession, 1015a405238aSHisping Lin TeecUuid, 1016a405238aSHisping Lin TEEC_LOGIN_PUBLIC, 1017a405238aSHisping Lin NULL, 1018a405238aSHisping Lin NULL, 1019a405238aSHisping Lin &ErrorOrigin); 1020a405238aSHisping Lin if (TeecResult != TEEC_SUCCESS) 1021a405238aSHisping Lin return TeecResult; 1022a405238aSHisping Lin 1023a405238aSHisping Lin TeecOperation.params[0].value.a = key_id; 1024a405238aSHisping Lin 1025a405238aSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 1026a405238aSHisping Lin TEEC_NONE, 1027a405238aSHisping Lin TEEC_NONE, 1028a405238aSHisping Lin TEEC_NONE); 1029a405238aSHisping Lin 1030a405238aSHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 1031a405238aSHisping Lin STORAGE_CMD_SET_OEM_HR_OTP_READ_LOCK, 1032a405238aSHisping Lin &TeecOperation, 1033a405238aSHisping Lin &ErrorOrigin); 1034a405238aSHisping Lin if (TeecResult != TEEC_SUCCESS) 1035a405238aSHisping Lin goto exit; 1036a405238aSHisping Lin 1037a405238aSHisping Lin exit: 1038a405238aSHisping Lin TEEC_CloseSession(&TeecSession); 1039a405238aSHisping Lin TEEC_FinalizeContext(&TeecContext); 1040a405238aSHisping Lin 1041a405238aSHisping Lin return TeecResult; 1042a405238aSHisping Lin } 1043a405238aSHisping Lin 10442f8c34bdSxb.wang uint32_t trusty_oem_otp_key_cipher(enum RK_OEM_OTP_KEYID key_id, rk_cipher_config *config, 10452f8c34bdSxb.wang uint32_t src_phys_addr, uint32_t dst_phys_addr, 10462f8c34bdSxb.wang uint32_t len) 1047fc3694d6Sxb.wang { 1048fc3694d6Sxb.wang TEEC_Result TeecResult; 1049fc3694d6Sxb.wang TEEC_Context TeecContext; 1050fc3694d6Sxb.wang TEEC_Session TeecSession; 1051fc3694d6Sxb.wang TEEC_Operation TeecOperation = {0}; 1052fc3694d6Sxb.wang uint32_t ErrorOrigin; 1053fc3694d6Sxb.wang TEEC_UUID uuid = RK_CRYPTO_SERVICE_UUID; 1054fc3694d6Sxb.wang TEEC_SharedMemory SharedMem_config = {0}; 1055fc3694d6Sxb.wang 10562f8c34bdSxb.wang if (key_id != RK_OEM_OTP_KEY0 && 10572f8c34bdSxb.wang key_id != RK_OEM_OTP_KEY1 && 10582f8c34bdSxb.wang key_id != RK_OEM_OTP_KEY2 && 10592f8c34bdSxb.wang key_id != RK_OEM_OTP_KEY3 && 10602f8c34bdSxb.wang key_id != RK_OEM_OTP_KEY_FW) 1061fc3694d6Sxb.wang return TEEC_ERROR_BAD_PARAMETERS; 1062fc3694d6Sxb.wang 10632f8c34bdSxb.wang if (!config) 1064fc3694d6Sxb.wang return TEEC_ERROR_BAD_PARAMETERS; 1065fc3694d6Sxb.wang 1066fc3694d6Sxb.wang if (config->algo != RK_ALGO_AES && config->algo != RK_ALGO_SM4) 1067fc3694d6Sxb.wang return TEEC_ERROR_BAD_PARAMETERS; 1068fc3694d6Sxb.wang 1069fc3694d6Sxb.wang if (config->mode >= RK_CIPHER_MODE_XTS) 1070fc3694d6Sxb.wang return TEEC_ERROR_BAD_PARAMETERS; 1071fc3694d6Sxb.wang 1072fc3694d6Sxb.wang if (config->operation != RK_MODE_ENCRYPT && 1073fc3694d6Sxb.wang config->operation != RK_MODE_DECRYPT) 1074fc3694d6Sxb.wang return TEEC_ERROR_BAD_PARAMETERS; 1075fc3694d6Sxb.wang 1076fc3694d6Sxb.wang if (config->key_len != 16 && 1077fc3694d6Sxb.wang config->key_len != 24 && 1078fc3694d6Sxb.wang config->key_len != 32) 1079fc3694d6Sxb.wang return TEEC_ERROR_BAD_PARAMETERS; 1080fc3694d6Sxb.wang 10812f8c34bdSxb.wang if (key_id == RK_OEM_OTP_KEY_FW && config->key_len != 16) 10822f8c34bdSxb.wang return TEEC_ERROR_BAD_PARAMETERS; 10832f8c34bdSxb.wang 10842f8c34bdSxb.wang #if defined(CONFIG_ROCKCHIP_RV1126) 10852f8c34bdSxb.wang if (config->key_len == 24) 10862f8c34bdSxb.wang return TEEC_ERROR_BAD_PARAMETERS; 10872f8c34bdSxb.wang #endif 10882f8c34bdSxb.wang 1089fc3694d6Sxb.wang if (len % AES_BLOCK_SIZE || 1090fc3694d6Sxb.wang len == 0) 1091fc3694d6Sxb.wang return TEEC_ERROR_BAD_PARAMETERS; 1092fc3694d6Sxb.wang 10932f8c34bdSxb.wang if (!src_phys_addr || !dst_phys_addr) 10942f8c34bdSxb.wang return TEEC_ERROR_BAD_PARAMETERS; 10952f8c34bdSxb.wang 1096fc3694d6Sxb.wang TeecResult = OpteeClientApiLibInitialize(); 1097fc3694d6Sxb.wang if (TeecResult != TEEC_SUCCESS) 1098fc3694d6Sxb.wang return TeecResult; 1099fc3694d6Sxb.wang 1100fc3694d6Sxb.wang TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1101fc3694d6Sxb.wang if (TeecResult != TEEC_SUCCESS) 1102fc3694d6Sxb.wang return TeecResult; 1103fc3694d6Sxb.wang 1104fc3694d6Sxb.wang TeecResult = TEEC_OpenSession(&TeecContext, 1105fc3694d6Sxb.wang &TeecSession, 1106fc3694d6Sxb.wang &uuid, 1107fc3694d6Sxb.wang TEEC_LOGIN_PUBLIC, 1108fc3694d6Sxb.wang NULL, 1109fc3694d6Sxb.wang NULL, 1110fc3694d6Sxb.wang &ErrorOrigin); 1111fc3694d6Sxb.wang if (TeecResult != TEEC_SUCCESS) 1112fc3694d6Sxb.wang goto exit; 1113fc3694d6Sxb.wang 1114fc3694d6Sxb.wang SharedMem_config.size = sizeof(rk_cipher_config); 1115fc3694d6Sxb.wang TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem_config); 1116fc3694d6Sxb.wang if (TeecResult != TEEC_SUCCESS) 1117fc3694d6Sxb.wang goto exit; 1118fc3694d6Sxb.wang 1119fc3694d6Sxb.wang memcpy(SharedMem_config.buffer, config, sizeof(rk_cipher_config)); 1120fc3694d6Sxb.wang TeecOperation.params[0].value.a = key_id; 1121fc3694d6Sxb.wang TeecOperation.params[1].tmpref.buffer = SharedMem_config.buffer; 1122fc3694d6Sxb.wang TeecOperation.params[1].tmpref.size = SharedMem_config.size; 11232f8c34bdSxb.wang TeecOperation.params[2].value.a = src_phys_addr; 11242f8c34bdSxb.wang TeecOperation.params[2].value.b = len; 11252f8c34bdSxb.wang TeecOperation.params[3].value.a = dst_phys_addr; 1126fc3694d6Sxb.wang TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 1127fc3694d6Sxb.wang TEEC_MEMREF_TEMP_INPUT, 11282f8c34bdSxb.wang TEEC_VALUE_INPUT, 11292f8c34bdSxb.wang TEEC_VALUE_INPUT); 11302f8c34bdSxb.wang 11312f8c34bdSxb.wang crypto_flush_cacheline(src_phys_addr, len); 11322f8c34bdSxb.wang crypto_flush_cacheline(dst_phys_addr, len); 11332f8c34bdSxb.wang 1134fc3694d6Sxb.wang TeecResult = TEEC_InvokeCommand(&TeecSession, 11352f8c34bdSxb.wang CRYPTO_SERVICE_CMD_OEM_OTP_KEY_PHYS_CIPHER, 1136fc3694d6Sxb.wang &TeecOperation, 1137fc3694d6Sxb.wang &ErrorOrigin); 1138fc3694d6Sxb.wang 1139a900eef3SHisping Lin crypto_invalidate_cacheline(dst_phys_addr, len); 1140a900eef3SHisping Lin 1141fc3694d6Sxb.wang exit: 1142fc3694d6Sxb.wang TEEC_ReleaseSharedMemory(&SharedMem_config); 1143fc3694d6Sxb.wang TEEC_CloseSession(&TeecSession); 1144fc3694d6Sxb.wang TEEC_FinalizeContext(&TeecContext); 1145fc3694d6Sxb.wang return TeecResult; 1146fc3694d6Sxb.wang } 1147fc3694d6Sxb.wang 1148a828eba9SHisping Lin uint32_t trusty_write_oem_hdcp_key(enum RK_HDCP_KEYID key_id, 1149a828eba9SHisping Lin uint8_t *byte_buf, uint32_t byte_len) 1150a828eba9SHisping Lin { 1151a828eba9SHisping Lin TEEC_Result TeecResult; 1152a828eba9SHisping Lin TEEC_Context TeecContext; 1153a828eba9SHisping Lin TEEC_Session TeecSession; 1154a828eba9SHisping Lin uint32_t ErrorOrigin; 1155a828eba9SHisping Lin 1156a828eba9SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 1157a828eba9SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 1158a828eba9SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 1159a828eba9SHisping Lin TEEC_Operation TeecOperation = {0}; 1160a828eba9SHisping Lin 1161a828eba9SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 1162a828eba9SHisping Lin if (TeecResult != TEEC_SUCCESS) 1163a828eba9SHisping Lin return TeecResult; 1164a828eba9SHisping Lin 1165a828eba9SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1166a828eba9SHisping Lin if (TeecResult != TEEC_SUCCESS) 1167a828eba9SHisping Lin return TeecResult; 1168a828eba9SHisping Lin 1169a828eba9SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 1170a828eba9SHisping Lin &TeecSession, 1171a828eba9SHisping Lin TeecUuid, 1172a828eba9SHisping Lin TEEC_LOGIN_PUBLIC, 1173a828eba9SHisping Lin NULL, 1174a828eba9SHisping Lin NULL, 1175a828eba9SHisping Lin &ErrorOrigin); 1176a828eba9SHisping Lin if (TeecResult != TEEC_SUCCESS) 1177a828eba9SHisping Lin return TeecResult; 1178a828eba9SHisping Lin 1179a828eba9SHisping Lin TeecOperation.params[0].value.a = key_id; 1180a828eba9SHisping Lin 1181a828eba9SHisping Lin TEEC_SharedMemory SharedMem = {0}; 1182a828eba9SHisping Lin 1183a828eba9SHisping Lin SharedMem.size = byte_len; 1184a828eba9SHisping Lin SharedMem.flags = 0; 1185a828eba9SHisping Lin 1186a828eba9SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem); 1187a828eba9SHisping Lin if (TeecResult != TEEC_SUCCESS) 1188a828eba9SHisping Lin goto exit; 1189a828eba9SHisping Lin 1190a828eba9SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem.buffer; 1191a828eba9SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem.size; 1192a828eba9SHisping Lin 1193a828eba9SHisping Lin memcpy(SharedMem.buffer, byte_buf, SharedMem.size); 1194a828eba9SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 1195a828eba9SHisping Lin TEEC_MEMREF_TEMP_INPUT, 1196a828eba9SHisping Lin TEEC_NONE, 1197a828eba9SHisping Lin TEEC_NONE); 1198a828eba9SHisping Lin 1199a828eba9SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 1200a828eba9SHisping Lin STORAGE_CMD_WRITE_OEM_HDCP_KEY, 1201a828eba9SHisping Lin &TeecOperation, 1202a828eba9SHisping Lin &ErrorOrigin); 1203a828eba9SHisping Lin if (TeecResult != TEEC_SUCCESS) 1204a828eba9SHisping Lin goto exit; 1205a828eba9SHisping Lin 1206a828eba9SHisping Lin exit: 1207a828eba9SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem); 1208a828eba9SHisping Lin TEEC_CloseSession(&TeecSession); 1209a828eba9SHisping Lin TEEC_FinalizeContext(&TeecContext); 1210a828eba9SHisping Lin 1211a828eba9SHisping Lin return TeecResult; 1212a828eba9SHisping Lin } 1213a828eba9SHisping Lin 1214*e8bc2655SHisping Lin uint32_t trusty_oem_hdcp_key_is_written(enum RK_HDCP_KEYID key_id, uint8_t *value) 1215*e8bc2655SHisping Lin { 1216*e8bc2655SHisping Lin TEEC_Result TeecResult; 1217*e8bc2655SHisping Lin TEEC_Context TeecContext; 1218*e8bc2655SHisping Lin TEEC_Session TeecSession; 1219*e8bc2655SHisping Lin uint32_t ErrorOrigin; 1220*e8bc2655SHisping Lin 1221*e8bc2655SHisping Lin *value = 0xFF; 1222*e8bc2655SHisping Lin 1223*e8bc2655SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 1224*e8bc2655SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 1225*e8bc2655SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 1226*e8bc2655SHisping Lin TEEC_Operation TeecOperation = {0}; 1227*e8bc2655SHisping Lin 1228*e8bc2655SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 1229*e8bc2655SHisping Lin if (TeecResult != TEEC_SUCCESS) 1230*e8bc2655SHisping Lin return TeecResult; 1231*e8bc2655SHisping Lin 1232*e8bc2655SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1233*e8bc2655SHisping Lin if (TeecResult != TEEC_SUCCESS) 1234*e8bc2655SHisping Lin return TeecResult; 1235*e8bc2655SHisping Lin 1236*e8bc2655SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 1237*e8bc2655SHisping Lin &TeecSession, 1238*e8bc2655SHisping Lin TeecUuid, 1239*e8bc2655SHisping Lin TEEC_LOGIN_PUBLIC, 1240*e8bc2655SHisping Lin NULL, 1241*e8bc2655SHisping Lin NULL, 1242*e8bc2655SHisping Lin &ErrorOrigin); 1243*e8bc2655SHisping Lin if (TeecResult != TEEC_SUCCESS) 1244*e8bc2655SHisping Lin return TeecResult; 1245*e8bc2655SHisping Lin 1246*e8bc2655SHisping Lin TeecOperation.params[0].value.a = key_id; 1247*e8bc2655SHisping Lin 1248*e8bc2655SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INOUT, 1249*e8bc2655SHisping Lin TEEC_NONE, 1250*e8bc2655SHisping Lin TEEC_NONE, 1251*e8bc2655SHisping Lin TEEC_NONE); 1252*e8bc2655SHisping Lin 1253*e8bc2655SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 1254*e8bc2655SHisping Lin STORAGE_CMD_OEM_HDCP_KEY_IS_WRITTEN, 1255*e8bc2655SHisping Lin &TeecOperation, 1256*e8bc2655SHisping Lin &ErrorOrigin); 1257*e8bc2655SHisping Lin if (TeecResult == TEEC_SUCCESS) 1258*e8bc2655SHisping Lin *value = TeecOperation.params[0].value.b; 1259*e8bc2655SHisping Lin 1260*e8bc2655SHisping Lin TEEC_CloseSession(&TeecSession); 1261*e8bc2655SHisping Lin TEEC_FinalizeContext(&TeecContext); 1262*e8bc2655SHisping Lin 1263*e8bc2655SHisping Lin return TeecResult; 1264*e8bc2655SHisping Lin } 1265*e8bc2655SHisping Lin 12664d4c5043SHisping Lin uint32_t trusty_oem_user_ta_transfer(void) 12674d4c5043SHisping Lin { 12684d4c5043SHisping Lin TEEC_Result TeecResult; 12694d4c5043SHisping Lin TEEC_Context TeecContext; 12704d4c5043SHisping Lin TEEC_Session TeecSession; 12714d4c5043SHisping Lin uint32_t ErrorOrigin; 12724d4c5043SHisping Lin TEEC_UUID tempuuid = { 0x1db57234, 0xdacd, 0x462d, 12734d4c5043SHisping Lin { 0x9b, 0xb1, 0xae, 0x79, 0xde, 0x44, 0xe2, 0xa5} }; 12744d4c5043SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 12754d4c5043SHisping Lin TEEC_Operation TeecOperation = {0}; 12764d4c5043SHisping Lin const uint8_t transfer_inout[] = "Transfer data test."; 12774d4c5043SHisping Lin 12784d4c5043SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 12794d4c5043SHisping Lin if (TeecResult != TEEC_SUCCESS) 12804d4c5043SHisping Lin return TeecResult; 12814d4c5043SHisping Lin 12824d4c5043SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 12834d4c5043SHisping Lin if (TeecResult != TEEC_SUCCESS) 12844d4c5043SHisping Lin return TeecResult; 12854d4c5043SHisping Lin 12864d4c5043SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE, 12874d4c5043SHisping Lin TEEC_NONE, 12884d4c5043SHisping Lin TEEC_NONE, 12894d4c5043SHisping Lin TEEC_NONE); 12904d4c5043SHisping Lin 12914d4c5043SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 12924d4c5043SHisping Lin &TeecSession, 12934d4c5043SHisping Lin TeecUuid, 12944d4c5043SHisping Lin TEEC_LOGIN_PUBLIC, 12954d4c5043SHisping Lin NULL, 12964d4c5043SHisping Lin &TeecOperation, 12974d4c5043SHisping Lin &ErrorOrigin); 12984d4c5043SHisping Lin if (TeecResult != TEEC_SUCCESS) 12994d4c5043SHisping Lin return TeecResult; 13004d4c5043SHisping Lin 13014d4c5043SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 13024d4c5043SHisping Lin 13034d4c5043SHisping Lin SharedMem0.size = sizeof(transfer_inout); 13044d4c5043SHisping Lin SharedMem0.flags = 0; 13054d4c5043SHisping Lin 13064d4c5043SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 13074d4c5043SHisping Lin if (TeecResult != TEEC_SUCCESS) 13084d4c5043SHisping Lin goto exit; 13094d4c5043SHisping Lin 13104d4c5043SHisping Lin memcpy(SharedMem0.buffer, transfer_inout, SharedMem0.size); 13114d4c5043SHisping Lin 13124d4c5043SHisping Lin TEEC_SharedMemory SharedMem1 = {0}; 13134d4c5043SHisping Lin 13144d4c5043SHisping Lin SharedMem1.size = sizeof(transfer_inout); 13154d4c5043SHisping Lin SharedMem1.flags = 0; 13164d4c5043SHisping Lin 13174d4c5043SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 13184d4c5043SHisping Lin if (TeecResult != TEEC_SUCCESS) 13194d4c5043SHisping Lin goto exit; 13204d4c5043SHisping Lin 13214d4c5043SHisping Lin TeecOperation.params[0].value.a = 66; 13224d4c5043SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem0.buffer; 13234d4c5043SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem0.size; 13244d4c5043SHisping Lin TeecOperation.params[2].tmpref.buffer = SharedMem1.buffer; 13254d4c5043SHisping Lin TeecOperation.params[2].tmpref.size = SharedMem1.size; 13264d4c5043SHisping Lin 13274d4c5043SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INOUT, 13284d4c5043SHisping Lin TEEC_MEMREF_TEMP_INPUT, 13294d4c5043SHisping Lin TEEC_MEMREF_TEMP_OUTPUT, 13304d4c5043SHisping Lin TEEC_NONE); 13314d4c5043SHisping Lin 13324d4c5043SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 13334d4c5043SHisping Lin 102, 13344d4c5043SHisping Lin &TeecOperation, 13354d4c5043SHisping Lin &ErrorOrigin); 13364d4c5043SHisping Lin if (TeecResult != TEEC_SUCCESS) 13374d4c5043SHisping Lin goto exit; 13384d4c5043SHisping Lin 13394d4c5043SHisping Lin //Check the result 13404d4c5043SHisping Lin if (TeecOperation.params[0].value.a == 66 + 1 && 13414d4c5043SHisping Lin TeecOperation.params[0].value.b == TeecOperation.params[0].value.a) 13424d4c5043SHisping Lin printf("test value : Pass!\n"); 13434d4c5043SHisping Lin else 13444d4c5043SHisping Lin printf("test value : Fail! (mismatch values)\n"); 13454d4c5043SHisping Lin 13464d4c5043SHisping Lin if (memcmp(SharedMem1.buffer, transfer_inout, sizeof(transfer_inout)) == 0) 13474d4c5043SHisping Lin printf("test buffer : Pass!\n"); 13484d4c5043SHisping Lin else 13494d4c5043SHisping Lin printf("test buffer : Fail! (mismatch buffer)\n"); 13504d4c5043SHisping Lin 13514d4c5043SHisping Lin exit: 13524d4c5043SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 13534d4c5043SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem1); 13544d4c5043SHisping Lin TEEC_CloseSession(&TeecSession); 13554d4c5043SHisping Lin TEEC_FinalizeContext(&TeecContext); 13564d4c5043SHisping Lin 13574d4c5043SHisping Lin return TeecResult; 13584d4c5043SHisping Lin } 13594d4c5043SHisping Lin 13604d4c5043SHisping Lin uint32_t trusty_oem_user_ta_storage(void) 13614d4c5043SHisping Lin { 13624d4c5043SHisping Lin TEEC_Result TeecResult; 13634d4c5043SHisping Lin TEEC_Context TeecContext; 13644d4c5043SHisping Lin TEEC_Session TeecSession; 13654d4c5043SHisping Lin uint32_t ErrorOrigin; 13664d4c5043SHisping Lin TEEC_UUID tempuuid = { 0x1db57234, 0xdacd, 0x462d, 13674d4c5043SHisping Lin { 0x9b, 0xb1, 0xae, 0x79, 0xde, 0x44, 0xe2, 0xa5} }; 13684d4c5043SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 13694d4c5043SHisping Lin TEEC_Operation TeecOperation = {0}; 13704d4c5043SHisping Lin 13714d4c5043SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 13724d4c5043SHisping Lin if (TeecResult != TEEC_SUCCESS) 13734d4c5043SHisping Lin return TeecResult; 13744d4c5043SHisping Lin 13754d4c5043SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 13764d4c5043SHisping Lin if (TeecResult != TEEC_SUCCESS) 13774d4c5043SHisping Lin return TeecResult; 13784d4c5043SHisping Lin 13794d4c5043SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE, 13804d4c5043SHisping Lin TEEC_NONE, 13814d4c5043SHisping Lin TEEC_NONE, 13824d4c5043SHisping Lin TEEC_NONE); 13834d4c5043SHisping Lin 13844d4c5043SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 13854d4c5043SHisping Lin &TeecSession, 13864d4c5043SHisping Lin TeecUuid, 13874d4c5043SHisping Lin TEEC_LOGIN_PUBLIC, 13884d4c5043SHisping Lin NULL, 13894d4c5043SHisping Lin &TeecOperation, 13904d4c5043SHisping Lin &ErrorOrigin); 13914d4c5043SHisping Lin if (TeecResult != TEEC_SUCCESS) 13924d4c5043SHisping Lin return TeecResult; 13934d4c5043SHisping Lin 13944d4c5043SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE, 13954d4c5043SHisping Lin TEEC_NONE, 13964d4c5043SHisping Lin TEEC_NONE, 13974d4c5043SHisping Lin TEEC_NONE); 13984d4c5043SHisping Lin 13994d4c5043SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 14004d4c5043SHisping Lin 103, 14014d4c5043SHisping Lin &TeecOperation, 14024d4c5043SHisping Lin &ErrorOrigin); 14034d4c5043SHisping Lin if (TeecResult != TEEC_SUCCESS) 14044d4c5043SHisping Lin goto exit; 14054d4c5043SHisping Lin 14064d4c5043SHisping Lin exit: 14074d4c5043SHisping Lin TEEC_CloseSession(&TeecSession); 14084d4c5043SHisping Lin TEEC_FinalizeContext(&TeecContext); 14094d4c5043SHisping Lin 14104d4c5043SHisping Lin return TeecResult; 14114d4c5043SHisping Lin } 14124d4c5043SHisping Lin 14134aa61755SAndy Ye uint32_t trusty_attest_dh(uint8_t *dh, uint32_t *dh_size) 14144aa61755SAndy Ye { 14154aa61755SAndy Ye TEEC_Result TeecResult; 14164aa61755SAndy Ye TEEC_Context TeecContext; 14174aa61755SAndy Ye TEEC_Session TeecSession; 14184aa61755SAndy Ye uint32_t ErrorOrigin; 14194aa61755SAndy Ye TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6, 14204aa61755SAndy Ye { 0xa8, 0x69, 0x9c, 0xe6, 14214aa61755SAndy Ye 0x88, 0x6c, 0x5d, 0x5d 14224aa61755SAndy Ye } 14234aa61755SAndy Ye }; 14244aa61755SAndy Ye TEEC_UUID *TeecUuid = &tempuuid; 14254aa61755SAndy Ye TEEC_Operation TeecOperation = {0}; 14263251364cSHisping Lin struct blk_desc *dev_desc; 14273251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 14286651d4c0SJason Zhu if (!dev_desc) { 14296651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 14306651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 14316651d4c0SJason Zhu } 14324aa61755SAndy Ye 1433f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 1434f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1435f4e1db95SHisping Lin return TeecResult; 14364aa61755SAndy Ye 14374aa61755SAndy Ye TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1438f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1439f4e1db95SHisping Lin return TeecResult; 14404aa61755SAndy Ye 14413251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 14423251364cSHisping Lin TEEC_NONE, 14433251364cSHisping Lin TEEC_NONE, 14443251364cSHisping Lin TEEC_NONE); 14453251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 1446b9a7e756SHisping Lin if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0) 1447b9a7e756SHisping Lin TeecOperation.params[0].value.a = 1; 1448b9a7e756SHisping Lin else 1449b9a7e756SHisping Lin TeecOperation.params[0].value.a = 0; 1450b9a7e756SHisping Lin 14513251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 14523251364cSHisping Lin TeecOperation.params[0].value.a = 0; 14533251364cSHisping Lin #endif 14543251364cSHisping Lin 14554aa61755SAndy Ye TeecResult = TEEC_OpenSession(&TeecContext, 14564aa61755SAndy Ye &TeecSession, 14574aa61755SAndy Ye TeecUuid, 14584aa61755SAndy Ye TEEC_LOGIN_PUBLIC, 14594aa61755SAndy Ye NULL, 14603251364cSHisping Lin &TeecOperation, 14614aa61755SAndy Ye &ErrorOrigin); 1462f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1463f4e1db95SHisping Lin return TeecResult; 14644aa61755SAndy Ye 14654aa61755SAndy Ye TEEC_SharedMemory SharedMem0 = {0}; 14664aa61755SAndy Ye 14674aa61755SAndy Ye SharedMem0.size = *dh_size; 14684aa61755SAndy Ye SharedMem0.flags = 0; 14694aa61755SAndy Ye 14704aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 1471f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1472f4e1db95SHisping Lin goto exit; 14734aa61755SAndy Ye 14744aa61755SAndy Ye TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 14754aa61755SAndy Ye TeecOperation.params[0].tmpref.size = SharedMem0.size; 14764aa61755SAndy Ye 14774aa61755SAndy Ye TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, 14784aa61755SAndy Ye TEEC_NONE, 14794aa61755SAndy Ye TEEC_NONE, 14804aa61755SAndy Ye TEEC_NONE); 14814aa61755SAndy Ye 14824aa61755SAndy Ye TeecResult = TEEC_InvokeCommand(&TeecSession, 14834aa61755SAndy Ye 143, 14844aa61755SAndy Ye &TeecOperation, 14854aa61755SAndy Ye &ErrorOrigin); 1486f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1487f4e1db95SHisping Lin goto exit; 14884aa61755SAndy Ye 14894aa61755SAndy Ye *dh_size = TeecOperation.params[0].tmpref.size; 14904aa61755SAndy Ye memcpy(dh, SharedMem0.buffer, SharedMem0.size); 1491f4e1db95SHisping Lin exit: 14924aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem0); 14934aa61755SAndy Ye TEEC_CloseSession(&TeecSession); 1494f4e1db95SHisping Lin TEEC_FinalizeContext(&TeecContext); 14954aa61755SAndy Ye 14964aa61755SAndy Ye return TeecResult; 14974aa61755SAndy Ye } 14984aa61755SAndy Ye 14994aa61755SAndy Ye uint32_t trusty_attest_uuid(uint8_t *uuid, uint32_t *uuid_size) 15004aa61755SAndy Ye { 15014aa61755SAndy Ye TEEC_Result TeecResult; 15024aa61755SAndy Ye TEEC_Context TeecContext; 15034aa61755SAndy Ye TEEC_Session TeecSession; 15044aa61755SAndy Ye uint32_t ErrorOrigin; 15054aa61755SAndy Ye TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6, 15064aa61755SAndy Ye { 0xa8, 0x69, 0x9c, 0xe6, 15074aa61755SAndy Ye 0x88, 0x6c, 0x5d, 0x5d 15084aa61755SAndy Ye } 15094aa61755SAndy Ye }; 15104aa61755SAndy Ye TEEC_UUID *TeecUuid = &tempuuid; 15114aa61755SAndy Ye TEEC_Operation TeecOperation = {0}; 15123251364cSHisping Lin struct blk_desc *dev_desc; 15133251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 15146651d4c0SJason Zhu if (!dev_desc) { 15156651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 15166651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 15176651d4c0SJason Zhu } 15184aa61755SAndy Ye 1519f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 1520f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1521f4e1db95SHisping Lin return TeecResult; 15224aa61755SAndy Ye 15234aa61755SAndy Ye TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1524f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1525f4e1db95SHisping Lin return TeecResult; 15264aa61755SAndy Ye 15273251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 15283251364cSHisping Lin TEEC_NONE, 15293251364cSHisping Lin TEEC_NONE, 15303251364cSHisping Lin TEEC_NONE); 15313251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 1532b9a7e756SHisping Lin if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0) 1533b9a7e756SHisping Lin TeecOperation.params[0].value.a = 1; 1534b9a7e756SHisping Lin else 1535b9a7e756SHisping Lin TeecOperation.params[0].value.a = 0; 1536b9a7e756SHisping Lin 15373251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 15383251364cSHisping Lin TeecOperation.params[0].value.a = 0; 15393251364cSHisping Lin #endif 15403251364cSHisping Lin 15414aa61755SAndy Ye TeecResult = TEEC_OpenSession(&TeecContext, 15424aa61755SAndy Ye &TeecSession, 15434aa61755SAndy Ye TeecUuid, 15444aa61755SAndy Ye TEEC_LOGIN_PUBLIC, 15454aa61755SAndy Ye NULL, 15463251364cSHisping Lin &TeecOperation, 15474aa61755SAndy Ye &ErrorOrigin); 1548f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1549f4e1db95SHisping Lin return TeecResult; 15504aa61755SAndy Ye 15514aa61755SAndy Ye TEEC_SharedMemory SharedMem0 = {0}; 15524aa61755SAndy Ye 15534aa61755SAndy Ye SharedMem0.size = *uuid_size; 15544aa61755SAndy Ye SharedMem0.flags = 0; 15554aa61755SAndy Ye 15564aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 1557f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1558f4e1db95SHisping Lin goto exit; 15594aa61755SAndy Ye 15604aa61755SAndy Ye TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 15614aa61755SAndy Ye TeecOperation.params[0].tmpref.size = SharedMem0.size; 15624aa61755SAndy Ye 15634aa61755SAndy Ye TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, 15644aa61755SAndy Ye TEEC_NONE, 15654aa61755SAndy Ye TEEC_NONE, 15664aa61755SAndy Ye TEEC_NONE); 15674aa61755SAndy Ye 15684aa61755SAndy Ye TeecResult = TEEC_InvokeCommand(&TeecSession, 15694aa61755SAndy Ye 144, 15704aa61755SAndy Ye &TeecOperation, 15714aa61755SAndy Ye &ErrorOrigin); 1572f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1573f4e1db95SHisping Lin goto exit; 15744aa61755SAndy Ye 15754aa61755SAndy Ye *uuid_size = TeecOperation.params[0].tmpref.size; 15764aa61755SAndy Ye memcpy(uuid, SharedMem0.buffer, SharedMem0.size); 1577f4e1db95SHisping Lin exit: 15784aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem0); 15794aa61755SAndy Ye TEEC_CloseSession(&TeecSession); 1580f4e1db95SHisping Lin TEEC_FinalizeContext(&TeecContext); 15814aa61755SAndy Ye 15824aa61755SAndy Ye return TeecResult; 15834aa61755SAndy Ye } 15844aa61755SAndy Ye 15854aa61755SAndy Ye uint32_t trusty_attest_get_ca(uint8_t *operation_start, 15864aa61755SAndy Ye uint32_t *operation_size, 15874aa61755SAndy Ye uint8_t *out, 15884aa61755SAndy Ye uint32_t *out_len) 15894aa61755SAndy Ye { 15904aa61755SAndy Ye TEEC_Result TeecResult; 15914aa61755SAndy Ye TEEC_Context TeecContext; 15924aa61755SAndy Ye TEEC_Session TeecSession; 15934aa61755SAndy Ye uint32_t ErrorOrigin; 15944aa61755SAndy Ye 15954aa61755SAndy Ye TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6, 15964aa61755SAndy Ye { 0xa8, 0x69, 0x9c, 0xe6, 15974aa61755SAndy Ye 0x88, 0x6c, 0x5d, 0x5d 15984aa61755SAndy Ye } 15994aa61755SAndy Ye }; 16004aa61755SAndy Ye 16014aa61755SAndy Ye TEEC_UUID *TeecUuid = &tempuuid; 16024aa61755SAndy Ye TEEC_Operation TeecOperation = {0}; 16033251364cSHisping Lin struct blk_desc *dev_desc; 16043251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 16056651d4c0SJason Zhu if (!dev_desc) { 16066651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 16076651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 16086651d4c0SJason Zhu } 16094aa61755SAndy Ye 1610f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 1611f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1612f4e1db95SHisping Lin return TeecResult; 16134aa61755SAndy Ye 16144aa61755SAndy Ye TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1615f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1616f4e1db95SHisping Lin return TeecResult; 16174aa61755SAndy Ye 16183251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 16193251364cSHisping Lin TEEC_NONE, 16203251364cSHisping Lin TEEC_NONE, 16213251364cSHisping Lin TEEC_NONE); 16223251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 1623b9a7e756SHisping Lin if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0) 1624b9a7e756SHisping Lin TeecOperation.params[0].value.a = 1; 1625b9a7e756SHisping Lin else 1626b9a7e756SHisping Lin TeecOperation.params[0].value.a = 0; 1627b9a7e756SHisping Lin 16283251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 16293251364cSHisping Lin TeecOperation.params[0].value.a = 0; 16303251364cSHisping Lin #endif 16313251364cSHisping Lin 16324aa61755SAndy Ye TeecResult = TEEC_OpenSession(&TeecContext, 16334aa61755SAndy Ye &TeecSession, 16344aa61755SAndy Ye TeecUuid, 16354aa61755SAndy Ye TEEC_LOGIN_PUBLIC, 16364aa61755SAndy Ye NULL, 16373251364cSHisping Lin &TeecOperation, 16384aa61755SAndy Ye &ErrorOrigin); 1639f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1640f4e1db95SHisping Lin return TeecResult; 16414aa61755SAndy Ye 16424aa61755SAndy Ye TEEC_SharedMemory SharedMem0 = {0}; 16434aa61755SAndy Ye 16444aa61755SAndy Ye SharedMem0.size = *operation_size; 16454aa61755SAndy Ye SharedMem0.flags = 0; 16464aa61755SAndy Ye 16474aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 1648f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1649f4e1db95SHisping Lin goto exit; 16504aa61755SAndy Ye 16514aa61755SAndy Ye memcpy(SharedMem0.buffer, operation_start, SharedMem0.size); 16524aa61755SAndy Ye 16534aa61755SAndy Ye TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 16544aa61755SAndy Ye TeecOperation.params[0].tmpref.size = SharedMem0.size; 16554aa61755SAndy Ye 16564aa61755SAndy Ye TEEC_SharedMemory SharedMem1 = {0}; 16574aa61755SAndy Ye 16584aa61755SAndy Ye SharedMem1.size = *out_len; 16594aa61755SAndy Ye SharedMem1.flags = 0; 16604aa61755SAndy Ye 16614aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 1662f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1663f4e1db95SHisping Lin goto exit; 16644aa61755SAndy Ye 16654aa61755SAndy Ye TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 16664aa61755SAndy Ye TeecOperation.params[1].tmpref.size = SharedMem1.size; 16674aa61755SAndy Ye 16684aa61755SAndy Ye TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, 16694aa61755SAndy Ye TEEC_MEMREF_TEMP_INOUT, 16704aa61755SAndy Ye TEEC_NONE, 16714aa61755SAndy Ye TEEC_NONE); 16724aa61755SAndy Ye 16734aa61755SAndy Ye TeecResult = TEEC_InvokeCommand(&TeecSession, 16744aa61755SAndy Ye 145, 16754aa61755SAndy Ye &TeecOperation, 16764aa61755SAndy Ye &ErrorOrigin); 1677f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1678f4e1db95SHisping Lin goto exit; 16794aa61755SAndy Ye 16804aa61755SAndy Ye *out_len = TeecOperation.params[1].tmpref.size; 16814aa61755SAndy Ye memcpy(out, SharedMem1.buffer, SharedMem1.size); 1682f4e1db95SHisping Lin exit: 16834aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem0); 16844aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem1); 1685f4e1db95SHisping Lin TEEC_CloseSession(&TeecSession); 1686f4e1db95SHisping Lin TEEC_FinalizeContext(&TeecContext); 16874aa61755SAndy Ye 16884aa61755SAndy Ye return TeecResult; 16894aa61755SAndy Ye } 16904aa61755SAndy Ye 16914aa61755SAndy Ye uint32_t trusty_attest_set_ca(uint8_t *ca_response, uint32_t *ca_response_size) 16924aa61755SAndy Ye { 16934aa61755SAndy Ye TEEC_Result TeecResult; 16944aa61755SAndy Ye TEEC_Context TeecContext; 16954aa61755SAndy Ye TEEC_Session TeecSession; 16964aa61755SAndy Ye uint32_t ErrorOrigin; 16974aa61755SAndy Ye TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6, 16984aa61755SAndy Ye { 0xa8, 0x69, 0x9c, 0xe6, 16994aa61755SAndy Ye 0x88, 0x6c, 0x5d, 0x5d 17004aa61755SAndy Ye } 17014aa61755SAndy Ye }; 17024aa61755SAndy Ye TEEC_UUID *TeecUuid = &tempuuid; 17034aa61755SAndy Ye TEEC_Operation TeecOperation = {0}; 17043251364cSHisping Lin struct blk_desc *dev_desc; 17053251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 17066651d4c0SJason Zhu if (!dev_desc) { 17076651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 17086651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 17096651d4c0SJason Zhu } 1710f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 1711f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1712f4e1db95SHisping Lin return TeecResult; 17134aa61755SAndy Ye 17144aa61755SAndy Ye TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1715f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1716f4e1db95SHisping Lin return TeecResult; 17174aa61755SAndy Ye 17183251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 17193251364cSHisping Lin TEEC_NONE, 17203251364cSHisping Lin TEEC_NONE, 17213251364cSHisping Lin TEEC_NONE); 17223251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 1723b9a7e756SHisping Lin if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0) 1724b9a7e756SHisping Lin TeecOperation.params[0].value.a = 1; 1725b9a7e756SHisping Lin else 1726b9a7e756SHisping Lin TeecOperation.params[0].value.a = 0; 1727b9a7e756SHisping Lin 17283251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 17293251364cSHisping Lin TeecOperation.params[0].value.a = 0; 17303251364cSHisping Lin #endif 17313251364cSHisping Lin 17324aa61755SAndy Ye TeecResult = TEEC_OpenSession(&TeecContext, 17334aa61755SAndy Ye &TeecSession, 17344aa61755SAndy Ye TeecUuid, 17354aa61755SAndy Ye TEEC_LOGIN_PUBLIC, 17364aa61755SAndy Ye NULL, 17373251364cSHisping Lin &TeecOperation, 17384aa61755SAndy Ye &ErrorOrigin); 1739f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1740f4e1db95SHisping Lin return TeecResult; 17414aa61755SAndy Ye 17424aa61755SAndy Ye TEEC_SharedMemory SharedMem0 = {0}; 17434aa61755SAndy Ye 17444aa61755SAndy Ye SharedMem0.size = *ca_response_size; 17454aa61755SAndy Ye SharedMem0.flags = 0; 17464aa61755SAndy Ye 17474aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 1748f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1749f4e1db95SHisping Lin goto exit; 17504aa61755SAndy Ye 17514aa61755SAndy Ye memcpy(SharedMem0.buffer, ca_response, SharedMem0.size); 17524aa61755SAndy Ye 17534aa61755SAndy Ye TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 17544aa61755SAndy Ye TeecOperation.params[0].tmpref.size = SharedMem0.size; 17554aa61755SAndy Ye 17564aa61755SAndy Ye TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, 17574aa61755SAndy Ye TEEC_NONE, 17584aa61755SAndy Ye TEEC_NONE, 17594aa61755SAndy Ye TEEC_NONE); 17604aa61755SAndy Ye 17614aa61755SAndy Ye TeecResult = TEEC_InvokeCommand(&TeecSession, 17624aa61755SAndy Ye 146, 17634aa61755SAndy Ye &TeecOperation, 17644aa61755SAndy Ye &ErrorOrigin); 1765f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1766f4e1db95SHisping Lin goto exit; 1767f4e1db95SHisping Lin exit: 17684aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem0); 17694aa61755SAndy Ye TEEC_CloseSession(&TeecSession); 1770f4e1db95SHisping Lin TEEC_FinalizeContext(&TeecContext); 17714aa61755SAndy Ye 17724aa61755SAndy Ye return TeecResult; 17734aa61755SAndy Ye } 1774