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 32ae8ec5e1SHisping Lin 332f8c34bdSxb.wang #define CRYPTO_SERVICE_CMD_OEM_OTP_KEY_PHYS_CIPHER 0x00000002 34fc3694d6Sxb.wang 35fc3694d6Sxb.wang #define RK_CRYPTO_SERVICE_UUID { 0x0cacdb5d, 0x4fea, 0x466c, \ 36fc3694d6Sxb.wang { 0x97, 0x16, 0x3d, 0x54, 0x16, 0x52, 0x83, 0x0f } } 37fc3694d6Sxb.wang 38ae8ec5e1SHisping Lin static uint8_t b2hs_add_base(uint8_t in) 39ae8ec5e1SHisping Lin { 40ae8ec5e1SHisping Lin if (in > 9) 41ae8ec5e1SHisping Lin return in + 55; 42ae8ec5e1SHisping Lin else 43ae8ec5e1SHisping Lin return in + 48; 44ae8ec5e1SHisping Lin } 45ae8ec5e1SHisping Lin 46c7de5349SHisping Lin static uint32_t b2hs(uint8_t *b, uint8_t *hs, uint32_t blen, uint32_t hslen) 47ae8ec5e1SHisping Lin { 48ae8ec5e1SHisping Lin uint32_t i = 0; 49ae8ec5e1SHisping Lin 50ae8ec5e1SHisping Lin if (blen * 2 + 1 > hslen) 51ae8ec5e1SHisping Lin return 0; 52ae8ec5e1SHisping Lin 53ae8ec5e1SHisping Lin for (; i < blen; i++) { 54ae8ec5e1SHisping Lin hs[i * 2 + 1] = b2hs_add_base(b[i] & 0xf); 55ae8ec5e1SHisping Lin hs[i * 2] = b2hs_add_base(b[i] >> 4); 56ae8ec5e1SHisping Lin } 57ae8ec5e1SHisping Lin hs[blen * 2] = 0; 58ae8ec5e1SHisping Lin 59ae8ec5e1SHisping Lin return blen * 2; 60ae8ec5e1SHisping Lin } 61ae8ec5e1SHisping Lin 622f8c34bdSxb.wang static void crypto_flush_cacheline(uint32_t addr, uint32_t size) 632f8c34bdSxb.wang { 642f8c34bdSxb.wang ulong alignment = CONFIG_SYS_CACHELINE_SIZE; 652f8c34bdSxb.wang ulong aligned_input, aligned_len; 662f8c34bdSxb.wang 672f8c34bdSxb.wang if (!addr || !size) 682f8c34bdSxb.wang return; 692f8c34bdSxb.wang 702f8c34bdSxb.wang /* Must flush dcache before crypto DMA fetch data region */ 712f8c34bdSxb.wang aligned_input = round_down(addr, alignment); 722f8c34bdSxb.wang aligned_len = round_up(size + (addr - aligned_input), alignment); 732f8c34bdSxb.wang flush_cache(aligned_input, aligned_len); 742f8c34bdSxb.wang } 752f8c34bdSxb.wang 76a900eef3SHisping Lin static void crypto_invalidate_cacheline(uint32_t addr, uint32_t size) 77a900eef3SHisping Lin { 78a900eef3SHisping Lin ulong alignment = CONFIG_SYS_CACHELINE_SIZE; 79a900eef3SHisping Lin ulong aligned_input, aligned_len; 80a900eef3SHisping Lin 81a900eef3SHisping Lin if (!addr || !size) 82a900eef3SHisping Lin return; 83a900eef3SHisping Lin 84a900eef3SHisping Lin /* Must invalidate dcache after crypto DMA write data region */ 85a900eef3SHisping Lin aligned_input = round_down(addr, alignment); 86a900eef3SHisping Lin aligned_len = round_up(size + (addr - aligned_input), alignment); 87a900eef3SHisping Lin invalidate_dcache_range(aligned_input, aligned_input + aligned_len); 88a900eef3SHisping Lin } 89a900eef3SHisping Lin 90c7de5349SHisping Lin static uint32_t trusty_base_write_security_data(char *filename, 91c7de5349SHisping Lin uint32_t filename_size, 92c7de5349SHisping Lin uint8_t *data, 93c7de5349SHisping Lin uint32_t data_size) 94ae8ec5e1SHisping Lin { 95ae8ec5e1SHisping Lin TEEC_Result TeecResult; 96ae8ec5e1SHisping Lin TEEC_Context TeecContext; 97ae8ec5e1SHisping Lin TEEC_Session TeecSession; 98ae8ec5e1SHisping Lin uint32_t ErrorOrigin; 99ae8ec5e1SHisping Lin TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 100ae8ec5e1SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 101ae8ec5e1SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 102ae8ec5e1SHisping Lin TEEC_Operation TeecOperation = {0}; 1033251364cSHisping Lin struct blk_desc *dev_desc; 1043251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 1056651d4c0SJason Zhu if (!dev_desc) { 1066651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 1076651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 1086651d4c0SJason Zhu } 1093251364cSHisping Lin 110f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 111f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 112f4e1db95SHisping Lin return TeecResult; 113ae8ec5e1SHisping Lin 114ae8ec5e1SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 115f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 116f4e1db95SHisping Lin return TeecResult; 117ae8ec5e1SHisping Lin 1183251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 1193251364cSHisping Lin TEEC_NONE, 1203251364cSHisping Lin TEEC_NONE, 1213251364cSHisping Lin TEEC_NONE); 1223251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 123b9a7e756SHisping Lin if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0) 124b9a7e756SHisping Lin TeecOperation.params[0].value.a = 1; 125b9a7e756SHisping Lin else 126b9a7e756SHisping Lin TeecOperation.params[0].value.a = 0; 1273251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 1283251364cSHisping Lin TeecOperation.params[0].value.a = 0; 1293251364cSHisping Lin #endif 1303251364cSHisping Lin 131ae8ec5e1SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 132ae8ec5e1SHisping Lin &TeecSession, 133ae8ec5e1SHisping Lin TeecUuid, 134ae8ec5e1SHisping Lin TEEC_LOGIN_PUBLIC, 135ae8ec5e1SHisping Lin NULL, 1363251364cSHisping Lin &TeecOperation, 137ae8ec5e1SHisping Lin &ErrorOrigin); 138f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 139f4e1db95SHisping Lin return TeecResult; 140ae8ec5e1SHisping Lin 141ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 142ae8ec5e1SHisping Lin 143c7de5349SHisping Lin SharedMem0.size = filename_size; 144ae8ec5e1SHisping Lin SharedMem0.flags = 0; 145ae8ec5e1SHisping Lin 146ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 147f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 148f4e1db95SHisping Lin goto exit; 149ae8ec5e1SHisping Lin 150c7de5349SHisping Lin memcpy(SharedMem0.buffer, filename, SharedMem0.size); 151ae8ec5e1SHisping Lin 152ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem1 = {0}; 153ae8ec5e1SHisping Lin 154c7de5349SHisping Lin SharedMem1.size = data_size; 155c7de5349SHisping Lin SharedMem1.flags = 0; 156c7de5349SHisping Lin 157c7de5349SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 158c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 159c7de5349SHisping Lin goto exit; 160c7de5349SHisping Lin 161c7de5349SHisping Lin memcpy(SharedMem1.buffer, data, SharedMem1.size); 162c7de5349SHisping Lin 163c7de5349SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 164c7de5349SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 165c7de5349SHisping Lin 166c7de5349SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 167c7de5349SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem1.size; 168c7de5349SHisping Lin 169c7de5349SHisping Lin 170c7de5349SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 171c7de5349SHisping Lin TEEC_MEMREF_TEMP_INOUT, 172c7de5349SHisping Lin TEEC_NONE, 173c7de5349SHisping Lin TEEC_NONE); 174c7de5349SHisping Lin 175c7de5349SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 176c7de5349SHisping Lin 1, 177c7de5349SHisping Lin &TeecOperation, 178c7de5349SHisping Lin &ErrorOrigin); 179c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 180c7de5349SHisping Lin goto exit; 181c7de5349SHisping Lin exit: 182c7de5349SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 183c7de5349SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem1); 184c7de5349SHisping Lin TEEC_CloseSession(&TeecSession); 185c7de5349SHisping Lin TEEC_FinalizeContext(&TeecContext); 186c7de5349SHisping Lin 187c7de5349SHisping Lin return TeecResult; 188c7de5349SHisping Lin } 189c7de5349SHisping Lin 190c7de5349SHisping Lin static uint32_t trusty_base_read_security_data(char *filename, 191c7de5349SHisping Lin uint32_t filename_size, 192c7de5349SHisping Lin uint8_t *data, 193c7de5349SHisping Lin uint32_t data_size) 194c7de5349SHisping Lin { 195c7de5349SHisping Lin TEEC_Result TeecResult; 196c7de5349SHisping Lin TEEC_Context TeecContext; 197c7de5349SHisping Lin TEEC_Session TeecSession; 198c7de5349SHisping Lin uint32_t ErrorOrigin; 199c7de5349SHisping Lin TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 200c7de5349SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 201c7de5349SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 202c7de5349SHisping Lin TEEC_Operation TeecOperation = {0}; 203c7de5349SHisping Lin 204c7de5349SHisping Lin struct blk_desc *dev_desc; 205c7de5349SHisping Lin dev_desc = rockchip_get_bootdev(); 206c7de5349SHisping Lin if (!dev_desc) { 207c7de5349SHisping Lin printf("%s: dev_desc is NULL!\n", __func__); 208c7de5349SHisping Lin return -TEEC_ERROR_GENERIC; 209c7de5349SHisping Lin } 210c7de5349SHisping Lin 211c7de5349SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 212c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 213c7de5349SHisping Lin return TeecResult; 214c7de5349SHisping Lin 215c7de5349SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 216c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 217c7de5349SHisping Lin return TeecResult; 218c7de5349SHisping Lin 219c7de5349SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 220c7de5349SHisping Lin TEEC_NONE, 221c7de5349SHisping Lin TEEC_NONE, 222c7de5349SHisping Lin TEEC_NONE); 223c7de5349SHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 224c7de5349SHisping Lin if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0) 225c7de5349SHisping Lin TeecOperation.params[0].value.a = 1; 226c7de5349SHisping Lin else 227c7de5349SHisping Lin TeecOperation.params[0].value.a = 0; 228c7de5349SHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 229c7de5349SHisping Lin TeecOperation.params[0].value.a = 0; 230c7de5349SHisping Lin #endif 231c7de5349SHisping Lin 232c7de5349SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 233c7de5349SHisping Lin &TeecSession, 234c7de5349SHisping Lin TeecUuid, 235c7de5349SHisping Lin TEEC_LOGIN_PUBLIC, 236c7de5349SHisping Lin NULL, 237c7de5349SHisping Lin &TeecOperation, 238c7de5349SHisping Lin &ErrorOrigin); 239c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 240c7de5349SHisping Lin return TeecResult; 241c7de5349SHisping Lin 242c7de5349SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 243c7de5349SHisping Lin 244c7de5349SHisping Lin SharedMem0.size = filename_size; 245c7de5349SHisping Lin SharedMem0.flags = 0; 246c7de5349SHisping Lin 247c7de5349SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 248c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 249c7de5349SHisping Lin goto exit; 250c7de5349SHisping Lin 251c7de5349SHisping Lin memcpy(SharedMem0.buffer, filename, SharedMem0.size); 252c7de5349SHisping Lin 253c7de5349SHisping Lin TEEC_SharedMemory SharedMem1 = {0}; 254c7de5349SHisping Lin 255c7de5349SHisping Lin SharedMem1.size = data_size; 256ae8ec5e1SHisping Lin SharedMem1.flags = 0; 257ae8ec5e1SHisping Lin 258ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 259f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 260f4e1db95SHisping Lin goto exit; 261ae8ec5e1SHisping Lin 262ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 263ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 264ae8ec5e1SHisping Lin 265ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 266ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem1.size; 267ae8ec5e1SHisping Lin 268ae8ec5e1SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 269ae8ec5e1SHisping Lin TEEC_MEMREF_TEMP_INOUT, 270ae8ec5e1SHisping Lin TEEC_NONE, 271ae8ec5e1SHisping Lin TEEC_NONE); 272ae8ec5e1SHisping Lin 273ae8ec5e1SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 274ae8ec5e1SHisping Lin 0, 275ae8ec5e1SHisping Lin &TeecOperation, 276ae8ec5e1SHisping Lin &ErrorOrigin); 27746b2a054SHisping Lin if (TeecResult == TEEC_SUCCESS) 278c7de5349SHisping Lin memcpy(data, SharedMem1.buffer, SharedMem1.size); 279f4e1db95SHisping Lin exit: 280ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 281ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem1); 282ae8ec5e1SHisping Lin TEEC_CloseSession(&TeecSession); 28346b2a054SHisping Lin TEEC_FinalizeContext(&TeecContext); 284ae8ec5e1SHisping Lin 285ae8ec5e1SHisping Lin return TeecResult; 286ae8ec5e1SHisping Lin } 287ae8ec5e1SHisping Lin 288c7de5349SHisping Lin static uint32_t trusty_base_end_security_data(void) 289c7de5349SHisping Lin { 290c7de5349SHisping Lin TEEC_Result TeecResult; 291c7de5349SHisping Lin TEEC_Context TeecContext; 292c7de5349SHisping Lin TEEC_Session TeecSession; 293c7de5349SHisping Lin uint32_t ErrorOrigin; 294c7de5349SHisping Lin TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 295c7de5349SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 296c7de5349SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 297c7de5349SHisping Lin TEEC_Operation TeecOperation = {0}; 298c7de5349SHisping Lin 299c7de5349SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 300c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 301c7de5349SHisping Lin return TeecResult; 302c7de5349SHisping Lin 303c7de5349SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 304c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 305c7de5349SHisping Lin return TeecResult; 306c7de5349SHisping Lin 307c7de5349SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 308c7de5349SHisping Lin &TeecSession, 309c7de5349SHisping Lin TeecUuid, 310c7de5349SHisping Lin TEEC_LOGIN_PUBLIC, 311c7de5349SHisping Lin NULL, 312c7de5349SHisping Lin NULL, 313c7de5349SHisping Lin &ErrorOrigin); 314c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 315c7de5349SHisping Lin return TeecResult; 316c7de5349SHisping Lin 317c7de5349SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE, 318c7de5349SHisping Lin TEEC_NONE, 319c7de5349SHisping Lin TEEC_NONE, 320c7de5349SHisping Lin TEEC_NONE); 321c7de5349SHisping Lin 322c7de5349SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 323c7de5349SHisping Lin 2, 324c7de5349SHisping Lin &TeecOperation, 325c7de5349SHisping Lin &ErrorOrigin); 326c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 327c7de5349SHisping Lin goto exit; 328c7de5349SHisping Lin exit: 329c7de5349SHisping Lin TEEC_CloseSession(&TeecSession); 330c7de5349SHisping Lin TEEC_FinalizeContext(&TeecContext); 331c7de5349SHisping Lin 332c7de5349SHisping Lin return TeecResult; 333c7de5349SHisping Lin } 334c7de5349SHisping Lin 335c7de5349SHisping Lin uint32_t trusty_read_rollback_index(uint32_t slot, uint64_t *value) 336c7de5349SHisping Lin { 337c7de5349SHisping Lin char hs[9]; 338c7de5349SHisping Lin 339c7de5349SHisping Lin b2hs((uint8_t *)&slot, (uint8_t *)hs, 4, 9); 340c7de5349SHisping Lin 341c7de5349SHisping Lin return trusty_base_read_security_data(hs, 8, (uint8_t *)value, 8); 342c7de5349SHisping Lin } 343c7de5349SHisping Lin 344ae8ec5e1SHisping Lin uint32_t trusty_write_rollback_index(uint32_t slot, uint64_t value) 345ae8ec5e1SHisping Lin { 346c7de5349SHisping Lin char hs[9]; 3473251364cSHisping Lin 348c7de5349SHisping Lin b2hs((uint8_t *)&slot, (uint8_t *)hs, 4, 9); 349ae8ec5e1SHisping Lin 350c7de5349SHisping Lin return trusty_base_write_security_data(hs, 8, (uint8_t *)&value, 8); 351ae8ec5e1SHisping Lin } 352ae8ec5e1SHisping Lin 353ae8ec5e1SHisping Lin uint32_t trusty_read_permanent_attributes(uint8_t *attributes, uint32_t size) 354ae8ec5e1SHisping Lin { 355c7de5349SHisping Lin return trusty_base_read_security_data("attributes", 356c7de5349SHisping Lin sizeof("attributes"), attributes, size); 357ae8ec5e1SHisping Lin } 358ae8ec5e1SHisping Lin 359ae8ec5e1SHisping Lin uint32_t trusty_write_permanent_attributes(uint8_t *attributes, uint32_t size) 360ae8ec5e1SHisping Lin { 361c7de5349SHisping Lin return trusty_base_write_security_data("attributes", 362c7de5349SHisping Lin sizeof("attributes"), attributes, size); 3636651d4c0SJason Zhu } 364ae8ec5e1SHisping Lin 365c7de5349SHisping Lin uint32_t trusty_read_permanent_attributes_flag(uint8_t *attributes) 366c7de5349SHisping Lin { 367c7de5349SHisping Lin return trusty_base_read_security_data("attributes_flag", 368c7de5349SHisping Lin sizeof("attributes_flag"), attributes, 1); 369c7de5349SHisping Lin } 370ae8ec5e1SHisping Lin 371c7de5349SHisping Lin uint32_t trusty_write_permanent_attributes_flag(uint8_t attributes) 372c7de5349SHisping Lin { 373c7de5349SHisping Lin return trusty_base_write_security_data("attributes_flag", 374c7de5349SHisping Lin sizeof("attributes_flag"), &attributes, 1); 375ae8ec5e1SHisping Lin } 376ae8ec5e1SHisping Lin 377564654ebSJason Zhu uint32_t trusty_read_permanent_attributes_cer(uint8_t *attributes, 378564654ebSJason Zhu uint32_t size) 379564654ebSJason Zhu { 380c7de5349SHisping Lin return trusty_base_read_security_data("rsacer", 381c7de5349SHisping Lin sizeof("rsacer"), attributes, size); 382564654ebSJason Zhu } 383564654ebSJason Zhu 384564654ebSJason Zhu uint32_t trusty_write_permanent_attributes_cer(uint8_t *attributes, 385564654ebSJason Zhu uint32_t size) 386564654ebSJason Zhu { 387c7de5349SHisping Lin return trusty_base_write_security_data("rsacer", 388c7de5349SHisping Lin sizeof("rsacer"), attributes, size); 389564654ebSJason Zhu } 390564654ebSJason Zhu 391ae8ec5e1SHisping Lin uint32_t trusty_read_lock_state(uint8_t *lock_state) 392ae8ec5e1SHisping Lin { 393c7de5349SHisping Lin return trusty_base_read_security_data("lock_state", 394c7de5349SHisping Lin sizeof("lock_state"), lock_state, 1); 395ae8ec5e1SHisping Lin } 396ae8ec5e1SHisping Lin 397ae8ec5e1SHisping Lin uint32_t trusty_write_lock_state(uint8_t lock_state) 398ae8ec5e1SHisping Lin { 399c7de5349SHisping Lin return trusty_base_write_security_data("lock_state", 400c7de5349SHisping Lin sizeof("lock_state"), &lock_state, 1); 401ae8ec5e1SHisping Lin } 402ae8ec5e1SHisping Lin 403ae8ec5e1SHisping Lin uint32_t trusty_read_flash_lock_state(uint8_t *flash_lock_state) 404ae8ec5e1SHisping Lin { 405c7de5349SHisping Lin return trusty_base_read_security_data("flash_lock_state", 406c7de5349SHisping Lin sizeof("flash_lock_state"), flash_lock_state, 1); 407c7de5349SHisping Lin } 408c7de5349SHisping Lin 409c7de5349SHisping Lin uint32_t trusty_write_flash_lock_state(uint8_t flash_lock_state) 410c7de5349SHisping Lin { 411c7de5349SHisping Lin return trusty_base_write_security_data("flash_lock_state", 412c7de5349SHisping Lin sizeof("flash_lock_state"), &flash_lock_state, 1); 413c7de5349SHisping Lin } 414c7de5349SHisping Lin 415c7de5349SHisping Lin static uint32_t trusty_base_end_efuse_or_otp(void) 416c7de5349SHisping Lin { 417ae8ec5e1SHisping Lin TEEC_Result TeecResult; 418ae8ec5e1SHisping Lin TEEC_Context TeecContext; 419ae8ec5e1SHisping Lin TEEC_Session TeecSession; 420ae8ec5e1SHisping Lin uint32_t ErrorOrigin; 421c7de5349SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 422c7de5349SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 423c7de5349SHisping Lin 424ae8ec5e1SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 425ae8ec5e1SHisping Lin TEEC_Operation TeecOperation = {0}; 426ae8ec5e1SHisping Lin 427f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 428f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 429f4e1db95SHisping Lin return TeecResult; 430ae8ec5e1SHisping Lin 431ae8ec5e1SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 432f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 433f4e1db95SHisping Lin return TeecResult; 434ae8ec5e1SHisping Lin 435ae8ec5e1SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 436ae8ec5e1SHisping Lin &TeecSession, 437ae8ec5e1SHisping Lin TeecUuid, 438ae8ec5e1SHisping Lin TEEC_LOGIN_PUBLIC, 439ae8ec5e1SHisping Lin NULL, 440c7de5349SHisping Lin NULL, 441ae8ec5e1SHisping Lin &ErrorOrigin); 442f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 443f4e1db95SHisping Lin return TeecResult; 444ae8ec5e1SHisping Lin 445c7de5349SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE, 446c7de5349SHisping Lin TEEC_NONE, 447ae8ec5e1SHisping Lin TEEC_NONE, 448ae8ec5e1SHisping Lin TEEC_NONE); 449ae8ec5e1SHisping Lin 450ae8ec5e1SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 451c7de5349SHisping Lin STORAGE_CMD_UBOOT_END_OTP, 452ae8ec5e1SHisping Lin &TeecOperation, 453ae8ec5e1SHisping Lin &ErrorOrigin); 454c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 455c7de5349SHisping Lin goto exit; 456f4e1db95SHisping Lin exit: 457ae8ec5e1SHisping Lin TEEC_CloseSession(&TeecSession); 45846b2a054SHisping Lin TEEC_FinalizeContext(&TeecContext); 459ae8ec5e1SHisping Lin 460ae8ec5e1SHisping Lin return TeecResult; 461ae8ec5e1SHisping Lin } 462ae8ec5e1SHisping Lin 463c7de5349SHisping Lin static uint32_t trusty_base_efuse_or_otp_operation(uint32_t cmd, 464c7de5349SHisping Lin uint8_t is_write, 465c7de5349SHisping Lin uint32_t *buf, 466c7de5349SHisping Lin uint32_t length) 467ae8ec5e1SHisping Lin { 468ae8ec5e1SHisping Lin TEEC_Result TeecResult; 469ae8ec5e1SHisping Lin TEEC_Context TeecContext; 470ae8ec5e1SHisping Lin TEEC_Session TeecSession; 471ae8ec5e1SHisping Lin uint32_t ErrorOrigin; 472c7de5349SHisping Lin 473c7de5349SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 474c7de5349SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 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 496ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 497ae8ec5e1SHisping Lin 498c7de5349SHisping Lin SharedMem0.size = length * sizeof(uint32_t); 499ae8ec5e1SHisping Lin SharedMem0.flags = 0; 500ae8ec5e1SHisping Lin 501ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 502f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 503f4e1db95SHisping Lin goto exit; 504ae8ec5e1SHisping Lin 505ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 506ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 507ae8ec5e1SHisping Lin 508c7de5349SHisping Lin if (is_write) { 509c7de5349SHisping Lin memcpy(SharedMem0.buffer, buf, SharedMem0.size); 510ae8ec5e1SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 511c7de5349SHisping Lin TEEC_NONE, 512ae8ec5e1SHisping Lin TEEC_NONE, 513ae8ec5e1SHisping Lin TEEC_NONE); 514ae8ec5e1SHisping Lin 515c7de5349SHisping Lin } else { 516c7de5349SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT, 517c7de5349SHisping Lin TEEC_NONE, 518c7de5349SHisping Lin TEEC_NONE, 519c7de5349SHisping Lin TEEC_NONE); 520c7de5349SHisping Lin } 521c7de5349SHisping Lin 522ae8ec5e1SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 523c7de5349SHisping Lin cmd, 524ae8ec5e1SHisping Lin &TeecOperation, 525ae8ec5e1SHisping Lin &ErrorOrigin); 526f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 527f4e1db95SHisping Lin goto exit; 528c7de5349SHisping Lin 529c7de5349SHisping Lin if (!is_write) 530c7de5349SHisping Lin memcpy(buf, SharedMem0.buffer, SharedMem0.size); 531c7de5349SHisping Lin 532f4e1db95SHisping Lin exit: 533ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 534ae8ec5e1SHisping Lin TEEC_CloseSession(&TeecSession); 53546b2a054SHisping Lin TEEC_FinalizeContext(&TeecContext); 536ae8ec5e1SHisping Lin 537ae8ec5e1SHisping Lin return TeecResult; 538ae8ec5e1SHisping Lin } 539ae8ec5e1SHisping Lin 5406ef445a4SHisping Lin uint32_t trusty_read_attribute_hash(uint32_t *buf, uint32_t length) 5416ef445a4SHisping Lin { 542c7de5349SHisping Lin return trusty_base_efuse_or_otp_operation(STORAGE_CMD_READ_ATTRIBUTE_HASH, 543c7de5349SHisping Lin false, buf, length); 5446ef445a4SHisping Lin } 5456ef445a4SHisping Lin 5466ef445a4SHisping Lin uint32_t trusty_write_attribute_hash(uint32_t *buf, uint32_t length) 5476ef445a4SHisping Lin { 548c7de5349SHisping Lin return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_ATTRIBUTE_HASH, 549c7de5349SHisping Lin true, buf, length); 55016539616SHisping Lin } 55116539616SHisping Lin 55216539616SHisping Lin uint32_t trusty_notify_optee_uboot_end(void) 55316539616SHisping Lin { 55416539616SHisping Lin TEEC_Result res; 555c7de5349SHisping Lin 556c7de5349SHisping Lin res = trusty_base_end_security_data(); 557c7de5349SHisping Lin res |= trusty_base_end_efuse_or_otp(); 55816539616SHisping Lin return res; 55916539616SHisping Lin } 5602cd27853SHisping Lin 5612cd27853SHisping Lin uint32_t trusty_read_vbootkey_hash(uint32_t *buf, uint32_t length) 5622cd27853SHisping Lin { 563c7de5349SHisping Lin return trusty_base_efuse_or_otp_operation(STORAGE_CMD_READ_VBOOTKEY_HASH, 564c7de5349SHisping Lin false, buf, length); 5652cd27853SHisping Lin } 566c7de5349SHisping Lin 5672cd27853SHisping Lin uint32_t trusty_write_vbootkey_hash(uint32_t *buf, uint32_t length) 5682cd27853SHisping Lin { 569c7de5349SHisping Lin return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_VBOOTKEY_HASH, 570c7de5349SHisping Lin true, buf, length); 5712cd27853SHisping Lin } 572095e2a82SHisping Lin 573468df3b2SHisping Lin uint32_t trusty_read_vbootkey_enable_flag(uint8_t *flag) 574468df3b2SHisping Lin { 575468df3b2SHisping Lin uint32_t bootflag; 576c7de5349SHisping Lin TEEC_Result TeecResult; 577468df3b2SHisping Lin 578f07e1686SHisping Lin *flag = 0; 579f07e1686SHisping Lin 580c7de5349SHisping Lin TeecResult = trusty_base_efuse_or_otp_operation(STORAGE_CMD_READ_ENABLE_FLAG, 581c7de5349SHisping Lin false, &bootflag, 1); 582468df3b2SHisping Lin 583468df3b2SHisping Lin if (TeecResult == TEEC_SUCCESS) { 5840202ee8aSHisping Lin #if defined(CONFIG_ROCKCHIP_RK3288) 5850202ee8aSHisping Lin if (bootflag == 0x00000001) 5860202ee8aSHisping Lin *flag = 1; 5870202ee8aSHisping Lin #else 588468df3b2SHisping Lin if (bootflag == 0x000000FF) 589468df3b2SHisping Lin *flag = 1; 5900202ee8aSHisping Lin #endif 591468df3b2SHisping Lin } 592095e2a82SHisping Lin return TeecResult; 593095e2a82SHisping Lin } 5944aa61755SAndy Ye 5951ef63c75SHisping Lin uint32_t trusty_write_ta_encryption_key(uint32_t *buf, uint32_t length) 5961ef63c75SHisping Lin { 5971ef63c75SHisping Lin return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_TA_ENCRYPTION_KEY, 5981ef63c75SHisping Lin true, buf, length); 5991ef63c75SHisping Lin } 6001ef63c75SHisping Lin 601fbf29bfbSHisping Lin uint32_t trusty_check_security_level_flag(uint8_t flag) 602fbf29bfbSHisping Lin { 603fbf29bfbSHisping Lin uint32_t levelflag; 604fbf29bfbSHisping Lin 605fbf29bfbSHisping Lin levelflag = flag; 606fbf29bfbSHisping Lin return trusty_base_efuse_or_otp_operation(STORAGE_CMD_CHECK_SECURITY_LEVEL_FLAG, 607fbf29bfbSHisping Lin true, &levelflag, 1); 608fbf29bfbSHisping Lin } 609fbf29bfbSHisping Lin 610f39d4289SHisping Lin uint32_t trusty_write_oem_huk(uint32_t *buf, uint32_t length) 611f39d4289SHisping Lin { 612f39d4289SHisping Lin return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_OEM_HUK, 613f39d4289SHisping Lin true, buf, length); 614f39d4289SHisping Lin } 615f39d4289SHisping Lin 6167504da74SHisping Lin void trusty_select_security_level(void) 6177504da74SHisping Lin { 6187504da74SHisping Lin #if (CONFIG_OPTEE_SECURITY_LEVEL > 0) 6197504da74SHisping Lin TEEC_Result TeecResult; 6207504da74SHisping Lin 6217504da74SHisping Lin TeecResult = trusty_check_security_level_flag(CONFIG_OPTEE_SECURITY_LEVEL); 6227504da74SHisping Lin if (TeecResult == TEE_ERROR_CANCEL) { 6237504da74SHisping Lin run_command("download", 0); 6247504da74SHisping Lin return; 6257504da74SHisping Lin } 6267504da74SHisping Lin 6277504da74SHisping Lin if (TeecResult == TEEC_SUCCESS) 6287504da74SHisping Lin debug("optee select security level success!"); 6297504da74SHisping Lin else 6307504da74SHisping Lin panic("optee select security level fail!"); 6317504da74SHisping Lin 6327504da74SHisping Lin return; 6337504da74SHisping Lin #endif 6347504da74SHisping Lin } 6357504da74SHisping Lin 636*51ac7005SHisping Lin void optee_client_init(void) 637*51ac7005SHisping Lin { 638*51ac7005SHisping Lin trusty_select_security_level(); 639*51ac7005SHisping Lin } 640*51ac7005SHisping Lin 641d5913350SHisping Lin uint32_t trusty_write_oem_ns_otp(uint32_t byte_off, uint8_t *byte_buf, uint32_t byte_len) 642d5913350SHisping Lin { 643d5913350SHisping Lin TEEC_Result TeecResult; 644d5913350SHisping Lin TEEC_Context TeecContext; 645d5913350SHisping Lin TEEC_Session TeecSession; 646d5913350SHisping Lin uint32_t ErrorOrigin; 647d5913350SHisping Lin 648d5913350SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 649d5913350SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 650d5913350SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 651d5913350SHisping Lin TEEC_Operation TeecOperation = {0}; 652d5913350SHisping Lin 653d5913350SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 654d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 655d5913350SHisping Lin return TeecResult; 656d5913350SHisping Lin 657d5913350SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 658d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 659d5913350SHisping Lin return TeecResult; 660d5913350SHisping Lin 661d5913350SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 662d5913350SHisping Lin &TeecSession, 663d5913350SHisping Lin TeecUuid, 664d5913350SHisping Lin TEEC_LOGIN_PUBLIC, 665d5913350SHisping Lin NULL, 666d5913350SHisping Lin NULL, 667d5913350SHisping Lin &ErrorOrigin); 668d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 669d5913350SHisping Lin return TeecResult; 670d5913350SHisping Lin 671d5913350SHisping Lin TeecOperation.params[0].value.a = byte_off; 672d5913350SHisping Lin 673d5913350SHisping Lin TEEC_SharedMemory SharedMem = {0}; 674d5913350SHisping Lin 675d5913350SHisping Lin SharedMem.size = byte_len; 676d5913350SHisping Lin SharedMem.flags = 0; 677d5913350SHisping Lin 678d5913350SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem); 679d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 680d5913350SHisping Lin goto exit; 681d5913350SHisping Lin 682d5913350SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem.buffer; 683d5913350SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem.size; 684d5913350SHisping Lin 685d5913350SHisping Lin memcpy(SharedMem.buffer, byte_buf, SharedMem.size); 686d5913350SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 687d5913350SHisping Lin TEEC_MEMREF_TEMP_INPUT, 688d5913350SHisping Lin TEEC_NONE, 689d5913350SHisping Lin TEEC_NONE); 690d5913350SHisping Lin 691d5913350SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 692d5913350SHisping Lin STORAGE_CMD_WRITE_OEM_NS_OTP, 693d5913350SHisping Lin &TeecOperation, 694d5913350SHisping Lin &ErrorOrigin); 695d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 696d5913350SHisping Lin goto exit; 697d5913350SHisping Lin 698d5913350SHisping Lin exit: 699d5913350SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem); 700d5913350SHisping Lin TEEC_CloseSession(&TeecSession); 701d5913350SHisping Lin TEEC_FinalizeContext(&TeecContext); 702d5913350SHisping Lin 703d5913350SHisping Lin return TeecResult; 704d5913350SHisping Lin } 705d5913350SHisping Lin 706d5913350SHisping Lin uint32_t trusty_read_oem_ns_otp(uint32_t byte_off, uint8_t *byte_buf, uint32_t byte_len) 707d5913350SHisping Lin { 708d5913350SHisping Lin TEEC_Result TeecResult; 709d5913350SHisping Lin TEEC_Context TeecContext; 710d5913350SHisping Lin TEEC_Session TeecSession; 711d5913350SHisping Lin uint32_t ErrorOrigin; 712d5913350SHisping Lin 713d5913350SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 714d5913350SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 715d5913350SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 716d5913350SHisping Lin TEEC_Operation TeecOperation = {0}; 717d5913350SHisping Lin 718d5913350SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 719d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 720d5913350SHisping Lin return TeecResult; 721d5913350SHisping Lin 722d5913350SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 723d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 724d5913350SHisping Lin return TeecResult; 725d5913350SHisping Lin 726d5913350SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 727d5913350SHisping Lin &TeecSession, 728d5913350SHisping Lin TeecUuid, 729d5913350SHisping Lin TEEC_LOGIN_PUBLIC, 730d5913350SHisping Lin NULL, 731d5913350SHisping Lin NULL, 732d5913350SHisping Lin &ErrorOrigin); 733d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 734d5913350SHisping Lin return TeecResult; 735d5913350SHisping Lin 736d5913350SHisping Lin TeecOperation.params[0].value.a = byte_off; 737d5913350SHisping Lin 738d5913350SHisping Lin TEEC_SharedMemory SharedMem = {0}; 739d5913350SHisping Lin 740d5913350SHisping Lin SharedMem.size = byte_len; 741d5913350SHisping Lin SharedMem.flags = 0; 742d5913350SHisping Lin 743d5913350SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem); 744d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 745d5913350SHisping Lin goto exit; 746d5913350SHisping Lin 747d5913350SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem.buffer; 748d5913350SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem.size; 749d5913350SHisping Lin 750d5913350SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 751d5913350SHisping Lin TEEC_MEMREF_TEMP_OUTPUT, 752d5913350SHisping Lin TEEC_NONE, 753d5913350SHisping Lin TEEC_NONE); 754d5913350SHisping Lin 755d5913350SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 756d5913350SHisping Lin STORAGE_CMD_READ_OEM_NS_OTP, 757d5913350SHisping Lin &TeecOperation, 758d5913350SHisping Lin &ErrorOrigin); 759d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 760d5913350SHisping Lin goto exit; 761d5913350SHisping Lin 762d5913350SHisping Lin memcpy(byte_buf, SharedMem.buffer, SharedMem.size); 763d5913350SHisping Lin 764d5913350SHisping Lin exit: 765d5913350SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem); 766d5913350SHisping Lin TEEC_CloseSession(&TeecSession); 767d5913350SHisping Lin TEEC_FinalizeContext(&TeecContext); 768d5913350SHisping Lin 769d5913350SHisping Lin return TeecResult; 770d5913350SHisping Lin } 771d5913350SHisping Lin 77290e849a0Sxb.wang uint32_t trusty_write_oem_otp_key(enum RK_OEM_OTP_KEYID key_id, 773bb1ba6acSHisping Lin uint8_t *byte_buf, uint32_t byte_len) 774bb1ba6acSHisping Lin { 775bb1ba6acSHisping Lin TEEC_Result TeecResult; 776bb1ba6acSHisping Lin TEEC_Context TeecContext; 777bb1ba6acSHisping Lin TEEC_Session TeecSession; 778bb1ba6acSHisping Lin uint32_t ErrorOrigin; 779bb1ba6acSHisping Lin 780bb1ba6acSHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 781bb1ba6acSHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 782bb1ba6acSHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 783bb1ba6acSHisping Lin TEEC_Operation TeecOperation = {0}; 784bb1ba6acSHisping Lin 785bb1ba6acSHisping Lin TeecResult = OpteeClientApiLibInitialize(); 786bb1ba6acSHisping Lin if (TeecResult != TEEC_SUCCESS) 787bb1ba6acSHisping Lin return TeecResult; 788bb1ba6acSHisping Lin 789bb1ba6acSHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 790bb1ba6acSHisping Lin if (TeecResult != TEEC_SUCCESS) 791bb1ba6acSHisping Lin return TeecResult; 792bb1ba6acSHisping Lin 793bb1ba6acSHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 794bb1ba6acSHisping Lin &TeecSession, 795bb1ba6acSHisping Lin TeecUuid, 796bb1ba6acSHisping Lin TEEC_LOGIN_PUBLIC, 797bb1ba6acSHisping Lin NULL, 798bb1ba6acSHisping Lin NULL, 799bb1ba6acSHisping Lin &ErrorOrigin); 800bb1ba6acSHisping Lin if (TeecResult != TEEC_SUCCESS) 801bb1ba6acSHisping Lin return TeecResult; 802bb1ba6acSHisping Lin 803bb1ba6acSHisping Lin TeecOperation.params[0].value.a = key_id; 804bb1ba6acSHisping Lin 805bb1ba6acSHisping Lin TEEC_SharedMemory SharedMem = {0}; 806bb1ba6acSHisping Lin 807bb1ba6acSHisping Lin SharedMem.size = byte_len; 808bb1ba6acSHisping Lin SharedMem.flags = 0; 809bb1ba6acSHisping Lin 810bb1ba6acSHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem); 811bb1ba6acSHisping Lin if (TeecResult != TEEC_SUCCESS) 812bb1ba6acSHisping Lin goto exit; 813bb1ba6acSHisping Lin 814bb1ba6acSHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem.buffer; 815bb1ba6acSHisping Lin TeecOperation.params[1].tmpref.size = SharedMem.size; 816bb1ba6acSHisping Lin 817bb1ba6acSHisping Lin memcpy(SharedMem.buffer, byte_buf, SharedMem.size); 818bb1ba6acSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 819bb1ba6acSHisping Lin TEEC_MEMREF_TEMP_INPUT, 820bb1ba6acSHisping Lin TEEC_NONE, 821bb1ba6acSHisping Lin TEEC_NONE); 822bb1ba6acSHisping Lin 823bb1ba6acSHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 82490e849a0Sxb.wang STORAGE_CMD_WRITE_OEM_OTP_KEY, 825bb1ba6acSHisping Lin &TeecOperation, 826bb1ba6acSHisping Lin &ErrorOrigin); 827bb1ba6acSHisping Lin if (TeecResult != TEEC_SUCCESS) 828bb1ba6acSHisping Lin goto exit; 829bb1ba6acSHisping Lin 830bb1ba6acSHisping Lin exit: 831bb1ba6acSHisping Lin TEEC_ReleaseSharedMemory(&SharedMem); 832bb1ba6acSHisping Lin TEEC_CloseSession(&TeecSession); 833bb1ba6acSHisping Lin TEEC_FinalizeContext(&TeecContext); 834bb1ba6acSHisping Lin 835bb1ba6acSHisping Lin return TeecResult; 836bb1ba6acSHisping Lin } 837bb1ba6acSHisping Lin 8389deb34f6SHisping Lin uint32_t trusty_oem_otp_key_is_written(enum RK_OEM_OTP_KEYID key_id, uint8_t *value) 8399deb34f6SHisping Lin { 8409deb34f6SHisping Lin TEEC_Result TeecResult; 8419deb34f6SHisping Lin TEEC_Context TeecContext; 8429deb34f6SHisping Lin TEEC_Session TeecSession; 8439deb34f6SHisping Lin uint32_t ErrorOrigin; 8449deb34f6SHisping Lin 8459deb34f6SHisping Lin *value = 0xFF; 8469deb34f6SHisping Lin 8479deb34f6SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 8489deb34f6SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 8499deb34f6SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 8509deb34f6SHisping Lin TEEC_Operation TeecOperation = {0}; 8519deb34f6SHisping Lin 8529deb34f6SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 8539deb34f6SHisping Lin if (TeecResult != TEEC_SUCCESS) 8549deb34f6SHisping Lin return TeecResult; 8559deb34f6SHisping Lin 8569deb34f6SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 8579deb34f6SHisping Lin if (TeecResult != TEEC_SUCCESS) 8589deb34f6SHisping Lin return TeecResult; 8599deb34f6SHisping Lin 8609deb34f6SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 8619deb34f6SHisping Lin &TeecSession, 8629deb34f6SHisping Lin TeecUuid, 8639deb34f6SHisping Lin TEEC_LOGIN_PUBLIC, 8649deb34f6SHisping Lin NULL, 8659deb34f6SHisping Lin NULL, 8669deb34f6SHisping Lin &ErrorOrigin); 8679deb34f6SHisping Lin if (TeecResult != TEEC_SUCCESS) 8689deb34f6SHisping Lin return TeecResult; 8699deb34f6SHisping Lin 8709deb34f6SHisping Lin TeecOperation.params[0].value.a = key_id; 8719deb34f6SHisping Lin 8729deb34f6SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INOUT, 8739deb34f6SHisping Lin TEEC_NONE, 8749deb34f6SHisping Lin TEEC_NONE, 8759deb34f6SHisping Lin TEEC_NONE); 8769deb34f6SHisping Lin 8779deb34f6SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 8789deb34f6SHisping Lin STORAGE_CMD_OEM_OTP_KEY_IS_WRITTEN, 8799deb34f6SHisping Lin &TeecOperation, 8809deb34f6SHisping Lin &ErrorOrigin); 8819deb34f6SHisping Lin if (TeecResult == TEEC_SUCCESS) 8829deb34f6SHisping Lin *value = TeecOperation.params[0].value.b; 8839deb34f6SHisping Lin 8849deb34f6SHisping Lin TEEC_CloseSession(&TeecSession); 8859deb34f6SHisping Lin TEEC_FinalizeContext(&TeecContext); 8869deb34f6SHisping Lin 8879deb34f6SHisping Lin return TeecResult; 8889deb34f6SHisping Lin } 8899deb34f6SHisping Lin 89090e849a0Sxb.wang uint32_t trusty_set_oem_hr_otp_read_lock(enum RK_OEM_OTP_KEYID key_id) 891a405238aSHisping Lin { 892a405238aSHisping Lin TEEC_Result TeecResult; 893a405238aSHisping Lin TEEC_Context TeecContext; 894a405238aSHisping Lin TEEC_Session TeecSession; 895a405238aSHisping Lin uint32_t ErrorOrigin; 896a405238aSHisping Lin 897a405238aSHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 898a405238aSHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 899a405238aSHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 900a405238aSHisping Lin TEEC_Operation TeecOperation = {0}; 901a405238aSHisping Lin 902a405238aSHisping Lin TeecResult = OpteeClientApiLibInitialize(); 903a405238aSHisping Lin if (TeecResult != TEEC_SUCCESS) 904a405238aSHisping Lin return TeecResult; 905a405238aSHisping Lin 906a405238aSHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 907a405238aSHisping Lin if (TeecResult != TEEC_SUCCESS) 908a405238aSHisping Lin return TeecResult; 909a405238aSHisping Lin 910a405238aSHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 911a405238aSHisping Lin &TeecSession, 912a405238aSHisping Lin TeecUuid, 913a405238aSHisping Lin TEEC_LOGIN_PUBLIC, 914a405238aSHisping Lin NULL, 915a405238aSHisping Lin NULL, 916a405238aSHisping Lin &ErrorOrigin); 917a405238aSHisping Lin if (TeecResult != TEEC_SUCCESS) 918a405238aSHisping Lin return TeecResult; 919a405238aSHisping Lin 920a405238aSHisping Lin TeecOperation.params[0].value.a = key_id; 921a405238aSHisping Lin 922a405238aSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 923a405238aSHisping Lin TEEC_NONE, 924a405238aSHisping Lin TEEC_NONE, 925a405238aSHisping Lin TEEC_NONE); 926a405238aSHisping Lin 927a405238aSHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 928a405238aSHisping Lin STORAGE_CMD_SET_OEM_HR_OTP_READ_LOCK, 929a405238aSHisping Lin &TeecOperation, 930a405238aSHisping Lin &ErrorOrigin); 931a405238aSHisping Lin if (TeecResult != TEEC_SUCCESS) 932a405238aSHisping Lin goto exit; 933a405238aSHisping Lin 934a405238aSHisping Lin exit: 935a405238aSHisping Lin TEEC_CloseSession(&TeecSession); 936a405238aSHisping Lin TEEC_FinalizeContext(&TeecContext); 937a405238aSHisping Lin 938a405238aSHisping Lin return TeecResult; 939a405238aSHisping Lin } 940a405238aSHisping Lin 9412f8c34bdSxb.wang uint32_t trusty_oem_otp_key_cipher(enum RK_OEM_OTP_KEYID key_id, rk_cipher_config *config, 9422f8c34bdSxb.wang uint32_t src_phys_addr, uint32_t dst_phys_addr, 9432f8c34bdSxb.wang uint32_t len) 944fc3694d6Sxb.wang { 945fc3694d6Sxb.wang TEEC_Result TeecResult; 946fc3694d6Sxb.wang TEEC_Context TeecContext; 947fc3694d6Sxb.wang TEEC_Session TeecSession; 948fc3694d6Sxb.wang TEEC_Operation TeecOperation = {0}; 949fc3694d6Sxb.wang uint32_t ErrorOrigin; 950fc3694d6Sxb.wang TEEC_UUID uuid = RK_CRYPTO_SERVICE_UUID; 951fc3694d6Sxb.wang TEEC_SharedMemory SharedMem_config = {0}; 952fc3694d6Sxb.wang 9532f8c34bdSxb.wang if (key_id != RK_OEM_OTP_KEY0 && 9542f8c34bdSxb.wang key_id != RK_OEM_OTP_KEY1 && 9552f8c34bdSxb.wang key_id != RK_OEM_OTP_KEY2 && 9562f8c34bdSxb.wang key_id != RK_OEM_OTP_KEY3 && 9572f8c34bdSxb.wang key_id != RK_OEM_OTP_KEY_FW) 958fc3694d6Sxb.wang return TEEC_ERROR_BAD_PARAMETERS; 959fc3694d6Sxb.wang 9602f8c34bdSxb.wang if (!config) 961fc3694d6Sxb.wang return TEEC_ERROR_BAD_PARAMETERS; 962fc3694d6Sxb.wang 963fc3694d6Sxb.wang if (config->algo != RK_ALGO_AES && config->algo != RK_ALGO_SM4) 964fc3694d6Sxb.wang return TEEC_ERROR_BAD_PARAMETERS; 965fc3694d6Sxb.wang 966fc3694d6Sxb.wang if (config->mode >= RK_CIPHER_MODE_XTS) 967fc3694d6Sxb.wang return TEEC_ERROR_BAD_PARAMETERS; 968fc3694d6Sxb.wang 969fc3694d6Sxb.wang if (config->operation != RK_MODE_ENCRYPT && 970fc3694d6Sxb.wang config->operation != RK_MODE_DECRYPT) 971fc3694d6Sxb.wang return TEEC_ERROR_BAD_PARAMETERS; 972fc3694d6Sxb.wang 973fc3694d6Sxb.wang if (config->key_len != 16 && 974fc3694d6Sxb.wang config->key_len != 24 && 975fc3694d6Sxb.wang config->key_len != 32) 976fc3694d6Sxb.wang return TEEC_ERROR_BAD_PARAMETERS; 977fc3694d6Sxb.wang 9782f8c34bdSxb.wang if (key_id == RK_OEM_OTP_KEY_FW && config->key_len != 16) 9792f8c34bdSxb.wang return TEEC_ERROR_BAD_PARAMETERS; 9802f8c34bdSxb.wang 9812f8c34bdSxb.wang #if defined(CONFIG_ROCKCHIP_RV1126) 9822f8c34bdSxb.wang if (config->key_len == 24) 9832f8c34bdSxb.wang return TEEC_ERROR_BAD_PARAMETERS; 9842f8c34bdSxb.wang #endif 9852f8c34bdSxb.wang 986fc3694d6Sxb.wang if (len % AES_BLOCK_SIZE || 987fc3694d6Sxb.wang len == 0) 988fc3694d6Sxb.wang return TEEC_ERROR_BAD_PARAMETERS; 989fc3694d6Sxb.wang 9902f8c34bdSxb.wang if (!src_phys_addr || !dst_phys_addr) 9912f8c34bdSxb.wang return TEEC_ERROR_BAD_PARAMETERS; 9922f8c34bdSxb.wang 993fc3694d6Sxb.wang TeecResult = OpteeClientApiLibInitialize(); 994fc3694d6Sxb.wang if (TeecResult != TEEC_SUCCESS) 995fc3694d6Sxb.wang return TeecResult; 996fc3694d6Sxb.wang 997fc3694d6Sxb.wang TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 998fc3694d6Sxb.wang if (TeecResult != TEEC_SUCCESS) 999fc3694d6Sxb.wang return TeecResult; 1000fc3694d6Sxb.wang 1001fc3694d6Sxb.wang TeecResult = TEEC_OpenSession(&TeecContext, 1002fc3694d6Sxb.wang &TeecSession, 1003fc3694d6Sxb.wang &uuid, 1004fc3694d6Sxb.wang TEEC_LOGIN_PUBLIC, 1005fc3694d6Sxb.wang NULL, 1006fc3694d6Sxb.wang NULL, 1007fc3694d6Sxb.wang &ErrorOrigin); 1008fc3694d6Sxb.wang if (TeecResult != TEEC_SUCCESS) 1009fc3694d6Sxb.wang goto exit; 1010fc3694d6Sxb.wang 1011fc3694d6Sxb.wang SharedMem_config.size = sizeof(rk_cipher_config); 1012fc3694d6Sxb.wang TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem_config); 1013fc3694d6Sxb.wang if (TeecResult != TEEC_SUCCESS) 1014fc3694d6Sxb.wang goto exit; 1015fc3694d6Sxb.wang 1016fc3694d6Sxb.wang memcpy(SharedMem_config.buffer, config, sizeof(rk_cipher_config)); 1017fc3694d6Sxb.wang TeecOperation.params[0].value.a = key_id; 1018fc3694d6Sxb.wang TeecOperation.params[1].tmpref.buffer = SharedMem_config.buffer; 1019fc3694d6Sxb.wang TeecOperation.params[1].tmpref.size = SharedMem_config.size; 10202f8c34bdSxb.wang TeecOperation.params[2].value.a = src_phys_addr; 10212f8c34bdSxb.wang TeecOperation.params[2].value.b = len; 10222f8c34bdSxb.wang TeecOperation.params[3].value.a = dst_phys_addr; 1023fc3694d6Sxb.wang TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 1024fc3694d6Sxb.wang TEEC_MEMREF_TEMP_INPUT, 10252f8c34bdSxb.wang TEEC_VALUE_INPUT, 10262f8c34bdSxb.wang TEEC_VALUE_INPUT); 10272f8c34bdSxb.wang 10282f8c34bdSxb.wang crypto_flush_cacheline(src_phys_addr, len); 10292f8c34bdSxb.wang crypto_flush_cacheline(dst_phys_addr, len); 10302f8c34bdSxb.wang 1031fc3694d6Sxb.wang TeecResult = TEEC_InvokeCommand(&TeecSession, 10322f8c34bdSxb.wang CRYPTO_SERVICE_CMD_OEM_OTP_KEY_PHYS_CIPHER, 1033fc3694d6Sxb.wang &TeecOperation, 1034fc3694d6Sxb.wang &ErrorOrigin); 1035fc3694d6Sxb.wang 1036a900eef3SHisping Lin crypto_invalidate_cacheline(dst_phys_addr, len); 1037a900eef3SHisping Lin 1038fc3694d6Sxb.wang exit: 1039fc3694d6Sxb.wang TEEC_ReleaseSharedMemory(&SharedMem_config); 1040fc3694d6Sxb.wang TEEC_CloseSession(&TeecSession); 1041fc3694d6Sxb.wang TEEC_FinalizeContext(&TeecContext); 1042fc3694d6Sxb.wang return TeecResult; 1043fc3694d6Sxb.wang } 1044fc3694d6Sxb.wang 10454aa61755SAndy Ye uint32_t trusty_attest_dh(uint8_t *dh, uint32_t *dh_size) 10464aa61755SAndy Ye { 10474aa61755SAndy Ye TEEC_Result TeecResult; 10484aa61755SAndy Ye TEEC_Context TeecContext; 10494aa61755SAndy Ye TEEC_Session TeecSession; 10504aa61755SAndy Ye uint32_t ErrorOrigin; 10514aa61755SAndy Ye TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6, 10524aa61755SAndy Ye { 0xa8, 0x69, 0x9c, 0xe6, 10534aa61755SAndy Ye 0x88, 0x6c, 0x5d, 0x5d 10544aa61755SAndy Ye } 10554aa61755SAndy Ye }; 10564aa61755SAndy Ye TEEC_UUID *TeecUuid = &tempuuid; 10574aa61755SAndy Ye TEEC_Operation TeecOperation = {0}; 10583251364cSHisping Lin struct blk_desc *dev_desc; 10593251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 10606651d4c0SJason Zhu if (!dev_desc) { 10616651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 10626651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 10636651d4c0SJason Zhu } 10644aa61755SAndy Ye 1065f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 1066f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1067f4e1db95SHisping Lin return TeecResult; 10684aa61755SAndy Ye 10694aa61755SAndy Ye TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1070f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1071f4e1db95SHisping Lin return TeecResult; 10724aa61755SAndy Ye 10733251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 10743251364cSHisping Lin TEEC_NONE, 10753251364cSHisping Lin TEEC_NONE, 10763251364cSHisping Lin TEEC_NONE); 10773251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 1078b9a7e756SHisping Lin if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0) 1079b9a7e756SHisping Lin TeecOperation.params[0].value.a = 1; 1080b9a7e756SHisping Lin else 1081b9a7e756SHisping Lin TeecOperation.params[0].value.a = 0; 1082b9a7e756SHisping Lin 10833251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 10843251364cSHisping Lin TeecOperation.params[0].value.a = 0; 10853251364cSHisping Lin #endif 10863251364cSHisping Lin 10874aa61755SAndy Ye TeecResult = TEEC_OpenSession(&TeecContext, 10884aa61755SAndy Ye &TeecSession, 10894aa61755SAndy Ye TeecUuid, 10904aa61755SAndy Ye TEEC_LOGIN_PUBLIC, 10914aa61755SAndy Ye NULL, 10923251364cSHisping Lin &TeecOperation, 10934aa61755SAndy Ye &ErrorOrigin); 1094f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1095f4e1db95SHisping Lin return TeecResult; 10964aa61755SAndy Ye 10974aa61755SAndy Ye TEEC_SharedMemory SharedMem0 = {0}; 10984aa61755SAndy Ye 10994aa61755SAndy Ye SharedMem0.size = *dh_size; 11004aa61755SAndy Ye SharedMem0.flags = 0; 11014aa61755SAndy Ye 11024aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 1103f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1104f4e1db95SHisping Lin goto exit; 11054aa61755SAndy Ye 11064aa61755SAndy Ye TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 11074aa61755SAndy Ye TeecOperation.params[0].tmpref.size = SharedMem0.size; 11084aa61755SAndy Ye 11094aa61755SAndy Ye TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, 11104aa61755SAndy Ye TEEC_NONE, 11114aa61755SAndy Ye TEEC_NONE, 11124aa61755SAndy Ye TEEC_NONE); 11134aa61755SAndy Ye 11144aa61755SAndy Ye TeecResult = TEEC_InvokeCommand(&TeecSession, 11154aa61755SAndy Ye 143, 11164aa61755SAndy Ye &TeecOperation, 11174aa61755SAndy Ye &ErrorOrigin); 1118f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1119f4e1db95SHisping Lin goto exit; 11204aa61755SAndy Ye 11214aa61755SAndy Ye *dh_size = TeecOperation.params[0].tmpref.size; 11224aa61755SAndy Ye memcpy(dh, SharedMem0.buffer, SharedMem0.size); 1123f4e1db95SHisping Lin exit: 11244aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem0); 11254aa61755SAndy Ye TEEC_CloseSession(&TeecSession); 1126f4e1db95SHisping Lin TEEC_FinalizeContext(&TeecContext); 11274aa61755SAndy Ye 11284aa61755SAndy Ye return TeecResult; 11294aa61755SAndy Ye } 11304aa61755SAndy Ye 11314aa61755SAndy Ye uint32_t trusty_attest_uuid(uint8_t *uuid, uint32_t *uuid_size) 11324aa61755SAndy Ye { 11334aa61755SAndy Ye TEEC_Result TeecResult; 11344aa61755SAndy Ye TEEC_Context TeecContext; 11354aa61755SAndy Ye TEEC_Session TeecSession; 11364aa61755SAndy Ye uint32_t ErrorOrigin; 11374aa61755SAndy Ye TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6, 11384aa61755SAndy Ye { 0xa8, 0x69, 0x9c, 0xe6, 11394aa61755SAndy Ye 0x88, 0x6c, 0x5d, 0x5d 11404aa61755SAndy Ye } 11414aa61755SAndy Ye }; 11424aa61755SAndy Ye TEEC_UUID *TeecUuid = &tempuuid; 11434aa61755SAndy Ye TEEC_Operation TeecOperation = {0}; 11443251364cSHisping Lin struct blk_desc *dev_desc; 11453251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 11466651d4c0SJason Zhu if (!dev_desc) { 11476651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 11486651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 11496651d4c0SJason Zhu } 11504aa61755SAndy Ye 1151f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 1152f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1153f4e1db95SHisping Lin return TeecResult; 11544aa61755SAndy Ye 11554aa61755SAndy Ye TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1156f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1157f4e1db95SHisping Lin return TeecResult; 11584aa61755SAndy Ye 11593251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 11603251364cSHisping Lin TEEC_NONE, 11613251364cSHisping Lin TEEC_NONE, 11623251364cSHisping Lin TEEC_NONE); 11633251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 1164b9a7e756SHisping Lin if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0) 1165b9a7e756SHisping Lin TeecOperation.params[0].value.a = 1; 1166b9a7e756SHisping Lin else 1167b9a7e756SHisping Lin TeecOperation.params[0].value.a = 0; 1168b9a7e756SHisping Lin 11693251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 11703251364cSHisping Lin TeecOperation.params[0].value.a = 0; 11713251364cSHisping Lin #endif 11723251364cSHisping Lin 11734aa61755SAndy Ye TeecResult = TEEC_OpenSession(&TeecContext, 11744aa61755SAndy Ye &TeecSession, 11754aa61755SAndy Ye TeecUuid, 11764aa61755SAndy Ye TEEC_LOGIN_PUBLIC, 11774aa61755SAndy Ye NULL, 11783251364cSHisping Lin &TeecOperation, 11794aa61755SAndy Ye &ErrorOrigin); 1180f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1181f4e1db95SHisping Lin return TeecResult; 11824aa61755SAndy Ye 11834aa61755SAndy Ye TEEC_SharedMemory SharedMem0 = {0}; 11844aa61755SAndy Ye 11854aa61755SAndy Ye SharedMem0.size = *uuid_size; 11864aa61755SAndy Ye SharedMem0.flags = 0; 11874aa61755SAndy Ye 11884aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 1189f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1190f4e1db95SHisping Lin goto exit; 11914aa61755SAndy Ye 11924aa61755SAndy Ye TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 11934aa61755SAndy Ye TeecOperation.params[0].tmpref.size = SharedMem0.size; 11944aa61755SAndy Ye 11954aa61755SAndy Ye TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, 11964aa61755SAndy Ye TEEC_NONE, 11974aa61755SAndy Ye TEEC_NONE, 11984aa61755SAndy Ye TEEC_NONE); 11994aa61755SAndy Ye 12004aa61755SAndy Ye TeecResult = TEEC_InvokeCommand(&TeecSession, 12014aa61755SAndy Ye 144, 12024aa61755SAndy Ye &TeecOperation, 12034aa61755SAndy Ye &ErrorOrigin); 1204f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1205f4e1db95SHisping Lin goto exit; 12064aa61755SAndy Ye 12074aa61755SAndy Ye *uuid_size = TeecOperation.params[0].tmpref.size; 12084aa61755SAndy Ye memcpy(uuid, SharedMem0.buffer, SharedMem0.size); 1209f4e1db95SHisping Lin exit: 12104aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem0); 12114aa61755SAndy Ye TEEC_CloseSession(&TeecSession); 1212f4e1db95SHisping Lin TEEC_FinalizeContext(&TeecContext); 12134aa61755SAndy Ye 12144aa61755SAndy Ye return TeecResult; 12154aa61755SAndy Ye } 12164aa61755SAndy Ye 12174aa61755SAndy Ye uint32_t trusty_attest_get_ca(uint8_t *operation_start, 12184aa61755SAndy Ye uint32_t *operation_size, 12194aa61755SAndy Ye uint8_t *out, 12204aa61755SAndy Ye uint32_t *out_len) 12214aa61755SAndy Ye { 12224aa61755SAndy Ye TEEC_Result TeecResult; 12234aa61755SAndy Ye TEEC_Context TeecContext; 12244aa61755SAndy Ye TEEC_Session TeecSession; 12254aa61755SAndy Ye uint32_t ErrorOrigin; 12264aa61755SAndy Ye 12274aa61755SAndy Ye TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6, 12284aa61755SAndy Ye { 0xa8, 0x69, 0x9c, 0xe6, 12294aa61755SAndy Ye 0x88, 0x6c, 0x5d, 0x5d 12304aa61755SAndy Ye } 12314aa61755SAndy Ye }; 12324aa61755SAndy Ye 12334aa61755SAndy Ye TEEC_UUID *TeecUuid = &tempuuid; 12344aa61755SAndy Ye TEEC_Operation TeecOperation = {0}; 12353251364cSHisping Lin struct blk_desc *dev_desc; 12363251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 12376651d4c0SJason Zhu if (!dev_desc) { 12386651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 12396651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 12406651d4c0SJason Zhu } 12414aa61755SAndy Ye 1242f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 1243f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1244f4e1db95SHisping Lin return TeecResult; 12454aa61755SAndy Ye 12464aa61755SAndy Ye TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1247f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1248f4e1db95SHisping Lin return TeecResult; 12494aa61755SAndy Ye 12503251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 12513251364cSHisping Lin TEEC_NONE, 12523251364cSHisping Lin TEEC_NONE, 12533251364cSHisping Lin TEEC_NONE); 12543251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 1255b9a7e756SHisping Lin if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0) 1256b9a7e756SHisping Lin TeecOperation.params[0].value.a = 1; 1257b9a7e756SHisping Lin else 1258b9a7e756SHisping Lin TeecOperation.params[0].value.a = 0; 1259b9a7e756SHisping Lin 12603251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 12613251364cSHisping Lin TeecOperation.params[0].value.a = 0; 12623251364cSHisping Lin #endif 12633251364cSHisping Lin 12644aa61755SAndy Ye TeecResult = TEEC_OpenSession(&TeecContext, 12654aa61755SAndy Ye &TeecSession, 12664aa61755SAndy Ye TeecUuid, 12674aa61755SAndy Ye TEEC_LOGIN_PUBLIC, 12684aa61755SAndy Ye NULL, 12693251364cSHisping Lin &TeecOperation, 12704aa61755SAndy Ye &ErrorOrigin); 1271f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1272f4e1db95SHisping Lin return TeecResult; 12734aa61755SAndy Ye 12744aa61755SAndy Ye TEEC_SharedMemory SharedMem0 = {0}; 12754aa61755SAndy Ye 12764aa61755SAndy Ye SharedMem0.size = *operation_size; 12774aa61755SAndy Ye SharedMem0.flags = 0; 12784aa61755SAndy Ye 12794aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 1280f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1281f4e1db95SHisping Lin goto exit; 12824aa61755SAndy Ye 12834aa61755SAndy Ye memcpy(SharedMem0.buffer, operation_start, SharedMem0.size); 12844aa61755SAndy Ye 12854aa61755SAndy Ye TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 12864aa61755SAndy Ye TeecOperation.params[0].tmpref.size = SharedMem0.size; 12874aa61755SAndy Ye 12884aa61755SAndy Ye TEEC_SharedMemory SharedMem1 = {0}; 12894aa61755SAndy Ye 12904aa61755SAndy Ye SharedMem1.size = *out_len; 12914aa61755SAndy Ye SharedMem1.flags = 0; 12924aa61755SAndy Ye 12934aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 1294f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1295f4e1db95SHisping Lin goto exit; 12964aa61755SAndy Ye 12974aa61755SAndy Ye TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 12984aa61755SAndy Ye TeecOperation.params[1].tmpref.size = SharedMem1.size; 12994aa61755SAndy Ye 13004aa61755SAndy Ye TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, 13014aa61755SAndy Ye TEEC_MEMREF_TEMP_INOUT, 13024aa61755SAndy Ye TEEC_NONE, 13034aa61755SAndy Ye TEEC_NONE); 13044aa61755SAndy Ye 13054aa61755SAndy Ye TeecResult = TEEC_InvokeCommand(&TeecSession, 13064aa61755SAndy Ye 145, 13074aa61755SAndy Ye &TeecOperation, 13084aa61755SAndy Ye &ErrorOrigin); 1309f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1310f4e1db95SHisping Lin goto exit; 13114aa61755SAndy Ye 13124aa61755SAndy Ye *out_len = TeecOperation.params[1].tmpref.size; 13134aa61755SAndy Ye memcpy(out, SharedMem1.buffer, SharedMem1.size); 1314f4e1db95SHisping Lin exit: 13154aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem0); 13164aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem1); 1317f4e1db95SHisping Lin TEEC_CloseSession(&TeecSession); 1318f4e1db95SHisping Lin TEEC_FinalizeContext(&TeecContext); 13194aa61755SAndy Ye 13204aa61755SAndy Ye return TeecResult; 13214aa61755SAndy Ye } 13224aa61755SAndy Ye 13234aa61755SAndy Ye uint32_t trusty_attest_set_ca(uint8_t *ca_response, uint32_t *ca_response_size) 13244aa61755SAndy Ye { 13254aa61755SAndy Ye TEEC_Result TeecResult; 13264aa61755SAndy Ye TEEC_Context TeecContext; 13274aa61755SAndy Ye TEEC_Session TeecSession; 13284aa61755SAndy Ye uint32_t ErrorOrigin; 13294aa61755SAndy Ye TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6, 13304aa61755SAndy Ye { 0xa8, 0x69, 0x9c, 0xe6, 13314aa61755SAndy Ye 0x88, 0x6c, 0x5d, 0x5d 13324aa61755SAndy Ye } 13334aa61755SAndy Ye }; 13344aa61755SAndy Ye TEEC_UUID *TeecUuid = &tempuuid; 13354aa61755SAndy Ye TEEC_Operation TeecOperation = {0}; 13363251364cSHisping Lin struct blk_desc *dev_desc; 13373251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 13386651d4c0SJason Zhu if (!dev_desc) { 13396651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 13406651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 13416651d4c0SJason Zhu } 1342f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 1343f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1344f4e1db95SHisping Lin return TeecResult; 13454aa61755SAndy Ye 13464aa61755SAndy Ye TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1347f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1348f4e1db95SHisping Lin return TeecResult; 13494aa61755SAndy Ye 13503251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 13513251364cSHisping Lin TEEC_NONE, 13523251364cSHisping Lin TEEC_NONE, 13533251364cSHisping Lin TEEC_NONE); 13543251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 1355b9a7e756SHisping Lin if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0) 1356b9a7e756SHisping Lin TeecOperation.params[0].value.a = 1; 1357b9a7e756SHisping Lin else 1358b9a7e756SHisping Lin TeecOperation.params[0].value.a = 0; 1359b9a7e756SHisping Lin 13603251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 13613251364cSHisping Lin TeecOperation.params[0].value.a = 0; 13623251364cSHisping Lin #endif 13633251364cSHisping Lin 13644aa61755SAndy Ye TeecResult = TEEC_OpenSession(&TeecContext, 13654aa61755SAndy Ye &TeecSession, 13664aa61755SAndy Ye TeecUuid, 13674aa61755SAndy Ye TEEC_LOGIN_PUBLIC, 13684aa61755SAndy Ye NULL, 13693251364cSHisping Lin &TeecOperation, 13704aa61755SAndy Ye &ErrorOrigin); 1371f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1372f4e1db95SHisping Lin return TeecResult; 13734aa61755SAndy Ye 13744aa61755SAndy Ye TEEC_SharedMemory SharedMem0 = {0}; 13754aa61755SAndy Ye 13764aa61755SAndy Ye SharedMem0.size = *ca_response_size; 13774aa61755SAndy Ye SharedMem0.flags = 0; 13784aa61755SAndy Ye 13794aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 1380f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1381f4e1db95SHisping Lin goto exit; 13824aa61755SAndy Ye 13834aa61755SAndy Ye memcpy(SharedMem0.buffer, ca_response, SharedMem0.size); 13844aa61755SAndy Ye 13854aa61755SAndy Ye TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 13864aa61755SAndy Ye TeecOperation.params[0].tmpref.size = SharedMem0.size; 13874aa61755SAndy Ye 13884aa61755SAndy Ye TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, 13894aa61755SAndy Ye TEEC_NONE, 13904aa61755SAndy Ye TEEC_NONE, 13914aa61755SAndy Ye TEEC_NONE); 13924aa61755SAndy Ye 13934aa61755SAndy Ye TeecResult = TEEC_InvokeCommand(&TeecSession, 13944aa61755SAndy Ye 146, 13954aa61755SAndy Ye &TeecOperation, 13964aa61755SAndy Ye &ErrorOrigin); 1397f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1398f4e1db95SHisping Lin goto exit; 1399f4e1db95SHisping Lin exit: 14004aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem0); 14014aa61755SAndy Ye TEEC_CloseSession(&TeecSession); 1402f4e1db95SHisping Lin TEEC_FinalizeContext(&TeecContext); 14034aa61755SAndy Ye 14044aa61755SAndy Ye return TeecResult; 14054aa61755SAndy Ye } 1406