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 33*a828eba9SHisping Lin #define STORAGE_CMD_WRITE_OEM_HDCP_KEY 21 34ae8ec5e1SHisping Lin 352f8c34bdSxb.wang #define CRYPTO_SERVICE_CMD_OEM_OTP_KEY_PHYS_CIPHER 0x00000002 36fc3694d6Sxb.wang 37fc3694d6Sxb.wang #define RK_CRYPTO_SERVICE_UUID { 0x0cacdb5d, 0x4fea, 0x466c, \ 38fc3694d6Sxb.wang { 0x97, 0x16, 0x3d, 0x54, 0x16, 0x52, 0x83, 0x0f } } 39fc3694d6Sxb.wang 40ae8ec5e1SHisping Lin static uint8_t b2hs_add_base(uint8_t in) 41ae8ec5e1SHisping Lin { 42ae8ec5e1SHisping Lin if (in > 9) 43ae8ec5e1SHisping Lin return in + 55; 44ae8ec5e1SHisping Lin else 45ae8ec5e1SHisping Lin return in + 48; 46ae8ec5e1SHisping Lin } 47ae8ec5e1SHisping Lin 48c7de5349SHisping Lin static uint32_t b2hs(uint8_t *b, uint8_t *hs, uint32_t blen, uint32_t hslen) 49ae8ec5e1SHisping Lin { 50ae8ec5e1SHisping Lin uint32_t i = 0; 51ae8ec5e1SHisping Lin 52ae8ec5e1SHisping Lin if (blen * 2 + 1 > hslen) 53ae8ec5e1SHisping Lin return 0; 54ae8ec5e1SHisping Lin 55ae8ec5e1SHisping Lin for (; i < blen; i++) { 56ae8ec5e1SHisping Lin hs[i * 2 + 1] = b2hs_add_base(b[i] & 0xf); 57ae8ec5e1SHisping Lin hs[i * 2] = b2hs_add_base(b[i] >> 4); 58ae8ec5e1SHisping Lin } 59ae8ec5e1SHisping Lin hs[blen * 2] = 0; 60ae8ec5e1SHisping Lin 61ae8ec5e1SHisping Lin return blen * 2; 62ae8ec5e1SHisping Lin } 63ae8ec5e1SHisping Lin 642f8c34bdSxb.wang static void crypto_flush_cacheline(uint32_t addr, uint32_t size) 652f8c34bdSxb.wang { 662f8c34bdSxb.wang ulong alignment = CONFIG_SYS_CACHELINE_SIZE; 672f8c34bdSxb.wang ulong aligned_input, aligned_len; 682f8c34bdSxb.wang 692f8c34bdSxb.wang if (!addr || !size) 702f8c34bdSxb.wang return; 712f8c34bdSxb.wang 722f8c34bdSxb.wang /* Must flush dcache before crypto DMA fetch data region */ 732f8c34bdSxb.wang aligned_input = round_down(addr, alignment); 742f8c34bdSxb.wang aligned_len = round_up(size + (addr - aligned_input), alignment); 752f8c34bdSxb.wang flush_cache(aligned_input, aligned_len); 762f8c34bdSxb.wang } 772f8c34bdSxb.wang 78a900eef3SHisping Lin static void crypto_invalidate_cacheline(uint32_t addr, uint32_t size) 79a900eef3SHisping Lin { 80a900eef3SHisping Lin ulong alignment = CONFIG_SYS_CACHELINE_SIZE; 81a900eef3SHisping Lin ulong aligned_input, aligned_len; 82a900eef3SHisping Lin 83a900eef3SHisping Lin if (!addr || !size) 84a900eef3SHisping Lin return; 85a900eef3SHisping Lin 86a900eef3SHisping Lin /* Must invalidate dcache after crypto DMA write data region */ 87a900eef3SHisping Lin aligned_input = round_down(addr, alignment); 88a900eef3SHisping Lin aligned_len = round_up(size + (addr - aligned_input), alignment); 89a900eef3SHisping Lin invalidate_dcache_range(aligned_input, aligned_input + aligned_len); 90a900eef3SHisping Lin } 91a900eef3SHisping Lin 92c7de5349SHisping Lin static uint32_t trusty_base_write_security_data(char *filename, 93c7de5349SHisping Lin uint32_t filename_size, 94c7de5349SHisping Lin uint8_t *data, 95c7de5349SHisping Lin uint32_t data_size) 96ae8ec5e1SHisping Lin { 97ae8ec5e1SHisping Lin TEEC_Result TeecResult; 98ae8ec5e1SHisping Lin TEEC_Context TeecContext; 99ae8ec5e1SHisping Lin TEEC_Session TeecSession; 100ae8ec5e1SHisping Lin uint32_t ErrorOrigin; 101ae8ec5e1SHisping Lin TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 102ae8ec5e1SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 103ae8ec5e1SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 104ae8ec5e1SHisping Lin TEEC_Operation TeecOperation = {0}; 1053251364cSHisping Lin struct blk_desc *dev_desc; 1063251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 1076651d4c0SJason Zhu if (!dev_desc) { 1086651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 1096651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 1106651d4c0SJason Zhu } 1113251364cSHisping Lin 112f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 113f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 114f4e1db95SHisping Lin return TeecResult; 115ae8ec5e1SHisping Lin 116ae8ec5e1SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 117f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 118f4e1db95SHisping Lin return TeecResult; 119ae8ec5e1SHisping Lin 1203251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 1213251364cSHisping Lin TEEC_NONE, 1223251364cSHisping Lin TEEC_NONE, 1233251364cSHisping Lin TEEC_NONE); 1243251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 125b9a7e756SHisping Lin if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0) 126b9a7e756SHisping Lin TeecOperation.params[0].value.a = 1; 127b9a7e756SHisping Lin else 128b9a7e756SHisping Lin TeecOperation.params[0].value.a = 0; 1293251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 1303251364cSHisping Lin TeecOperation.params[0].value.a = 0; 1313251364cSHisping Lin #endif 1323251364cSHisping Lin 133ae8ec5e1SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 134ae8ec5e1SHisping Lin &TeecSession, 135ae8ec5e1SHisping Lin TeecUuid, 136ae8ec5e1SHisping Lin TEEC_LOGIN_PUBLIC, 137ae8ec5e1SHisping Lin NULL, 1383251364cSHisping Lin &TeecOperation, 139ae8ec5e1SHisping Lin &ErrorOrigin); 140f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 141f4e1db95SHisping Lin return TeecResult; 142ae8ec5e1SHisping Lin 143ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 144ae8ec5e1SHisping Lin 145c7de5349SHisping Lin SharedMem0.size = filename_size; 146ae8ec5e1SHisping Lin SharedMem0.flags = 0; 147ae8ec5e1SHisping Lin 148ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 149f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 150f4e1db95SHisping Lin goto exit; 151ae8ec5e1SHisping Lin 152c7de5349SHisping Lin memcpy(SharedMem0.buffer, filename, SharedMem0.size); 153ae8ec5e1SHisping Lin 154ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem1 = {0}; 155ae8ec5e1SHisping Lin 156c7de5349SHisping Lin SharedMem1.size = data_size; 157c7de5349SHisping Lin SharedMem1.flags = 0; 158c7de5349SHisping Lin 159c7de5349SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 160c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 161c7de5349SHisping Lin goto exit; 162c7de5349SHisping Lin 163c7de5349SHisping Lin memcpy(SharedMem1.buffer, data, SharedMem1.size); 164c7de5349SHisping Lin 165c7de5349SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 166c7de5349SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 167c7de5349SHisping Lin 168c7de5349SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 169c7de5349SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem1.size; 170c7de5349SHisping Lin 171c7de5349SHisping Lin 172c7de5349SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 173c7de5349SHisping Lin TEEC_MEMREF_TEMP_INOUT, 174c7de5349SHisping Lin TEEC_NONE, 175c7de5349SHisping Lin TEEC_NONE); 176c7de5349SHisping Lin 177c7de5349SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 178c7de5349SHisping Lin 1, 179c7de5349SHisping Lin &TeecOperation, 180c7de5349SHisping Lin &ErrorOrigin); 181c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 182c7de5349SHisping Lin goto exit; 183c7de5349SHisping Lin exit: 184c7de5349SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 185c7de5349SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem1); 186c7de5349SHisping Lin TEEC_CloseSession(&TeecSession); 187c7de5349SHisping Lin TEEC_FinalizeContext(&TeecContext); 188c7de5349SHisping Lin 189c7de5349SHisping Lin return TeecResult; 190c7de5349SHisping Lin } 191c7de5349SHisping Lin 192c7de5349SHisping Lin static uint32_t trusty_base_read_security_data(char *filename, 193c7de5349SHisping Lin uint32_t filename_size, 194c7de5349SHisping Lin uint8_t *data, 195c7de5349SHisping Lin uint32_t data_size) 196c7de5349SHisping Lin { 197c7de5349SHisping Lin TEEC_Result TeecResult; 198c7de5349SHisping Lin TEEC_Context TeecContext; 199c7de5349SHisping Lin TEEC_Session TeecSession; 200c7de5349SHisping Lin uint32_t ErrorOrigin; 201c7de5349SHisping Lin TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 202c7de5349SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 203c7de5349SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 204c7de5349SHisping Lin TEEC_Operation TeecOperation = {0}; 205c7de5349SHisping Lin 206c7de5349SHisping Lin struct blk_desc *dev_desc; 207c7de5349SHisping Lin dev_desc = rockchip_get_bootdev(); 208c7de5349SHisping Lin if (!dev_desc) { 209c7de5349SHisping Lin printf("%s: dev_desc is NULL!\n", __func__); 210c7de5349SHisping Lin return -TEEC_ERROR_GENERIC; 211c7de5349SHisping Lin } 212c7de5349SHisping Lin 213c7de5349SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 214c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 215c7de5349SHisping Lin return TeecResult; 216c7de5349SHisping Lin 217c7de5349SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 218c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 219c7de5349SHisping Lin return TeecResult; 220c7de5349SHisping Lin 221c7de5349SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 222c7de5349SHisping Lin TEEC_NONE, 223c7de5349SHisping Lin TEEC_NONE, 224c7de5349SHisping Lin TEEC_NONE); 225c7de5349SHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 226c7de5349SHisping Lin if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0) 227c7de5349SHisping Lin TeecOperation.params[0].value.a = 1; 228c7de5349SHisping Lin else 229c7de5349SHisping Lin TeecOperation.params[0].value.a = 0; 230c7de5349SHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 231c7de5349SHisping Lin TeecOperation.params[0].value.a = 0; 232c7de5349SHisping Lin #endif 233c7de5349SHisping Lin 234c7de5349SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 235c7de5349SHisping Lin &TeecSession, 236c7de5349SHisping Lin TeecUuid, 237c7de5349SHisping Lin TEEC_LOGIN_PUBLIC, 238c7de5349SHisping Lin NULL, 239c7de5349SHisping Lin &TeecOperation, 240c7de5349SHisping Lin &ErrorOrigin); 241c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 242c7de5349SHisping Lin return TeecResult; 243c7de5349SHisping Lin 244c7de5349SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 245c7de5349SHisping Lin 246c7de5349SHisping Lin SharedMem0.size = filename_size; 247c7de5349SHisping Lin SharedMem0.flags = 0; 248c7de5349SHisping Lin 249c7de5349SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 250c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 251c7de5349SHisping Lin goto exit; 252c7de5349SHisping Lin 253c7de5349SHisping Lin memcpy(SharedMem0.buffer, filename, SharedMem0.size); 254c7de5349SHisping Lin 255c7de5349SHisping Lin TEEC_SharedMemory SharedMem1 = {0}; 256c7de5349SHisping Lin 257c7de5349SHisping Lin SharedMem1.size = data_size; 258ae8ec5e1SHisping Lin SharedMem1.flags = 0; 259ae8ec5e1SHisping Lin 260ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 261f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 262f4e1db95SHisping Lin goto exit; 263ae8ec5e1SHisping Lin 264ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 265ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 266ae8ec5e1SHisping Lin 267ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 268ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem1.size; 269ae8ec5e1SHisping Lin 270ae8ec5e1SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 271ae8ec5e1SHisping Lin TEEC_MEMREF_TEMP_INOUT, 272ae8ec5e1SHisping Lin TEEC_NONE, 273ae8ec5e1SHisping Lin TEEC_NONE); 274ae8ec5e1SHisping Lin 275ae8ec5e1SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 276ae8ec5e1SHisping Lin 0, 277ae8ec5e1SHisping Lin &TeecOperation, 278ae8ec5e1SHisping Lin &ErrorOrigin); 27946b2a054SHisping Lin if (TeecResult == TEEC_SUCCESS) 280c7de5349SHisping Lin memcpy(data, SharedMem1.buffer, SharedMem1.size); 281f4e1db95SHisping Lin exit: 282ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 283ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem1); 284ae8ec5e1SHisping Lin TEEC_CloseSession(&TeecSession); 28546b2a054SHisping Lin TEEC_FinalizeContext(&TeecContext); 286ae8ec5e1SHisping Lin 287ae8ec5e1SHisping Lin return TeecResult; 288ae8ec5e1SHisping Lin } 289ae8ec5e1SHisping Lin 290c7de5349SHisping Lin static uint32_t trusty_base_end_security_data(void) 291c7de5349SHisping Lin { 292c7de5349SHisping Lin TEEC_Result TeecResult; 293c7de5349SHisping Lin TEEC_Context TeecContext; 294c7de5349SHisping Lin TEEC_Session TeecSession; 295c7de5349SHisping Lin uint32_t ErrorOrigin; 296c7de5349SHisping Lin TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 297c7de5349SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 298c7de5349SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 299c7de5349SHisping Lin TEEC_Operation TeecOperation = {0}; 300c7de5349SHisping Lin 301c7de5349SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 302c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 303c7de5349SHisping Lin return TeecResult; 304c7de5349SHisping Lin 305c7de5349SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 306c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 307c7de5349SHisping Lin return TeecResult; 308c7de5349SHisping Lin 309c7de5349SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 310c7de5349SHisping Lin &TeecSession, 311c7de5349SHisping Lin TeecUuid, 312c7de5349SHisping Lin TEEC_LOGIN_PUBLIC, 313c7de5349SHisping Lin NULL, 314c7de5349SHisping Lin NULL, 315c7de5349SHisping Lin &ErrorOrigin); 316c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 317c7de5349SHisping Lin return TeecResult; 318c7de5349SHisping Lin 319c7de5349SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE, 320c7de5349SHisping Lin TEEC_NONE, 321c7de5349SHisping Lin TEEC_NONE, 322c7de5349SHisping Lin TEEC_NONE); 323c7de5349SHisping Lin 324c7de5349SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 325c7de5349SHisping Lin 2, 326c7de5349SHisping Lin &TeecOperation, 327c7de5349SHisping Lin &ErrorOrigin); 328c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 329c7de5349SHisping Lin goto exit; 330c7de5349SHisping Lin exit: 331c7de5349SHisping Lin TEEC_CloseSession(&TeecSession); 332c7de5349SHisping Lin TEEC_FinalizeContext(&TeecContext); 333c7de5349SHisping Lin 334c7de5349SHisping Lin return TeecResult; 335c7de5349SHisping Lin } 336c7de5349SHisping Lin 33734f2e8f6SHisping Lin static void trusty_notify_always_use_security(void) 33834f2e8f6SHisping Lin { 33934f2e8f6SHisping Lin #if defined(CONFIG_OPTEE_V2) && defined(CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION) 34034f2e8f6SHisping Lin TEEC_Result TeecResult; 34134f2e8f6SHisping Lin TEEC_Context TeecContext; 34234f2e8f6SHisping Lin TEEC_Session TeecSession; 34334f2e8f6SHisping Lin uint32_t ErrorOrigin; 34434f2e8f6SHisping Lin TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 34534f2e8f6SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 34634f2e8f6SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 34734f2e8f6SHisping Lin TEEC_Operation TeecOperation = {0}; 34834f2e8f6SHisping Lin 34934f2e8f6SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 35034f2e8f6SHisping Lin if (TeecResult != TEEC_SUCCESS) 35134f2e8f6SHisping Lin return; 35234f2e8f6SHisping Lin 35334f2e8f6SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 35434f2e8f6SHisping Lin if (TeecResult != TEEC_SUCCESS) 35534f2e8f6SHisping Lin return; 35634f2e8f6SHisping Lin 35734f2e8f6SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 35834f2e8f6SHisping Lin &TeecSession, 35934f2e8f6SHisping Lin TeecUuid, 36034f2e8f6SHisping Lin TEEC_LOGIN_PUBLIC, 36134f2e8f6SHisping Lin NULL, 36234f2e8f6SHisping Lin NULL, 36334f2e8f6SHisping Lin &ErrorOrigin); 36434f2e8f6SHisping Lin if (TeecResult != TEEC_SUCCESS) 36534f2e8f6SHisping Lin return; 36634f2e8f6SHisping Lin 36734f2e8f6SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE, 36834f2e8f6SHisping Lin TEEC_NONE, 36934f2e8f6SHisping Lin TEEC_NONE, 37034f2e8f6SHisping Lin TEEC_NONE); 37134f2e8f6SHisping Lin 37234f2e8f6SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 37334f2e8f6SHisping Lin 9, 37434f2e8f6SHisping Lin &TeecOperation, 37534f2e8f6SHisping Lin &ErrorOrigin); 37634f2e8f6SHisping Lin if (TeecResult != TEEC_SUCCESS) 37734f2e8f6SHisping Lin debug("notify always use security fail! please update optee!"); 37834f2e8f6SHisping Lin 37934f2e8f6SHisping Lin TEEC_CloseSession(&TeecSession); 38034f2e8f6SHisping Lin TEEC_FinalizeContext(&TeecContext); 38134f2e8f6SHisping Lin 38234f2e8f6SHisping Lin return; 38334f2e8f6SHisping Lin #endif 38434f2e8f6SHisping Lin } 38534f2e8f6SHisping Lin 386c7de5349SHisping Lin uint32_t trusty_read_rollback_index(uint32_t slot, uint64_t *value) 387c7de5349SHisping Lin { 388c7de5349SHisping Lin char hs[9]; 389c7de5349SHisping Lin 390c7de5349SHisping Lin b2hs((uint8_t *)&slot, (uint8_t *)hs, 4, 9); 391c7de5349SHisping Lin 392c7de5349SHisping Lin return trusty_base_read_security_data(hs, 8, (uint8_t *)value, 8); 393c7de5349SHisping Lin } 394c7de5349SHisping Lin 395ae8ec5e1SHisping Lin uint32_t trusty_write_rollback_index(uint32_t slot, uint64_t value) 396ae8ec5e1SHisping Lin { 397c7de5349SHisping Lin char hs[9]; 3983251364cSHisping Lin 399c7de5349SHisping Lin b2hs((uint8_t *)&slot, (uint8_t *)hs, 4, 9); 400ae8ec5e1SHisping Lin 401c7de5349SHisping Lin return trusty_base_write_security_data(hs, 8, (uint8_t *)&value, 8); 402ae8ec5e1SHisping Lin } 403ae8ec5e1SHisping Lin 404ae8ec5e1SHisping Lin uint32_t trusty_read_permanent_attributes(uint8_t *attributes, uint32_t size) 405ae8ec5e1SHisping Lin { 406c7de5349SHisping Lin return trusty_base_read_security_data("attributes", 407c7de5349SHisping Lin sizeof("attributes"), attributes, size); 408ae8ec5e1SHisping Lin } 409ae8ec5e1SHisping Lin 410ae8ec5e1SHisping Lin uint32_t trusty_write_permanent_attributes(uint8_t *attributes, uint32_t size) 411ae8ec5e1SHisping Lin { 412c7de5349SHisping Lin return trusty_base_write_security_data("attributes", 413c7de5349SHisping Lin sizeof("attributes"), attributes, size); 4146651d4c0SJason Zhu } 415ae8ec5e1SHisping Lin 416c7de5349SHisping Lin uint32_t trusty_read_permanent_attributes_flag(uint8_t *attributes) 417c7de5349SHisping Lin { 418c7de5349SHisping Lin return trusty_base_read_security_data("attributes_flag", 419c7de5349SHisping Lin sizeof("attributes_flag"), attributes, 1); 420c7de5349SHisping Lin } 421ae8ec5e1SHisping Lin 422c7de5349SHisping Lin uint32_t trusty_write_permanent_attributes_flag(uint8_t attributes) 423c7de5349SHisping Lin { 424c7de5349SHisping Lin return trusty_base_write_security_data("attributes_flag", 425c7de5349SHisping Lin sizeof("attributes_flag"), &attributes, 1); 426ae8ec5e1SHisping Lin } 427ae8ec5e1SHisping Lin 428564654ebSJason Zhu uint32_t trusty_read_permanent_attributes_cer(uint8_t *attributes, 429564654ebSJason Zhu uint32_t size) 430564654ebSJason Zhu { 431c7de5349SHisping Lin return trusty_base_read_security_data("rsacer", 432c7de5349SHisping Lin sizeof("rsacer"), attributes, size); 433564654ebSJason Zhu } 434564654ebSJason Zhu 435564654ebSJason Zhu uint32_t trusty_write_permanent_attributes_cer(uint8_t *attributes, 436564654ebSJason Zhu uint32_t size) 437564654ebSJason Zhu { 438c7de5349SHisping Lin return trusty_base_write_security_data("rsacer", 439c7de5349SHisping Lin sizeof("rsacer"), attributes, size); 440564654ebSJason Zhu } 441564654ebSJason Zhu 442ae8ec5e1SHisping Lin uint32_t trusty_read_lock_state(uint8_t *lock_state) 443ae8ec5e1SHisping Lin { 444c7de5349SHisping Lin return trusty_base_read_security_data("lock_state", 445c7de5349SHisping Lin sizeof("lock_state"), lock_state, 1); 446ae8ec5e1SHisping Lin } 447ae8ec5e1SHisping Lin 448ae8ec5e1SHisping Lin uint32_t trusty_write_lock_state(uint8_t lock_state) 449ae8ec5e1SHisping Lin { 450c7de5349SHisping Lin return trusty_base_write_security_data("lock_state", 451c7de5349SHisping Lin sizeof("lock_state"), &lock_state, 1); 452ae8ec5e1SHisping Lin } 453ae8ec5e1SHisping Lin 454ae8ec5e1SHisping Lin uint32_t trusty_read_flash_lock_state(uint8_t *flash_lock_state) 455ae8ec5e1SHisping Lin { 456c7de5349SHisping Lin return trusty_base_read_security_data("flash_lock_state", 457c7de5349SHisping Lin sizeof("flash_lock_state"), flash_lock_state, 1); 458c7de5349SHisping Lin } 459c7de5349SHisping Lin 460c7de5349SHisping Lin uint32_t trusty_write_flash_lock_state(uint8_t flash_lock_state) 461c7de5349SHisping Lin { 462c7de5349SHisping Lin return trusty_base_write_security_data("flash_lock_state", 463c7de5349SHisping Lin sizeof("flash_lock_state"), &flash_lock_state, 1); 464c7de5349SHisping Lin } 465c7de5349SHisping Lin 466c7de5349SHisping Lin static uint32_t trusty_base_end_efuse_or_otp(void) 467c7de5349SHisping Lin { 468ae8ec5e1SHisping Lin TEEC_Result TeecResult; 469ae8ec5e1SHisping Lin TEEC_Context TeecContext; 470ae8ec5e1SHisping Lin TEEC_Session TeecSession; 471ae8ec5e1SHisping Lin uint32_t ErrorOrigin; 472c7de5349SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 473c7de5349SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 474c7de5349SHisping Lin 475ae8ec5e1SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 476ae8ec5e1SHisping Lin TEEC_Operation TeecOperation = {0}; 477ae8ec5e1SHisping Lin 478f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 479f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 480f4e1db95SHisping Lin return TeecResult; 481ae8ec5e1SHisping Lin 482ae8ec5e1SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 483f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 484f4e1db95SHisping Lin return TeecResult; 485ae8ec5e1SHisping Lin 486ae8ec5e1SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 487ae8ec5e1SHisping Lin &TeecSession, 488ae8ec5e1SHisping Lin TeecUuid, 489ae8ec5e1SHisping Lin TEEC_LOGIN_PUBLIC, 490ae8ec5e1SHisping Lin NULL, 491c7de5349SHisping Lin NULL, 492ae8ec5e1SHisping Lin &ErrorOrigin); 493f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 494f4e1db95SHisping Lin return TeecResult; 495ae8ec5e1SHisping Lin 496c7de5349SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE, 497c7de5349SHisping Lin TEEC_NONE, 498ae8ec5e1SHisping Lin TEEC_NONE, 499ae8ec5e1SHisping Lin TEEC_NONE); 500ae8ec5e1SHisping Lin 501ae8ec5e1SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 502c7de5349SHisping Lin STORAGE_CMD_UBOOT_END_OTP, 503ae8ec5e1SHisping Lin &TeecOperation, 504ae8ec5e1SHisping Lin &ErrorOrigin); 505c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 506c7de5349SHisping Lin goto exit; 507f4e1db95SHisping Lin exit: 508ae8ec5e1SHisping Lin TEEC_CloseSession(&TeecSession); 50946b2a054SHisping Lin TEEC_FinalizeContext(&TeecContext); 510ae8ec5e1SHisping Lin 511ae8ec5e1SHisping Lin return TeecResult; 512ae8ec5e1SHisping Lin } 513ae8ec5e1SHisping Lin 514c7de5349SHisping Lin static uint32_t trusty_base_efuse_or_otp_operation(uint32_t cmd, 515c7de5349SHisping Lin uint8_t is_write, 516c7de5349SHisping Lin uint32_t *buf, 517c7de5349SHisping Lin uint32_t length) 518ae8ec5e1SHisping Lin { 519ae8ec5e1SHisping Lin TEEC_Result TeecResult; 520ae8ec5e1SHisping Lin TEEC_Context TeecContext; 521ae8ec5e1SHisping Lin TEEC_Session TeecSession; 522ae8ec5e1SHisping Lin uint32_t ErrorOrigin; 523c7de5349SHisping Lin 524c7de5349SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 525c7de5349SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 526ae8ec5e1SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 527ae8ec5e1SHisping Lin TEEC_Operation TeecOperation = {0}; 528ae8ec5e1SHisping Lin 529f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 530f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 531f4e1db95SHisping Lin return TeecResult; 532ae8ec5e1SHisping Lin 533ae8ec5e1SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 534f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 535f4e1db95SHisping Lin return TeecResult; 536ae8ec5e1SHisping Lin 537ae8ec5e1SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 538ae8ec5e1SHisping Lin &TeecSession, 539ae8ec5e1SHisping Lin TeecUuid, 540ae8ec5e1SHisping Lin TEEC_LOGIN_PUBLIC, 541ae8ec5e1SHisping Lin NULL, 542c7de5349SHisping Lin NULL, 543ae8ec5e1SHisping Lin &ErrorOrigin); 544f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 545f4e1db95SHisping Lin return TeecResult; 546ae8ec5e1SHisping Lin 547ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 548ae8ec5e1SHisping Lin 549c7de5349SHisping Lin SharedMem0.size = length * sizeof(uint32_t); 550ae8ec5e1SHisping Lin SharedMem0.flags = 0; 551ae8ec5e1SHisping Lin 552ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 553f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 554f4e1db95SHisping Lin goto exit; 555ae8ec5e1SHisping Lin 556ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 557ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 558ae8ec5e1SHisping Lin 559c7de5349SHisping Lin if (is_write) { 560c7de5349SHisping Lin memcpy(SharedMem0.buffer, buf, SharedMem0.size); 561ae8ec5e1SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 562c7de5349SHisping Lin TEEC_NONE, 563ae8ec5e1SHisping Lin TEEC_NONE, 564ae8ec5e1SHisping Lin TEEC_NONE); 565ae8ec5e1SHisping Lin 566c7de5349SHisping Lin } else { 567c7de5349SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT, 568c7de5349SHisping Lin TEEC_NONE, 569c7de5349SHisping Lin TEEC_NONE, 570c7de5349SHisping Lin TEEC_NONE); 571c7de5349SHisping Lin } 572c7de5349SHisping Lin 573ae8ec5e1SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 574c7de5349SHisping Lin cmd, 575ae8ec5e1SHisping Lin &TeecOperation, 576ae8ec5e1SHisping Lin &ErrorOrigin); 577f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 578f4e1db95SHisping Lin goto exit; 579c7de5349SHisping Lin 580c7de5349SHisping Lin if (!is_write) 581c7de5349SHisping Lin memcpy(buf, SharedMem0.buffer, SharedMem0.size); 582c7de5349SHisping Lin 583f4e1db95SHisping Lin exit: 584ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 585ae8ec5e1SHisping Lin TEEC_CloseSession(&TeecSession); 58646b2a054SHisping Lin TEEC_FinalizeContext(&TeecContext); 587ae8ec5e1SHisping Lin 588ae8ec5e1SHisping Lin return TeecResult; 589ae8ec5e1SHisping Lin } 590ae8ec5e1SHisping Lin 5916ef445a4SHisping Lin uint32_t trusty_read_attribute_hash(uint32_t *buf, uint32_t length) 5926ef445a4SHisping Lin { 593c7de5349SHisping Lin return trusty_base_efuse_or_otp_operation(STORAGE_CMD_READ_ATTRIBUTE_HASH, 594c7de5349SHisping Lin false, buf, length); 5956ef445a4SHisping Lin } 5966ef445a4SHisping Lin 5976ef445a4SHisping Lin uint32_t trusty_write_attribute_hash(uint32_t *buf, uint32_t length) 5986ef445a4SHisping Lin { 599c7de5349SHisping Lin return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_ATTRIBUTE_HASH, 600c7de5349SHisping Lin true, buf, length); 60116539616SHisping Lin } 60216539616SHisping Lin 60316539616SHisping Lin uint32_t trusty_notify_optee_uboot_end(void) 60416539616SHisping Lin { 60516539616SHisping Lin TEEC_Result res; 606c7de5349SHisping Lin 607c7de5349SHisping Lin res = trusty_base_end_security_data(); 608c7de5349SHisping Lin res |= trusty_base_end_efuse_or_otp(); 60916539616SHisping Lin return res; 61016539616SHisping Lin } 6112cd27853SHisping Lin 6122cd27853SHisping Lin uint32_t trusty_read_vbootkey_hash(uint32_t *buf, uint32_t length) 6132cd27853SHisping Lin { 614c7de5349SHisping Lin return trusty_base_efuse_or_otp_operation(STORAGE_CMD_READ_VBOOTKEY_HASH, 615c7de5349SHisping Lin false, buf, length); 6162cd27853SHisping Lin } 617c7de5349SHisping Lin 6182cd27853SHisping Lin uint32_t trusty_write_vbootkey_hash(uint32_t *buf, uint32_t length) 6192cd27853SHisping Lin { 620c7de5349SHisping Lin return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_VBOOTKEY_HASH, 621c7de5349SHisping Lin true, buf, length); 6222cd27853SHisping Lin } 623095e2a82SHisping Lin 624468df3b2SHisping Lin uint32_t trusty_read_vbootkey_enable_flag(uint8_t *flag) 625468df3b2SHisping Lin { 626468df3b2SHisping Lin uint32_t bootflag; 627c7de5349SHisping Lin TEEC_Result TeecResult; 628468df3b2SHisping Lin 629f07e1686SHisping Lin *flag = 0; 630f07e1686SHisping Lin 631c7de5349SHisping Lin TeecResult = trusty_base_efuse_or_otp_operation(STORAGE_CMD_READ_ENABLE_FLAG, 632c7de5349SHisping Lin false, &bootflag, 1); 633468df3b2SHisping Lin 634468df3b2SHisping Lin if (TeecResult == TEEC_SUCCESS) { 6350202ee8aSHisping Lin #if defined(CONFIG_ROCKCHIP_RK3288) 6360202ee8aSHisping Lin if (bootflag == 0x00000001) 6370202ee8aSHisping Lin *flag = 1; 6380202ee8aSHisping Lin #else 639468df3b2SHisping Lin if (bootflag == 0x000000FF) 640468df3b2SHisping Lin *flag = 1; 6410202ee8aSHisping Lin #endif 642468df3b2SHisping Lin } 643095e2a82SHisping Lin return TeecResult; 644095e2a82SHisping Lin } 6454aa61755SAndy Ye 6461ef63c75SHisping Lin uint32_t trusty_write_ta_encryption_key(uint32_t *buf, uint32_t length) 6471ef63c75SHisping Lin { 6481ef63c75SHisping Lin return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_TA_ENCRYPTION_KEY, 6491ef63c75SHisping Lin true, buf, length); 6501ef63c75SHisping Lin } 6511ef63c75SHisping Lin 65210f41197SHisping Lin uint32_t trusty_ta_encryption_key_is_written(uint8_t *value) 65310f41197SHisping Lin { 65410f41197SHisping Lin TEEC_Result TeecResult; 65510f41197SHisping Lin TEEC_Context TeecContext; 65610f41197SHisping Lin TEEC_Session TeecSession; 65710f41197SHisping Lin uint32_t ErrorOrigin; 65810f41197SHisping Lin 65910f41197SHisping Lin *value = 0; 66010f41197SHisping Lin 66110f41197SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 66210f41197SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 66310f41197SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 66410f41197SHisping Lin TEEC_Operation TeecOperation = {0}; 66510f41197SHisping Lin 66610f41197SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 66710f41197SHisping Lin if (TeecResult != TEEC_SUCCESS) 66810f41197SHisping Lin return TeecResult; 66910f41197SHisping Lin 67010f41197SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 67110f41197SHisping Lin if (TeecResult != TEEC_SUCCESS) 67210f41197SHisping Lin return TeecResult; 67310f41197SHisping Lin 67410f41197SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 67510f41197SHisping Lin &TeecSession, 67610f41197SHisping Lin TeecUuid, 67710f41197SHisping Lin TEEC_LOGIN_PUBLIC, 67810f41197SHisping Lin NULL, 67910f41197SHisping Lin NULL, 68010f41197SHisping Lin &ErrorOrigin); 68110f41197SHisping Lin if (TeecResult != TEEC_SUCCESS) 68210f41197SHisping Lin return TeecResult; 68310f41197SHisping Lin 68410f41197SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_OUTPUT, 68510f41197SHisping Lin TEEC_NONE, 68610f41197SHisping Lin TEEC_NONE, 68710f41197SHisping Lin TEEC_NONE); 68810f41197SHisping Lin 68910f41197SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 69010f41197SHisping Lin STORAGE_CMD_TA_ENCRYPTION_KEY_IS_WRITTEN, 69110f41197SHisping Lin &TeecOperation, 69210f41197SHisping Lin &ErrorOrigin); 69310f41197SHisping Lin if (TeecResult == TEEC_SUCCESS) 69410f41197SHisping Lin *value = TeecOperation.params[0].value.a; 69510f41197SHisping Lin 69610f41197SHisping Lin TEEC_CloseSession(&TeecSession); 69710f41197SHisping Lin TEEC_FinalizeContext(&TeecContext); 69810f41197SHisping Lin 69910f41197SHisping Lin return TeecResult; 70010f41197SHisping Lin } 70110f41197SHisping Lin 702fbf29bfbSHisping Lin uint32_t trusty_check_security_level_flag(uint8_t flag) 703fbf29bfbSHisping Lin { 704fbf29bfbSHisping Lin uint32_t levelflag; 705fbf29bfbSHisping Lin 706fbf29bfbSHisping Lin levelflag = flag; 707fbf29bfbSHisping Lin return trusty_base_efuse_or_otp_operation(STORAGE_CMD_CHECK_SECURITY_LEVEL_FLAG, 708fbf29bfbSHisping Lin true, &levelflag, 1); 709fbf29bfbSHisping Lin } 710fbf29bfbSHisping Lin 711f39d4289SHisping Lin uint32_t trusty_write_oem_huk(uint32_t *buf, uint32_t length) 712f39d4289SHisping Lin { 713f39d4289SHisping Lin return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_OEM_HUK, 714f39d4289SHisping Lin true, buf, length); 715f39d4289SHisping Lin } 716f39d4289SHisping Lin 71734f2e8f6SHisping Lin static void trusty_select_security_level(void) 7187504da74SHisping Lin { 7197504da74SHisping Lin #if (CONFIG_OPTEE_SECURITY_LEVEL > 0) 7207504da74SHisping Lin TEEC_Result TeecResult; 7217504da74SHisping Lin 7227504da74SHisping Lin TeecResult = trusty_check_security_level_flag(CONFIG_OPTEE_SECURITY_LEVEL); 7237504da74SHisping Lin if (TeecResult == TEE_ERROR_CANCEL) { 7247504da74SHisping Lin run_command("download", 0); 7257504da74SHisping Lin return; 7267504da74SHisping Lin } 7277504da74SHisping Lin 7287504da74SHisping Lin if (TeecResult == TEEC_SUCCESS) 7297504da74SHisping Lin debug("optee select security level success!"); 7307504da74SHisping Lin else 7317504da74SHisping Lin panic("optee select security level fail!"); 7327504da74SHisping Lin 7337504da74SHisping Lin return; 7347504da74SHisping Lin #endif 7357504da74SHisping Lin } 7367504da74SHisping Lin 73751ac7005SHisping Lin void optee_client_init(void) 73851ac7005SHisping Lin { 73951ac7005SHisping Lin trusty_select_security_level(); 74034f2e8f6SHisping Lin trusty_notify_always_use_security(); 74151ac7005SHisping Lin } 74251ac7005SHisping Lin 743d5913350SHisping Lin uint32_t trusty_write_oem_ns_otp(uint32_t byte_off, uint8_t *byte_buf, uint32_t byte_len) 744d5913350SHisping Lin { 745d5913350SHisping Lin TEEC_Result TeecResult; 746d5913350SHisping Lin TEEC_Context TeecContext; 747d5913350SHisping Lin TEEC_Session TeecSession; 748d5913350SHisping Lin uint32_t ErrorOrigin; 749d5913350SHisping Lin 750d5913350SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 751d5913350SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 752d5913350SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 753d5913350SHisping Lin TEEC_Operation TeecOperation = {0}; 754d5913350SHisping Lin 755d5913350SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 756d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 757d5913350SHisping Lin return TeecResult; 758d5913350SHisping Lin 759d5913350SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 760d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 761d5913350SHisping Lin return TeecResult; 762d5913350SHisping Lin 763d5913350SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 764d5913350SHisping Lin &TeecSession, 765d5913350SHisping Lin TeecUuid, 766d5913350SHisping Lin TEEC_LOGIN_PUBLIC, 767d5913350SHisping Lin NULL, 768d5913350SHisping Lin NULL, 769d5913350SHisping Lin &ErrorOrigin); 770d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 771d5913350SHisping Lin return TeecResult; 772d5913350SHisping Lin 773d5913350SHisping Lin TeecOperation.params[0].value.a = byte_off; 774d5913350SHisping Lin 775d5913350SHisping Lin TEEC_SharedMemory SharedMem = {0}; 776d5913350SHisping Lin 777d5913350SHisping Lin SharedMem.size = byte_len; 778d5913350SHisping Lin SharedMem.flags = 0; 779d5913350SHisping Lin 780d5913350SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem); 781d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 782d5913350SHisping Lin goto exit; 783d5913350SHisping Lin 784d5913350SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem.buffer; 785d5913350SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem.size; 786d5913350SHisping Lin 787d5913350SHisping Lin memcpy(SharedMem.buffer, byte_buf, SharedMem.size); 788d5913350SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 789d5913350SHisping Lin TEEC_MEMREF_TEMP_INPUT, 790d5913350SHisping Lin TEEC_NONE, 791d5913350SHisping Lin TEEC_NONE); 792d5913350SHisping Lin 793d5913350SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 794d5913350SHisping Lin STORAGE_CMD_WRITE_OEM_NS_OTP, 795d5913350SHisping Lin &TeecOperation, 796d5913350SHisping Lin &ErrorOrigin); 797d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 798d5913350SHisping Lin goto exit; 799d5913350SHisping Lin 800d5913350SHisping Lin exit: 801d5913350SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem); 802d5913350SHisping Lin TEEC_CloseSession(&TeecSession); 803d5913350SHisping Lin TEEC_FinalizeContext(&TeecContext); 804d5913350SHisping Lin 805d5913350SHisping Lin return TeecResult; 806d5913350SHisping Lin } 807d5913350SHisping Lin 808d5913350SHisping Lin uint32_t trusty_read_oem_ns_otp(uint32_t byte_off, uint8_t *byte_buf, uint32_t byte_len) 809d5913350SHisping Lin { 810d5913350SHisping Lin TEEC_Result TeecResult; 811d5913350SHisping Lin TEEC_Context TeecContext; 812d5913350SHisping Lin TEEC_Session TeecSession; 813d5913350SHisping Lin uint32_t ErrorOrigin; 814d5913350SHisping Lin 815d5913350SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 816d5913350SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 817d5913350SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 818d5913350SHisping Lin TEEC_Operation TeecOperation = {0}; 819d5913350SHisping Lin 820d5913350SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 821d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 822d5913350SHisping Lin return TeecResult; 823d5913350SHisping Lin 824d5913350SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 825d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 826d5913350SHisping Lin return TeecResult; 827d5913350SHisping Lin 828d5913350SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 829d5913350SHisping Lin &TeecSession, 830d5913350SHisping Lin TeecUuid, 831d5913350SHisping Lin TEEC_LOGIN_PUBLIC, 832d5913350SHisping Lin NULL, 833d5913350SHisping Lin NULL, 834d5913350SHisping Lin &ErrorOrigin); 835d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 836d5913350SHisping Lin return TeecResult; 837d5913350SHisping Lin 838d5913350SHisping Lin TeecOperation.params[0].value.a = byte_off; 839d5913350SHisping Lin 840d5913350SHisping Lin TEEC_SharedMemory SharedMem = {0}; 841d5913350SHisping Lin 842d5913350SHisping Lin SharedMem.size = byte_len; 843d5913350SHisping Lin SharedMem.flags = 0; 844d5913350SHisping Lin 845d5913350SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem); 846d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 847d5913350SHisping Lin goto exit; 848d5913350SHisping Lin 849d5913350SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem.buffer; 850d5913350SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem.size; 851d5913350SHisping Lin 852d5913350SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 853d5913350SHisping Lin TEEC_MEMREF_TEMP_OUTPUT, 854d5913350SHisping Lin TEEC_NONE, 855d5913350SHisping Lin TEEC_NONE); 856d5913350SHisping Lin 857d5913350SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 858d5913350SHisping Lin STORAGE_CMD_READ_OEM_NS_OTP, 859d5913350SHisping Lin &TeecOperation, 860d5913350SHisping Lin &ErrorOrigin); 861d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 862d5913350SHisping Lin goto exit; 863d5913350SHisping Lin 864d5913350SHisping Lin memcpy(byte_buf, SharedMem.buffer, SharedMem.size); 865d5913350SHisping Lin 866d5913350SHisping Lin exit: 867d5913350SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem); 868d5913350SHisping Lin TEEC_CloseSession(&TeecSession); 869d5913350SHisping Lin TEEC_FinalizeContext(&TeecContext); 870d5913350SHisping Lin 871d5913350SHisping Lin return TeecResult; 872d5913350SHisping Lin } 873d5913350SHisping Lin 87490e849a0Sxb.wang uint32_t trusty_write_oem_otp_key(enum RK_OEM_OTP_KEYID key_id, 875bb1ba6acSHisping Lin uint8_t *byte_buf, uint32_t byte_len) 876bb1ba6acSHisping Lin { 877bb1ba6acSHisping Lin TEEC_Result TeecResult; 878bb1ba6acSHisping Lin TEEC_Context TeecContext; 879bb1ba6acSHisping Lin TEEC_Session TeecSession; 880bb1ba6acSHisping Lin uint32_t ErrorOrigin; 881bb1ba6acSHisping Lin 882bb1ba6acSHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 883bb1ba6acSHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 884bb1ba6acSHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 885bb1ba6acSHisping Lin TEEC_Operation TeecOperation = {0}; 886bb1ba6acSHisping Lin 887bb1ba6acSHisping Lin TeecResult = OpteeClientApiLibInitialize(); 888bb1ba6acSHisping Lin if (TeecResult != TEEC_SUCCESS) 889bb1ba6acSHisping Lin return TeecResult; 890bb1ba6acSHisping Lin 891bb1ba6acSHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 892bb1ba6acSHisping Lin if (TeecResult != TEEC_SUCCESS) 893bb1ba6acSHisping Lin return TeecResult; 894bb1ba6acSHisping Lin 895bb1ba6acSHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 896bb1ba6acSHisping Lin &TeecSession, 897bb1ba6acSHisping Lin TeecUuid, 898bb1ba6acSHisping Lin TEEC_LOGIN_PUBLIC, 899bb1ba6acSHisping Lin NULL, 900bb1ba6acSHisping Lin NULL, 901bb1ba6acSHisping Lin &ErrorOrigin); 902bb1ba6acSHisping Lin if (TeecResult != TEEC_SUCCESS) 903bb1ba6acSHisping Lin return TeecResult; 904bb1ba6acSHisping Lin 905bb1ba6acSHisping Lin TeecOperation.params[0].value.a = key_id; 906bb1ba6acSHisping Lin 907bb1ba6acSHisping Lin TEEC_SharedMemory SharedMem = {0}; 908bb1ba6acSHisping Lin 909bb1ba6acSHisping Lin SharedMem.size = byte_len; 910bb1ba6acSHisping Lin SharedMem.flags = 0; 911bb1ba6acSHisping Lin 912bb1ba6acSHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem); 913bb1ba6acSHisping Lin if (TeecResult != TEEC_SUCCESS) 914bb1ba6acSHisping Lin goto exit; 915bb1ba6acSHisping Lin 916bb1ba6acSHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem.buffer; 917bb1ba6acSHisping Lin TeecOperation.params[1].tmpref.size = SharedMem.size; 918bb1ba6acSHisping Lin 919bb1ba6acSHisping Lin memcpy(SharedMem.buffer, byte_buf, SharedMem.size); 920bb1ba6acSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 921bb1ba6acSHisping Lin TEEC_MEMREF_TEMP_INPUT, 922bb1ba6acSHisping Lin TEEC_NONE, 923bb1ba6acSHisping Lin TEEC_NONE); 924bb1ba6acSHisping Lin 925bb1ba6acSHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 92690e849a0Sxb.wang STORAGE_CMD_WRITE_OEM_OTP_KEY, 927bb1ba6acSHisping Lin &TeecOperation, 928bb1ba6acSHisping Lin &ErrorOrigin); 929bb1ba6acSHisping Lin if (TeecResult != TEEC_SUCCESS) 930bb1ba6acSHisping Lin goto exit; 931bb1ba6acSHisping Lin 932bb1ba6acSHisping Lin exit: 933bb1ba6acSHisping Lin TEEC_ReleaseSharedMemory(&SharedMem); 934bb1ba6acSHisping Lin TEEC_CloseSession(&TeecSession); 935bb1ba6acSHisping Lin TEEC_FinalizeContext(&TeecContext); 936bb1ba6acSHisping Lin 937bb1ba6acSHisping Lin return TeecResult; 938bb1ba6acSHisping Lin } 939bb1ba6acSHisping Lin 9409deb34f6SHisping Lin uint32_t trusty_oem_otp_key_is_written(enum RK_OEM_OTP_KEYID key_id, uint8_t *value) 9419deb34f6SHisping Lin { 9429deb34f6SHisping Lin TEEC_Result TeecResult; 9439deb34f6SHisping Lin TEEC_Context TeecContext; 9449deb34f6SHisping Lin TEEC_Session TeecSession; 9459deb34f6SHisping Lin uint32_t ErrorOrigin; 9469deb34f6SHisping Lin 9479deb34f6SHisping Lin *value = 0xFF; 9489deb34f6SHisping Lin 9499deb34f6SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 9509deb34f6SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 9519deb34f6SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 9529deb34f6SHisping Lin TEEC_Operation TeecOperation = {0}; 9539deb34f6SHisping Lin 9549deb34f6SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 9559deb34f6SHisping Lin if (TeecResult != TEEC_SUCCESS) 9569deb34f6SHisping Lin return TeecResult; 9579deb34f6SHisping Lin 9589deb34f6SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 9599deb34f6SHisping Lin if (TeecResult != TEEC_SUCCESS) 9609deb34f6SHisping Lin return TeecResult; 9619deb34f6SHisping Lin 9629deb34f6SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 9639deb34f6SHisping Lin &TeecSession, 9649deb34f6SHisping Lin TeecUuid, 9659deb34f6SHisping Lin TEEC_LOGIN_PUBLIC, 9669deb34f6SHisping Lin NULL, 9679deb34f6SHisping Lin NULL, 9689deb34f6SHisping Lin &ErrorOrigin); 9699deb34f6SHisping Lin if (TeecResult != TEEC_SUCCESS) 9709deb34f6SHisping Lin return TeecResult; 9719deb34f6SHisping Lin 9729deb34f6SHisping Lin TeecOperation.params[0].value.a = key_id; 9739deb34f6SHisping Lin 9749deb34f6SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INOUT, 9759deb34f6SHisping Lin TEEC_NONE, 9769deb34f6SHisping Lin TEEC_NONE, 9779deb34f6SHisping Lin TEEC_NONE); 9789deb34f6SHisping Lin 9799deb34f6SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 9809deb34f6SHisping Lin STORAGE_CMD_OEM_OTP_KEY_IS_WRITTEN, 9819deb34f6SHisping Lin &TeecOperation, 9829deb34f6SHisping Lin &ErrorOrigin); 9839deb34f6SHisping Lin if (TeecResult == TEEC_SUCCESS) 9849deb34f6SHisping Lin *value = TeecOperation.params[0].value.b; 9859deb34f6SHisping Lin 9869deb34f6SHisping Lin TEEC_CloseSession(&TeecSession); 9879deb34f6SHisping Lin TEEC_FinalizeContext(&TeecContext); 9889deb34f6SHisping Lin 9899deb34f6SHisping Lin return TeecResult; 9909deb34f6SHisping Lin } 9919deb34f6SHisping Lin 99290e849a0Sxb.wang uint32_t trusty_set_oem_hr_otp_read_lock(enum RK_OEM_OTP_KEYID key_id) 993a405238aSHisping Lin { 994a405238aSHisping Lin TEEC_Result TeecResult; 995a405238aSHisping Lin TEEC_Context TeecContext; 996a405238aSHisping Lin TEEC_Session TeecSession; 997a405238aSHisping Lin uint32_t ErrorOrigin; 998a405238aSHisping Lin 999a405238aSHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 1000a405238aSHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 1001a405238aSHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 1002a405238aSHisping Lin TEEC_Operation TeecOperation = {0}; 1003a405238aSHisping Lin 1004a405238aSHisping Lin TeecResult = OpteeClientApiLibInitialize(); 1005a405238aSHisping Lin if (TeecResult != TEEC_SUCCESS) 1006a405238aSHisping Lin return TeecResult; 1007a405238aSHisping Lin 1008a405238aSHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1009a405238aSHisping Lin if (TeecResult != TEEC_SUCCESS) 1010a405238aSHisping Lin return TeecResult; 1011a405238aSHisping Lin 1012a405238aSHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 1013a405238aSHisping Lin &TeecSession, 1014a405238aSHisping Lin TeecUuid, 1015a405238aSHisping Lin TEEC_LOGIN_PUBLIC, 1016a405238aSHisping Lin NULL, 1017a405238aSHisping Lin NULL, 1018a405238aSHisping Lin &ErrorOrigin); 1019a405238aSHisping Lin if (TeecResult != TEEC_SUCCESS) 1020a405238aSHisping Lin return TeecResult; 1021a405238aSHisping Lin 1022a405238aSHisping Lin TeecOperation.params[0].value.a = key_id; 1023a405238aSHisping Lin 1024a405238aSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 1025a405238aSHisping Lin TEEC_NONE, 1026a405238aSHisping Lin TEEC_NONE, 1027a405238aSHisping Lin TEEC_NONE); 1028a405238aSHisping Lin 1029a405238aSHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 1030a405238aSHisping Lin STORAGE_CMD_SET_OEM_HR_OTP_READ_LOCK, 1031a405238aSHisping Lin &TeecOperation, 1032a405238aSHisping Lin &ErrorOrigin); 1033a405238aSHisping Lin if (TeecResult != TEEC_SUCCESS) 1034a405238aSHisping Lin goto exit; 1035a405238aSHisping Lin 1036a405238aSHisping Lin exit: 1037a405238aSHisping Lin TEEC_CloseSession(&TeecSession); 1038a405238aSHisping Lin TEEC_FinalizeContext(&TeecContext); 1039a405238aSHisping Lin 1040a405238aSHisping Lin return TeecResult; 1041a405238aSHisping Lin } 1042a405238aSHisping Lin 10432f8c34bdSxb.wang uint32_t trusty_oem_otp_key_cipher(enum RK_OEM_OTP_KEYID key_id, rk_cipher_config *config, 10442f8c34bdSxb.wang uint32_t src_phys_addr, uint32_t dst_phys_addr, 10452f8c34bdSxb.wang uint32_t len) 1046fc3694d6Sxb.wang { 1047fc3694d6Sxb.wang TEEC_Result TeecResult; 1048fc3694d6Sxb.wang TEEC_Context TeecContext; 1049fc3694d6Sxb.wang TEEC_Session TeecSession; 1050fc3694d6Sxb.wang TEEC_Operation TeecOperation = {0}; 1051fc3694d6Sxb.wang uint32_t ErrorOrigin; 1052fc3694d6Sxb.wang TEEC_UUID uuid = RK_CRYPTO_SERVICE_UUID; 1053fc3694d6Sxb.wang TEEC_SharedMemory SharedMem_config = {0}; 1054fc3694d6Sxb.wang 10552f8c34bdSxb.wang if (key_id != RK_OEM_OTP_KEY0 && 10562f8c34bdSxb.wang key_id != RK_OEM_OTP_KEY1 && 10572f8c34bdSxb.wang key_id != RK_OEM_OTP_KEY2 && 10582f8c34bdSxb.wang key_id != RK_OEM_OTP_KEY3 && 10592f8c34bdSxb.wang key_id != RK_OEM_OTP_KEY_FW) 1060fc3694d6Sxb.wang return TEEC_ERROR_BAD_PARAMETERS; 1061fc3694d6Sxb.wang 10622f8c34bdSxb.wang if (!config) 1063fc3694d6Sxb.wang return TEEC_ERROR_BAD_PARAMETERS; 1064fc3694d6Sxb.wang 1065fc3694d6Sxb.wang if (config->algo != RK_ALGO_AES && config->algo != RK_ALGO_SM4) 1066fc3694d6Sxb.wang return TEEC_ERROR_BAD_PARAMETERS; 1067fc3694d6Sxb.wang 1068fc3694d6Sxb.wang if (config->mode >= RK_CIPHER_MODE_XTS) 1069fc3694d6Sxb.wang return TEEC_ERROR_BAD_PARAMETERS; 1070fc3694d6Sxb.wang 1071fc3694d6Sxb.wang if (config->operation != RK_MODE_ENCRYPT && 1072fc3694d6Sxb.wang config->operation != RK_MODE_DECRYPT) 1073fc3694d6Sxb.wang return TEEC_ERROR_BAD_PARAMETERS; 1074fc3694d6Sxb.wang 1075fc3694d6Sxb.wang if (config->key_len != 16 && 1076fc3694d6Sxb.wang config->key_len != 24 && 1077fc3694d6Sxb.wang config->key_len != 32) 1078fc3694d6Sxb.wang return TEEC_ERROR_BAD_PARAMETERS; 1079fc3694d6Sxb.wang 10802f8c34bdSxb.wang if (key_id == RK_OEM_OTP_KEY_FW && config->key_len != 16) 10812f8c34bdSxb.wang return TEEC_ERROR_BAD_PARAMETERS; 10822f8c34bdSxb.wang 10832f8c34bdSxb.wang #if defined(CONFIG_ROCKCHIP_RV1126) 10842f8c34bdSxb.wang if (config->key_len == 24) 10852f8c34bdSxb.wang return TEEC_ERROR_BAD_PARAMETERS; 10862f8c34bdSxb.wang #endif 10872f8c34bdSxb.wang 1088fc3694d6Sxb.wang if (len % AES_BLOCK_SIZE || 1089fc3694d6Sxb.wang len == 0) 1090fc3694d6Sxb.wang return TEEC_ERROR_BAD_PARAMETERS; 1091fc3694d6Sxb.wang 10922f8c34bdSxb.wang if (!src_phys_addr || !dst_phys_addr) 10932f8c34bdSxb.wang return TEEC_ERROR_BAD_PARAMETERS; 10942f8c34bdSxb.wang 1095fc3694d6Sxb.wang TeecResult = OpteeClientApiLibInitialize(); 1096fc3694d6Sxb.wang if (TeecResult != TEEC_SUCCESS) 1097fc3694d6Sxb.wang return TeecResult; 1098fc3694d6Sxb.wang 1099fc3694d6Sxb.wang TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1100fc3694d6Sxb.wang if (TeecResult != TEEC_SUCCESS) 1101fc3694d6Sxb.wang return TeecResult; 1102fc3694d6Sxb.wang 1103fc3694d6Sxb.wang TeecResult = TEEC_OpenSession(&TeecContext, 1104fc3694d6Sxb.wang &TeecSession, 1105fc3694d6Sxb.wang &uuid, 1106fc3694d6Sxb.wang TEEC_LOGIN_PUBLIC, 1107fc3694d6Sxb.wang NULL, 1108fc3694d6Sxb.wang NULL, 1109fc3694d6Sxb.wang &ErrorOrigin); 1110fc3694d6Sxb.wang if (TeecResult != TEEC_SUCCESS) 1111fc3694d6Sxb.wang goto exit; 1112fc3694d6Sxb.wang 1113fc3694d6Sxb.wang SharedMem_config.size = sizeof(rk_cipher_config); 1114fc3694d6Sxb.wang TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem_config); 1115fc3694d6Sxb.wang if (TeecResult != TEEC_SUCCESS) 1116fc3694d6Sxb.wang goto exit; 1117fc3694d6Sxb.wang 1118fc3694d6Sxb.wang memcpy(SharedMem_config.buffer, config, sizeof(rk_cipher_config)); 1119fc3694d6Sxb.wang TeecOperation.params[0].value.a = key_id; 1120fc3694d6Sxb.wang TeecOperation.params[1].tmpref.buffer = SharedMem_config.buffer; 1121fc3694d6Sxb.wang TeecOperation.params[1].tmpref.size = SharedMem_config.size; 11222f8c34bdSxb.wang TeecOperation.params[2].value.a = src_phys_addr; 11232f8c34bdSxb.wang TeecOperation.params[2].value.b = len; 11242f8c34bdSxb.wang TeecOperation.params[3].value.a = dst_phys_addr; 1125fc3694d6Sxb.wang TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 1126fc3694d6Sxb.wang TEEC_MEMREF_TEMP_INPUT, 11272f8c34bdSxb.wang TEEC_VALUE_INPUT, 11282f8c34bdSxb.wang TEEC_VALUE_INPUT); 11292f8c34bdSxb.wang 11302f8c34bdSxb.wang crypto_flush_cacheline(src_phys_addr, len); 11312f8c34bdSxb.wang crypto_flush_cacheline(dst_phys_addr, len); 11322f8c34bdSxb.wang 1133fc3694d6Sxb.wang TeecResult = TEEC_InvokeCommand(&TeecSession, 11342f8c34bdSxb.wang CRYPTO_SERVICE_CMD_OEM_OTP_KEY_PHYS_CIPHER, 1135fc3694d6Sxb.wang &TeecOperation, 1136fc3694d6Sxb.wang &ErrorOrigin); 1137fc3694d6Sxb.wang 1138a900eef3SHisping Lin crypto_invalidate_cacheline(dst_phys_addr, len); 1139a900eef3SHisping Lin 1140fc3694d6Sxb.wang exit: 1141fc3694d6Sxb.wang TEEC_ReleaseSharedMemory(&SharedMem_config); 1142fc3694d6Sxb.wang TEEC_CloseSession(&TeecSession); 1143fc3694d6Sxb.wang TEEC_FinalizeContext(&TeecContext); 1144fc3694d6Sxb.wang return TeecResult; 1145fc3694d6Sxb.wang } 1146fc3694d6Sxb.wang 1147*a828eba9SHisping Lin uint32_t trusty_write_oem_hdcp_key(enum RK_HDCP_KEYID key_id, 1148*a828eba9SHisping Lin uint8_t *byte_buf, uint32_t byte_len) 1149*a828eba9SHisping Lin { 1150*a828eba9SHisping Lin TEEC_Result TeecResult; 1151*a828eba9SHisping Lin TEEC_Context TeecContext; 1152*a828eba9SHisping Lin TEEC_Session TeecSession; 1153*a828eba9SHisping Lin uint32_t ErrorOrigin; 1154*a828eba9SHisping Lin 1155*a828eba9SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 1156*a828eba9SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 1157*a828eba9SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 1158*a828eba9SHisping Lin TEEC_Operation TeecOperation = {0}; 1159*a828eba9SHisping Lin 1160*a828eba9SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 1161*a828eba9SHisping Lin if (TeecResult != TEEC_SUCCESS) 1162*a828eba9SHisping Lin return TeecResult; 1163*a828eba9SHisping Lin 1164*a828eba9SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1165*a828eba9SHisping Lin if (TeecResult != TEEC_SUCCESS) 1166*a828eba9SHisping Lin return TeecResult; 1167*a828eba9SHisping Lin 1168*a828eba9SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 1169*a828eba9SHisping Lin &TeecSession, 1170*a828eba9SHisping Lin TeecUuid, 1171*a828eba9SHisping Lin TEEC_LOGIN_PUBLIC, 1172*a828eba9SHisping Lin NULL, 1173*a828eba9SHisping Lin NULL, 1174*a828eba9SHisping Lin &ErrorOrigin); 1175*a828eba9SHisping Lin if (TeecResult != TEEC_SUCCESS) 1176*a828eba9SHisping Lin return TeecResult; 1177*a828eba9SHisping Lin 1178*a828eba9SHisping Lin TeecOperation.params[0].value.a = key_id; 1179*a828eba9SHisping Lin 1180*a828eba9SHisping Lin TEEC_SharedMemory SharedMem = {0}; 1181*a828eba9SHisping Lin 1182*a828eba9SHisping Lin SharedMem.size = byte_len; 1183*a828eba9SHisping Lin SharedMem.flags = 0; 1184*a828eba9SHisping Lin 1185*a828eba9SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem); 1186*a828eba9SHisping Lin if (TeecResult != TEEC_SUCCESS) 1187*a828eba9SHisping Lin goto exit; 1188*a828eba9SHisping Lin 1189*a828eba9SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem.buffer; 1190*a828eba9SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem.size; 1191*a828eba9SHisping Lin 1192*a828eba9SHisping Lin memcpy(SharedMem.buffer, byte_buf, SharedMem.size); 1193*a828eba9SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 1194*a828eba9SHisping Lin TEEC_MEMREF_TEMP_INPUT, 1195*a828eba9SHisping Lin TEEC_NONE, 1196*a828eba9SHisping Lin TEEC_NONE); 1197*a828eba9SHisping Lin 1198*a828eba9SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 1199*a828eba9SHisping Lin STORAGE_CMD_WRITE_OEM_HDCP_KEY, 1200*a828eba9SHisping Lin &TeecOperation, 1201*a828eba9SHisping Lin &ErrorOrigin); 1202*a828eba9SHisping Lin if (TeecResult != TEEC_SUCCESS) 1203*a828eba9SHisping Lin goto exit; 1204*a828eba9SHisping Lin 1205*a828eba9SHisping Lin exit: 1206*a828eba9SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem); 1207*a828eba9SHisping Lin TEEC_CloseSession(&TeecSession); 1208*a828eba9SHisping Lin TEEC_FinalizeContext(&TeecContext); 1209*a828eba9SHisping Lin 1210*a828eba9SHisping Lin return TeecResult; 1211*a828eba9SHisping Lin } 1212*a828eba9SHisping Lin 12134d4c5043SHisping Lin uint32_t trusty_oem_user_ta_transfer(void) 12144d4c5043SHisping Lin { 12154d4c5043SHisping Lin TEEC_Result TeecResult; 12164d4c5043SHisping Lin TEEC_Context TeecContext; 12174d4c5043SHisping Lin TEEC_Session TeecSession; 12184d4c5043SHisping Lin uint32_t ErrorOrigin; 12194d4c5043SHisping Lin TEEC_UUID tempuuid = { 0x1db57234, 0xdacd, 0x462d, 12204d4c5043SHisping Lin { 0x9b, 0xb1, 0xae, 0x79, 0xde, 0x44, 0xe2, 0xa5} }; 12214d4c5043SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 12224d4c5043SHisping Lin TEEC_Operation TeecOperation = {0}; 12234d4c5043SHisping Lin const uint8_t transfer_inout[] = "Transfer data test."; 12244d4c5043SHisping Lin 12254d4c5043SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 12264d4c5043SHisping Lin if (TeecResult != TEEC_SUCCESS) 12274d4c5043SHisping Lin return TeecResult; 12284d4c5043SHisping Lin 12294d4c5043SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 12304d4c5043SHisping Lin if (TeecResult != TEEC_SUCCESS) 12314d4c5043SHisping Lin return TeecResult; 12324d4c5043SHisping Lin 12334d4c5043SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE, 12344d4c5043SHisping Lin TEEC_NONE, 12354d4c5043SHisping Lin TEEC_NONE, 12364d4c5043SHisping Lin TEEC_NONE); 12374d4c5043SHisping Lin 12384d4c5043SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 12394d4c5043SHisping Lin &TeecSession, 12404d4c5043SHisping Lin TeecUuid, 12414d4c5043SHisping Lin TEEC_LOGIN_PUBLIC, 12424d4c5043SHisping Lin NULL, 12434d4c5043SHisping Lin &TeecOperation, 12444d4c5043SHisping Lin &ErrorOrigin); 12454d4c5043SHisping Lin if (TeecResult != TEEC_SUCCESS) 12464d4c5043SHisping Lin return TeecResult; 12474d4c5043SHisping Lin 12484d4c5043SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 12494d4c5043SHisping Lin 12504d4c5043SHisping Lin SharedMem0.size = sizeof(transfer_inout); 12514d4c5043SHisping Lin SharedMem0.flags = 0; 12524d4c5043SHisping Lin 12534d4c5043SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 12544d4c5043SHisping Lin if (TeecResult != TEEC_SUCCESS) 12554d4c5043SHisping Lin goto exit; 12564d4c5043SHisping Lin 12574d4c5043SHisping Lin memcpy(SharedMem0.buffer, transfer_inout, SharedMem0.size); 12584d4c5043SHisping Lin 12594d4c5043SHisping Lin TEEC_SharedMemory SharedMem1 = {0}; 12604d4c5043SHisping Lin 12614d4c5043SHisping Lin SharedMem1.size = sizeof(transfer_inout); 12624d4c5043SHisping Lin SharedMem1.flags = 0; 12634d4c5043SHisping Lin 12644d4c5043SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 12654d4c5043SHisping Lin if (TeecResult != TEEC_SUCCESS) 12664d4c5043SHisping Lin goto exit; 12674d4c5043SHisping Lin 12684d4c5043SHisping Lin TeecOperation.params[0].value.a = 66; 12694d4c5043SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem0.buffer; 12704d4c5043SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem0.size; 12714d4c5043SHisping Lin TeecOperation.params[2].tmpref.buffer = SharedMem1.buffer; 12724d4c5043SHisping Lin TeecOperation.params[2].tmpref.size = SharedMem1.size; 12734d4c5043SHisping Lin 12744d4c5043SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INOUT, 12754d4c5043SHisping Lin TEEC_MEMREF_TEMP_INPUT, 12764d4c5043SHisping Lin TEEC_MEMREF_TEMP_OUTPUT, 12774d4c5043SHisping Lin TEEC_NONE); 12784d4c5043SHisping Lin 12794d4c5043SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 12804d4c5043SHisping Lin 102, 12814d4c5043SHisping Lin &TeecOperation, 12824d4c5043SHisping Lin &ErrorOrigin); 12834d4c5043SHisping Lin if (TeecResult != TEEC_SUCCESS) 12844d4c5043SHisping Lin goto exit; 12854d4c5043SHisping Lin 12864d4c5043SHisping Lin //Check the result 12874d4c5043SHisping Lin if (TeecOperation.params[0].value.a == 66 + 1 && 12884d4c5043SHisping Lin TeecOperation.params[0].value.b == TeecOperation.params[0].value.a) 12894d4c5043SHisping Lin printf("test value : Pass!\n"); 12904d4c5043SHisping Lin else 12914d4c5043SHisping Lin printf("test value : Fail! (mismatch values)\n"); 12924d4c5043SHisping Lin 12934d4c5043SHisping Lin if (memcmp(SharedMem1.buffer, transfer_inout, sizeof(transfer_inout)) == 0) 12944d4c5043SHisping Lin printf("test buffer : Pass!\n"); 12954d4c5043SHisping Lin else 12964d4c5043SHisping Lin printf("test buffer : Fail! (mismatch buffer)\n"); 12974d4c5043SHisping Lin 12984d4c5043SHisping Lin exit: 12994d4c5043SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 13004d4c5043SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem1); 13014d4c5043SHisping Lin TEEC_CloseSession(&TeecSession); 13024d4c5043SHisping Lin TEEC_FinalizeContext(&TeecContext); 13034d4c5043SHisping Lin 13044d4c5043SHisping Lin return TeecResult; 13054d4c5043SHisping Lin } 13064d4c5043SHisping Lin 13074d4c5043SHisping Lin uint32_t trusty_oem_user_ta_storage(void) 13084d4c5043SHisping Lin { 13094d4c5043SHisping Lin TEEC_Result TeecResult; 13104d4c5043SHisping Lin TEEC_Context TeecContext; 13114d4c5043SHisping Lin TEEC_Session TeecSession; 13124d4c5043SHisping Lin uint32_t ErrorOrigin; 13134d4c5043SHisping Lin TEEC_UUID tempuuid = { 0x1db57234, 0xdacd, 0x462d, 13144d4c5043SHisping Lin { 0x9b, 0xb1, 0xae, 0x79, 0xde, 0x44, 0xe2, 0xa5} }; 13154d4c5043SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 13164d4c5043SHisping Lin TEEC_Operation TeecOperation = {0}; 13174d4c5043SHisping Lin 13184d4c5043SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 13194d4c5043SHisping Lin if (TeecResult != TEEC_SUCCESS) 13204d4c5043SHisping Lin return TeecResult; 13214d4c5043SHisping Lin 13224d4c5043SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 13234d4c5043SHisping Lin if (TeecResult != TEEC_SUCCESS) 13244d4c5043SHisping Lin return TeecResult; 13254d4c5043SHisping Lin 13264d4c5043SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE, 13274d4c5043SHisping Lin TEEC_NONE, 13284d4c5043SHisping Lin TEEC_NONE, 13294d4c5043SHisping Lin TEEC_NONE); 13304d4c5043SHisping Lin 13314d4c5043SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 13324d4c5043SHisping Lin &TeecSession, 13334d4c5043SHisping Lin TeecUuid, 13344d4c5043SHisping Lin TEEC_LOGIN_PUBLIC, 13354d4c5043SHisping Lin NULL, 13364d4c5043SHisping Lin &TeecOperation, 13374d4c5043SHisping Lin &ErrorOrigin); 13384d4c5043SHisping Lin if (TeecResult != TEEC_SUCCESS) 13394d4c5043SHisping Lin return TeecResult; 13404d4c5043SHisping Lin 13414d4c5043SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE, 13424d4c5043SHisping Lin TEEC_NONE, 13434d4c5043SHisping Lin TEEC_NONE, 13444d4c5043SHisping Lin TEEC_NONE); 13454d4c5043SHisping Lin 13464d4c5043SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 13474d4c5043SHisping Lin 103, 13484d4c5043SHisping Lin &TeecOperation, 13494d4c5043SHisping Lin &ErrorOrigin); 13504d4c5043SHisping Lin if (TeecResult != TEEC_SUCCESS) 13514d4c5043SHisping Lin goto exit; 13524d4c5043SHisping Lin 13534d4c5043SHisping Lin exit: 13544d4c5043SHisping Lin TEEC_CloseSession(&TeecSession); 13554d4c5043SHisping Lin TEEC_FinalizeContext(&TeecContext); 13564d4c5043SHisping Lin 13574d4c5043SHisping Lin return TeecResult; 13584d4c5043SHisping Lin } 13594d4c5043SHisping Lin 13604aa61755SAndy Ye uint32_t trusty_attest_dh(uint8_t *dh, uint32_t *dh_size) 13614aa61755SAndy Ye { 13624aa61755SAndy Ye TEEC_Result TeecResult; 13634aa61755SAndy Ye TEEC_Context TeecContext; 13644aa61755SAndy Ye TEEC_Session TeecSession; 13654aa61755SAndy Ye uint32_t ErrorOrigin; 13664aa61755SAndy Ye TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6, 13674aa61755SAndy Ye { 0xa8, 0x69, 0x9c, 0xe6, 13684aa61755SAndy Ye 0x88, 0x6c, 0x5d, 0x5d 13694aa61755SAndy Ye } 13704aa61755SAndy Ye }; 13714aa61755SAndy Ye TEEC_UUID *TeecUuid = &tempuuid; 13724aa61755SAndy Ye TEEC_Operation TeecOperation = {0}; 13733251364cSHisping Lin struct blk_desc *dev_desc; 13743251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 13756651d4c0SJason Zhu if (!dev_desc) { 13766651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 13776651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 13786651d4c0SJason Zhu } 13794aa61755SAndy Ye 1380f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 1381f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1382f4e1db95SHisping Lin return TeecResult; 13834aa61755SAndy Ye 13844aa61755SAndy Ye TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1385f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1386f4e1db95SHisping Lin return TeecResult; 13874aa61755SAndy Ye 13883251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 13893251364cSHisping Lin TEEC_NONE, 13903251364cSHisping Lin TEEC_NONE, 13913251364cSHisping Lin TEEC_NONE); 13923251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 1393b9a7e756SHisping Lin if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0) 1394b9a7e756SHisping Lin TeecOperation.params[0].value.a = 1; 1395b9a7e756SHisping Lin else 1396b9a7e756SHisping Lin TeecOperation.params[0].value.a = 0; 1397b9a7e756SHisping Lin 13983251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 13993251364cSHisping Lin TeecOperation.params[0].value.a = 0; 14003251364cSHisping Lin #endif 14013251364cSHisping Lin 14024aa61755SAndy Ye TeecResult = TEEC_OpenSession(&TeecContext, 14034aa61755SAndy Ye &TeecSession, 14044aa61755SAndy Ye TeecUuid, 14054aa61755SAndy Ye TEEC_LOGIN_PUBLIC, 14064aa61755SAndy Ye NULL, 14073251364cSHisping Lin &TeecOperation, 14084aa61755SAndy Ye &ErrorOrigin); 1409f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1410f4e1db95SHisping Lin return TeecResult; 14114aa61755SAndy Ye 14124aa61755SAndy Ye TEEC_SharedMemory SharedMem0 = {0}; 14134aa61755SAndy Ye 14144aa61755SAndy Ye SharedMem0.size = *dh_size; 14154aa61755SAndy Ye SharedMem0.flags = 0; 14164aa61755SAndy Ye 14174aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 1418f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1419f4e1db95SHisping Lin goto exit; 14204aa61755SAndy Ye 14214aa61755SAndy Ye TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 14224aa61755SAndy Ye TeecOperation.params[0].tmpref.size = SharedMem0.size; 14234aa61755SAndy Ye 14244aa61755SAndy Ye TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, 14254aa61755SAndy Ye TEEC_NONE, 14264aa61755SAndy Ye TEEC_NONE, 14274aa61755SAndy Ye TEEC_NONE); 14284aa61755SAndy Ye 14294aa61755SAndy Ye TeecResult = TEEC_InvokeCommand(&TeecSession, 14304aa61755SAndy Ye 143, 14314aa61755SAndy Ye &TeecOperation, 14324aa61755SAndy Ye &ErrorOrigin); 1433f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1434f4e1db95SHisping Lin goto exit; 14354aa61755SAndy Ye 14364aa61755SAndy Ye *dh_size = TeecOperation.params[0].tmpref.size; 14374aa61755SAndy Ye memcpy(dh, SharedMem0.buffer, SharedMem0.size); 1438f4e1db95SHisping Lin exit: 14394aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem0); 14404aa61755SAndy Ye TEEC_CloseSession(&TeecSession); 1441f4e1db95SHisping Lin TEEC_FinalizeContext(&TeecContext); 14424aa61755SAndy Ye 14434aa61755SAndy Ye return TeecResult; 14444aa61755SAndy Ye } 14454aa61755SAndy Ye 14464aa61755SAndy Ye uint32_t trusty_attest_uuid(uint8_t *uuid, uint32_t *uuid_size) 14474aa61755SAndy Ye { 14484aa61755SAndy Ye TEEC_Result TeecResult; 14494aa61755SAndy Ye TEEC_Context TeecContext; 14504aa61755SAndy Ye TEEC_Session TeecSession; 14514aa61755SAndy Ye uint32_t ErrorOrigin; 14524aa61755SAndy Ye TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6, 14534aa61755SAndy Ye { 0xa8, 0x69, 0x9c, 0xe6, 14544aa61755SAndy Ye 0x88, 0x6c, 0x5d, 0x5d 14554aa61755SAndy Ye } 14564aa61755SAndy Ye }; 14574aa61755SAndy Ye TEEC_UUID *TeecUuid = &tempuuid; 14584aa61755SAndy Ye TEEC_Operation TeecOperation = {0}; 14593251364cSHisping Lin struct blk_desc *dev_desc; 14603251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 14616651d4c0SJason Zhu if (!dev_desc) { 14626651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 14636651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 14646651d4c0SJason Zhu } 14654aa61755SAndy Ye 1466f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 1467f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1468f4e1db95SHisping Lin return TeecResult; 14694aa61755SAndy Ye 14704aa61755SAndy Ye TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1471f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1472f4e1db95SHisping Lin return TeecResult; 14734aa61755SAndy Ye 14743251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 14753251364cSHisping Lin TEEC_NONE, 14763251364cSHisping Lin TEEC_NONE, 14773251364cSHisping Lin TEEC_NONE); 14783251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 1479b9a7e756SHisping Lin if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0) 1480b9a7e756SHisping Lin TeecOperation.params[0].value.a = 1; 1481b9a7e756SHisping Lin else 1482b9a7e756SHisping Lin TeecOperation.params[0].value.a = 0; 1483b9a7e756SHisping Lin 14843251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 14853251364cSHisping Lin TeecOperation.params[0].value.a = 0; 14863251364cSHisping Lin #endif 14873251364cSHisping Lin 14884aa61755SAndy Ye TeecResult = TEEC_OpenSession(&TeecContext, 14894aa61755SAndy Ye &TeecSession, 14904aa61755SAndy Ye TeecUuid, 14914aa61755SAndy Ye TEEC_LOGIN_PUBLIC, 14924aa61755SAndy Ye NULL, 14933251364cSHisping Lin &TeecOperation, 14944aa61755SAndy Ye &ErrorOrigin); 1495f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1496f4e1db95SHisping Lin return TeecResult; 14974aa61755SAndy Ye 14984aa61755SAndy Ye TEEC_SharedMemory SharedMem0 = {0}; 14994aa61755SAndy Ye 15004aa61755SAndy Ye SharedMem0.size = *uuid_size; 15014aa61755SAndy Ye SharedMem0.flags = 0; 15024aa61755SAndy Ye 15034aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 1504f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1505f4e1db95SHisping Lin goto exit; 15064aa61755SAndy Ye 15074aa61755SAndy Ye TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 15084aa61755SAndy Ye TeecOperation.params[0].tmpref.size = SharedMem0.size; 15094aa61755SAndy Ye 15104aa61755SAndy Ye TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, 15114aa61755SAndy Ye TEEC_NONE, 15124aa61755SAndy Ye TEEC_NONE, 15134aa61755SAndy Ye TEEC_NONE); 15144aa61755SAndy Ye 15154aa61755SAndy Ye TeecResult = TEEC_InvokeCommand(&TeecSession, 15164aa61755SAndy Ye 144, 15174aa61755SAndy Ye &TeecOperation, 15184aa61755SAndy Ye &ErrorOrigin); 1519f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1520f4e1db95SHisping Lin goto exit; 15214aa61755SAndy Ye 15224aa61755SAndy Ye *uuid_size = TeecOperation.params[0].tmpref.size; 15234aa61755SAndy Ye memcpy(uuid, SharedMem0.buffer, SharedMem0.size); 1524f4e1db95SHisping Lin exit: 15254aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem0); 15264aa61755SAndy Ye TEEC_CloseSession(&TeecSession); 1527f4e1db95SHisping Lin TEEC_FinalizeContext(&TeecContext); 15284aa61755SAndy Ye 15294aa61755SAndy Ye return TeecResult; 15304aa61755SAndy Ye } 15314aa61755SAndy Ye 15324aa61755SAndy Ye uint32_t trusty_attest_get_ca(uint8_t *operation_start, 15334aa61755SAndy Ye uint32_t *operation_size, 15344aa61755SAndy Ye uint8_t *out, 15354aa61755SAndy Ye uint32_t *out_len) 15364aa61755SAndy Ye { 15374aa61755SAndy Ye TEEC_Result TeecResult; 15384aa61755SAndy Ye TEEC_Context TeecContext; 15394aa61755SAndy Ye TEEC_Session TeecSession; 15404aa61755SAndy Ye uint32_t ErrorOrigin; 15414aa61755SAndy Ye 15424aa61755SAndy Ye TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6, 15434aa61755SAndy Ye { 0xa8, 0x69, 0x9c, 0xe6, 15444aa61755SAndy Ye 0x88, 0x6c, 0x5d, 0x5d 15454aa61755SAndy Ye } 15464aa61755SAndy Ye }; 15474aa61755SAndy Ye 15484aa61755SAndy Ye TEEC_UUID *TeecUuid = &tempuuid; 15494aa61755SAndy Ye TEEC_Operation TeecOperation = {0}; 15503251364cSHisping Lin struct blk_desc *dev_desc; 15513251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 15526651d4c0SJason Zhu if (!dev_desc) { 15536651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 15546651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 15556651d4c0SJason Zhu } 15564aa61755SAndy Ye 1557f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 1558f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1559f4e1db95SHisping Lin return TeecResult; 15604aa61755SAndy Ye 15614aa61755SAndy Ye TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1562f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1563f4e1db95SHisping Lin return TeecResult; 15644aa61755SAndy Ye 15653251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 15663251364cSHisping Lin TEEC_NONE, 15673251364cSHisping Lin TEEC_NONE, 15683251364cSHisping Lin TEEC_NONE); 15693251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 1570b9a7e756SHisping Lin if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0) 1571b9a7e756SHisping Lin TeecOperation.params[0].value.a = 1; 1572b9a7e756SHisping Lin else 1573b9a7e756SHisping Lin TeecOperation.params[0].value.a = 0; 1574b9a7e756SHisping Lin 15753251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 15763251364cSHisping Lin TeecOperation.params[0].value.a = 0; 15773251364cSHisping Lin #endif 15783251364cSHisping Lin 15794aa61755SAndy Ye TeecResult = TEEC_OpenSession(&TeecContext, 15804aa61755SAndy Ye &TeecSession, 15814aa61755SAndy Ye TeecUuid, 15824aa61755SAndy Ye TEEC_LOGIN_PUBLIC, 15834aa61755SAndy Ye NULL, 15843251364cSHisping Lin &TeecOperation, 15854aa61755SAndy Ye &ErrorOrigin); 1586f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1587f4e1db95SHisping Lin return TeecResult; 15884aa61755SAndy Ye 15894aa61755SAndy Ye TEEC_SharedMemory SharedMem0 = {0}; 15904aa61755SAndy Ye 15914aa61755SAndy Ye SharedMem0.size = *operation_size; 15924aa61755SAndy Ye SharedMem0.flags = 0; 15934aa61755SAndy Ye 15944aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 1595f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1596f4e1db95SHisping Lin goto exit; 15974aa61755SAndy Ye 15984aa61755SAndy Ye memcpy(SharedMem0.buffer, operation_start, SharedMem0.size); 15994aa61755SAndy Ye 16004aa61755SAndy Ye TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 16014aa61755SAndy Ye TeecOperation.params[0].tmpref.size = SharedMem0.size; 16024aa61755SAndy Ye 16034aa61755SAndy Ye TEEC_SharedMemory SharedMem1 = {0}; 16044aa61755SAndy Ye 16054aa61755SAndy Ye SharedMem1.size = *out_len; 16064aa61755SAndy Ye SharedMem1.flags = 0; 16074aa61755SAndy Ye 16084aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 1609f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1610f4e1db95SHisping Lin goto exit; 16114aa61755SAndy Ye 16124aa61755SAndy Ye TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 16134aa61755SAndy Ye TeecOperation.params[1].tmpref.size = SharedMem1.size; 16144aa61755SAndy Ye 16154aa61755SAndy Ye TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, 16164aa61755SAndy Ye TEEC_MEMREF_TEMP_INOUT, 16174aa61755SAndy Ye TEEC_NONE, 16184aa61755SAndy Ye TEEC_NONE); 16194aa61755SAndy Ye 16204aa61755SAndy Ye TeecResult = TEEC_InvokeCommand(&TeecSession, 16214aa61755SAndy Ye 145, 16224aa61755SAndy Ye &TeecOperation, 16234aa61755SAndy Ye &ErrorOrigin); 1624f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1625f4e1db95SHisping Lin goto exit; 16264aa61755SAndy Ye 16274aa61755SAndy Ye *out_len = TeecOperation.params[1].tmpref.size; 16284aa61755SAndy Ye memcpy(out, SharedMem1.buffer, SharedMem1.size); 1629f4e1db95SHisping Lin exit: 16304aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem0); 16314aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem1); 1632f4e1db95SHisping Lin TEEC_CloseSession(&TeecSession); 1633f4e1db95SHisping Lin TEEC_FinalizeContext(&TeecContext); 16344aa61755SAndy Ye 16354aa61755SAndy Ye return TeecResult; 16364aa61755SAndy Ye } 16374aa61755SAndy Ye 16384aa61755SAndy Ye uint32_t trusty_attest_set_ca(uint8_t *ca_response, uint32_t *ca_response_size) 16394aa61755SAndy Ye { 16404aa61755SAndy Ye TEEC_Result TeecResult; 16414aa61755SAndy Ye TEEC_Context TeecContext; 16424aa61755SAndy Ye TEEC_Session TeecSession; 16434aa61755SAndy Ye uint32_t ErrorOrigin; 16444aa61755SAndy Ye TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6, 16454aa61755SAndy Ye { 0xa8, 0x69, 0x9c, 0xe6, 16464aa61755SAndy Ye 0x88, 0x6c, 0x5d, 0x5d 16474aa61755SAndy Ye } 16484aa61755SAndy Ye }; 16494aa61755SAndy Ye TEEC_UUID *TeecUuid = &tempuuid; 16504aa61755SAndy Ye TEEC_Operation TeecOperation = {0}; 16513251364cSHisping Lin struct blk_desc *dev_desc; 16523251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 16536651d4c0SJason Zhu if (!dev_desc) { 16546651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 16556651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 16566651d4c0SJason Zhu } 1657f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 1658f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1659f4e1db95SHisping Lin return TeecResult; 16604aa61755SAndy Ye 16614aa61755SAndy Ye TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1662f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1663f4e1db95SHisping Lin return TeecResult; 16644aa61755SAndy Ye 16653251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 16663251364cSHisping Lin TEEC_NONE, 16673251364cSHisping Lin TEEC_NONE, 16683251364cSHisping Lin TEEC_NONE); 16693251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 1670b9a7e756SHisping Lin if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0) 1671b9a7e756SHisping Lin TeecOperation.params[0].value.a = 1; 1672b9a7e756SHisping Lin else 1673b9a7e756SHisping Lin TeecOperation.params[0].value.a = 0; 1674b9a7e756SHisping Lin 16753251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 16763251364cSHisping Lin TeecOperation.params[0].value.a = 0; 16773251364cSHisping Lin #endif 16783251364cSHisping Lin 16794aa61755SAndy Ye TeecResult = TEEC_OpenSession(&TeecContext, 16804aa61755SAndy Ye &TeecSession, 16814aa61755SAndy Ye TeecUuid, 16824aa61755SAndy Ye TEEC_LOGIN_PUBLIC, 16834aa61755SAndy Ye NULL, 16843251364cSHisping Lin &TeecOperation, 16854aa61755SAndy Ye &ErrorOrigin); 1686f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1687f4e1db95SHisping Lin return TeecResult; 16884aa61755SAndy Ye 16894aa61755SAndy Ye TEEC_SharedMemory SharedMem0 = {0}; 16904aa61755SAndy Ye 16914aa61755SAndy Ye SharedMem0.size = *ca_response_size; 16924aa61755SAndy Ye SharedMem0.flags = 0; 16934aa61755SAndy Ye 16944aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 1695f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1696f4e1db95SHisping Lin goto exit; 16974aa61755SAndy Ye 16984aa61755SAndy Ye memcpy(SharedMem0.buffer, ca_response, SharedMem0.size); 16994aa61755SAndy Ye 17004aa61755SAndy Ye TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 17014aa61755SAndy Ye TeecOperation.params[0].tmpref.size = SharedMem0.size; 17024aa61755SAndy Ye 17034aa61755SAndy Ye TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, 17044aa61755SAndy Ye TEEC_NONE, 17054aa61755SAndy Ye TEEC_NONE, 17064aa61755SAndy Ye TEEC_NONE); 17074aa61755SAndy Ye 17084aa61755SAndy Ye TeecResult = TEEC_InvokeCommand(&TeecSession, 17094aa61755SAndy Ye 146, 17104aa61755SAndy Ye &TeecOperation, 17114aa61755SAndy Ye &ErrorOrigin); 1712f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1713f4e1db95SHisping Lin goto exit; 1714f4e1db95SHisping Lin exit: 17154aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem0); 17164aa61755SAndy Ye TEEC_CloseSession(&TeecSession); 1717f4e1db95SHisping Lin TEEC_FinalizeContext(&TeecContext); 17184aa61755SAndy Ye 17194aa61755SAndy Ye return TeecResult; 17204aa61755SAndy Ye } 1721