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 29bb1ba6acSHisping Lin #define STORAGE_CMD_WRITE_OEM_HR_OTP 14 30a405238aSHisping Lin #define STORAGE_CMD_SET_OEM_HR_OTP_READ_LOCK 15 31ae8ec5e1SHisping Lin 32ae8ec5e1SHisping Lin static uint8_t b2hs_add_base(uint8_t in) 33ae8ec5e1SHisping Lin { 34ae8ec5e1SHisping Lin if (in > 9) 35ae8ec5e1SHisping Lin return in + 55; 36ae8ec5e1SHisping Lin else 37ae8ec5e1SHisping Lin return in + 48; 38ae8ec5e1SHisping Lin } 39ae8ec5e1SHisping Lin 40c7de5349SHisping Lin static uint32_t b2hs(uint8_t *b, uint8_t *hs, uint32_t blen, uint32_t hslen) 41ae8ec5e1SHisping Lin { 42ae8ec5e1SHisping Lin uint32_t i = 0; 43ae8ec5e1SHisping Lin 44ae8ec5e1SHisping Lin if (blen * 2 + 1 > hslen) 45ae8ec5e1SHisping Lin return 0; 46ae8ec5e1SHisping Lin 47ae8ec5e1SHisping Lin for (; i < blen; i++) { 48ae8ec5e1SHisping Lin hs[i * 2 + 1] = b2hs_add_base(b[i] & 0xf); 49ae8ec5e1SHisping Lin hs[i * 2] = b2hs_add_base(b[i] >> 4); 50ae8ec5e1SHisping Lin } 51ae8ec5e1SHisping Lin hs[blen * 2] = 0; 52ae8ec5e1SHisping Lin 53ae8ec5e1SHisping Lin return blen * 2; 54ae8ec5e1SHisping Lin } 55ae8ec5e1SHisping Lin 56c7de5349SHisping Lin static uint32_t trusty_base_write_security_data(char *filename, 57c7de5349SHisping Lin uint32_t filename_size, 58c7de5349SHisping Lin uint8_t *data, 59c7de5349SHisping Lin uint32_t data_size) 60ae8ec5e1SHisping Lin { 61ae8ec5e1SHisping Lin TEEC_Result TeecResult; 62ae8ec5e1SHisping Lin TEEC_Context TeecContext; 63ae8ec5e1SHisping Lin TEEC_Session TeecSession; 64ae8ec5e1SHisping Lin uint32_t ErrorOrigin; 65ae8ec5e1SHisping Lin TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 66ae8ec5e1SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 67ae8ec5e1SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 68ae8ec5e1SHisping Lin TEEC_Operation TeecOperation = {0}; 693251364cSHisping Lin struct blk_desc *dev_desc; 703251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 716651d4c0SJason Zhu if (!dev_desc) { 726651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 736651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 746651d4c0SJason Zhu } 753251364cSHisping Lin 76f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 77f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 78f4e1db95SHisping Lin return TeecResult; 79ae8ec5e1SHisping Lin 80ae8ec5e1SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 81f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 82f4e1db95SHisping Lin return TeecResult; 83ae8ec5e1SHisping Lin 843251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 853251364cSHisping Lin TEEC_NONE, 863251364cSHisping Lin TEEC_NONE, 873251364cSHisping Lin TEEC_NONE); 883251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 89b9a7e756SHisping Lin if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0) 90b9a7e756SHisping Lin TeecOperation.params[0].value.a = 1; 91b9a7e756SHisping Lin else 92b9a7e756SHisping Lin TeecOperation.params[0].value.a = 0; 933251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 943251364cSHisping Lin TeecOperation.params[0].value.a = 0; 953251364cSHisping Lin #endif 963251364cSHisping Lin 97ae8ec5e1SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 98ae8ec5e1SHisping Lin &TeecSession, 99ae8ec5e1SHisping Lin TeecUuid, 100ae8ec5e1SHisping Lin TEEC_LOGIN_PUBLIC, 101ae8ec5e1SHisping Lin NULL, 1023251364cSHisping Lin &TeecOperation, 103ae8ec5e1SHisping Lin &ErrorOrigin); 104f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 105f4e1db95SHisping Lin return TeecResult; 106ae8ec5e1SHisping Lin 107ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 108ae8ec5e1SHisping Lin 109c7de5349SHisping Lin SharedMem0.size = filename_size; 110ae8ec5e1SHisping Lin SharedMem0.flags = 0; 111ae8ec5e1SHisping Lin 112ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 113f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 114f4e1db95SHisping Lin goto exit; 115ae8ec5e1SHisping Lin 116c7de5349SHisping Lin memcpy(SharedMem0.buffer, filename, SharedMem0.size); 117ae8ec5e1SHisping Lin 118ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem1 = {0}; 119ae8ec5e1SHisping Lin 120c7de5349SHisping Lin SharedMem1.size = data_size; 121c7de5349SHisping Lin SharedMem1.flags = 0; 122c7de5349SHisping Lin 123c7de5349SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 124c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 125c7de5349SHisping Lin goto exit; 126c7de5349SHisping Lin 127c7de5349SHisping Lin memcpy(SharedMem1.buffer, data, SharedMem1.size); 128c7de5349SHisping Lin 129c7de5349SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 130c7de5349SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 131c7de5349SHisping Lin 132c7de5349SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 133c7de5349SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem1.size; 134c7de5349SHisping Lin 135c7de5349SHisping Lin 136c7de5349SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 137c7de5349SHisping Lin TEEC_MEMREF_TEMP_INOUT, 138c7de5349SHisping Lin TEEC_NONE, 139c7de5349SHisping Lin TEEC_NONE); 140c7de5349SHisping Lin 141c7de5349SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 142c7de5349SHisping Lin 1, 143c7de5349SHisping Lin &TeecOperation, 144c7de5349SHisping Lin &ErrorOrigin); 145c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 146c7de5349SHisping Lin goto exit; 147c7de5349SHisping Lin exit: 148c7de5349SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 149c7de5349SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem1); 150c7de5349SHisping Lin TEEC_CloseSession(&TeecSession); 151c7de5349SHisping Lin TEEC_FinalizeContext(&TeecContext); 152c7de5349SHisping Lin 153c7de5349SHisping Lin return TeecResult; 154c7de5349SHisping Lin } 155c7de5349SHisping Lin 156c7de5349SHisping Lin static uint32_t trusty_base_read_security_data(char *filename, 157c7de5349SHisping Lin uint32_t filename_size, 158c7de5349SHisping Lin uint8_t *data, 159c7de5349SHisping Lin uint32_t data_size) 160c7de5349SHisping Lin { 161c7de5349SHisping Lin TEEC_Result TeecResult; 162c7de5349SHisping Lin TEEC_Context TeecContext; 163c7de5349SHisping Lin TEEC_Session TeecSession; 164c7de5349SHisping Lin uint32_t ErrorOrigin; 165c7de5349SHisping Lin TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 166c7de5349SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 167c7de5349SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 168c7de5349SHisping Lin TEEC_Operation TeecOperation = {0}; 169c7de5349SHisping Lin 170c7de5349SHisping Lin struct blk_desc *dev_desc; 171c7de5349SHisping Lin dev_desc = rockchip_get_bootdev(); 172c7de5349SHisping Lin if (!dev_desc) { 173c7de5349SHisping Lin printf("%s: dev_desc is NULL!\n", __func__); 174c7de5349SHisping Lin return -TEEC_ERROR_GENERIC; 175c7de5349SHisping Lin } 176c7de5349SHisping Lin 177c7de5349SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 178c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 179c7de5349SHisping Lin return TeecResult; 180c7de5349SHisping Lin 181c7de5349SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 182c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 183c7de5349SHisping Lin return TeecResult; 184c7de5349SHisping Lin 185c7de5349SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 186c7de5349SHisping Lin TEEC_NONE, 187c7de5349SHisping Lin TEEC_NONE, 188c7de5349SHisping Lin TEEC_NONE); 189c7de5349SHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 190c7de5349SHisping Lin if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0) 191c7de5349SHisping Lin TeecOperation.params[0].value.a = 1; 192c7de5349SHisping Lin else 193c7de5349SHisping Lin TeecOperation.params[0].value.a = 0; 194c7de5349SHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 195c7de5349SHisping Lin TeecOperation.params[0].value.a = 0; 196c7de5349SHisping Lin #endif 197c7de5349SHisping Lin 198c7de5349SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 199c7de5349SHisping Lin &TeecSession, 200c7de5349SHisping Lin TeecUuid, 201c7de5349SHisping Lin TEEC_LOGIN_PUBLIC, 202c7de5349SHisping Lin NULL, 203c7de5349SHisping Lin &TeecOperation, 204c7de5349SHisping Lin &ErrorOrigin); 205c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 206c7de5349SHisping Lin return TeecResult; 207c7de5349SHisping Lin 208c7de5349SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 209c7de5349SHisping Lin 210c7de5349SHisping Lin SharedMem0.size = filename_size; 211c7de5349SHisping Lin SharedMem0.flags = 0; 212c7de5349SHisping Lin 213c7de5349SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 214c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 215c7de5349SHisping Lin goto exit; 216c7de5349SHisping Lin 217c7de5349SHisping Lin memcpy(SharedMem0.buffer, filename, SharedMem0.size); 218c7de5349SHisping Lin 219c7de5349SHisping Lin TEEC_SharedMemory SharedMem1 = {0}; 220c7de5349SHisping Lin 221c7de5349SHisping Lin SharedMem1.size = data_size; 222ae8ec5e1SHisping Lin SharedMem1.flags = 0; 223ae8ec5e1SHisping Lin 224ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 225f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 226f4e1db95SHisping Lin goto exit; 227ae8ec5e1SHisping Lin 228ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 229ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 230ae8ec5e1SHisping Lin 231ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 232ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem1.size; 233ae8ec5e1SHisping Lin 234ae8ec5e1SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 235ae8ec5e1SHisping Lin TEEC_MEMREF_TEMP_INOUT, 236ae8ec5e1SHisping Lin TEEC_NONE, 237ae8ec5e1SHisping Lin TEEC_NONE); 238ae8ec5e1SHisping Lin 239ae8ec5e1SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 240ae8ec5e1SHisping Lin 0, 241ae8ec5e1SHisping Lin &TeecOperation, 242ae8ec5e1SHisping Lin &ErrorOrigin); 24346b2a054SHisping Lin if (TeecResult == TEEC_SUCCESS) 244c7de5349SHisping Lin memcpy(data, SharedMem1.buffer, SharedMem1.size); 245f4e1db95SHisping Lin exit: 246ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 247ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem1); 248ae8ec5e1SHisping Lin TEEC_CloseSession(&TeecSession); 24946b2a054SHisping Lin TEEC_FinalizeContext(&TeecContext); 250ae8ec5e1SHisping Lin 251ae8ec5e1SHisping Lin return TeecResult; 252ae8ec5e1SHisping Lin } 253ae8ec5e1SHisping Lin 254c7de5349SHisping Lin static uint32_t trusty_base_end_security_data(void) 255c7de5349SHisping Lin { 256c7de5349SHisping Lin TEEC_Result TeecResult; 257c7de5349SHisping Lin TEEC_Context TeecContext; 258c7de5349SHisping Lin TEEC_Session TeecSession; 259c7de5349SHisping Lin uint32_t ErrorOrigin; 260c7de5349SHisping Lin TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 261c7de5349SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 262c7de5349SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 263c7de5349SHisping Lin TEEC_Operation TeecOperation = {0}; 264c7de5349SHisping Lin 265c7de5349SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 266c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 267c7de5349SHisping Lin return TeecResult; 268c7de5349SHisping Lin 269c7de5349SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 270c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 271c7de5349SHisping Lin return TeecResult; 272c7de5349SHisping Lin 273c7de5349SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 274c7de5349SHisping Lin &TeecSession, 275c7de5349SHisping Lin TeecUuid, 276c7de5349SHisping Lin TEEC_LOGIN_PUBLIC, 277c7de5349SHisping Lin NULL, 278c7de5349SHisping Lin NULL, 279c7de5349SHisping Lin &ErrorOrigin); 280c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 281c7de5349SHisping Lin return TeecResult; 282c7de5349SHisping Lin 283c7de5349SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE, 284c7de5349SHisping Lin TEEC_NONE, 285c7de5349SHisping Lin TEEC_NONE, 286c7de5349SHisping Lin TEEC_NONE); 287c7de5349SHisping Lin 288c7de5349SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 289c7de5349SHisping Lin 2, 290c7de5349SHisping Lin &TeecOperation, 291c7de5349SHisping Lin &ErrorOrigin); 292c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 293c7de5349SHisping Lin goto exit; 294c7de5349SHisping Lin exit: 295c7de5349SHisping Lin TEEC_CloseSession(&TeecSession); 296c7de5349SHisping Lin TEEC_FinalizeContext(&TeecContext); 297c7de5349SHisping Lin 298c7de5349SHisping Lin return TeecResult; 299c7de5349SHisping Lin } 300c7de5349SHisping Lin 301c7de5349SHisping Lin uint32_t trusty_read_rollback_index(uint32_t slot, uint64_t *value) 302c7de5349SHisping Lin { 303c7de5349SHisping Lin char hs[9]; 304c7de5349SHisping Lin 305c7de5349SHisping Lin b2hs((uint8_t *)&slot, (uint8_t *)hs, 4, 9); 306c7de5349SHisping Lin 307c7de5349SHisping Lin return trusty_base_read_security_data(hs, 8, (uint8_t *)value, 8); 308c7de5349SHisping Lin } 309c7de5349SHisping Lin 310ae8ec5e1SHisping Lin uint32_t trusty_write_rollback_index(uint32_t slot, uint64_t value) 311ae8ec5e1SHisping Lin { 312c7de5349SHisping Lin char hs[9]; 3133251364cSHisping Lin 314c7de5349SHisping Lin b2hs((uint8_t *)&slot, (uint8_t *)hs, 4, 9); 315ae8ec5e1SHisping Lin 316c7de5349SHisping Lin return trusty_base_write_security_data(hs, 8, (uint8_t *)&value, 8); 317ae8ec5e1SHisping Lin } 318ae8ec5e1SHisping Lin 319ae8ec5e1SHisping Lin uint32_t trusty_read_permanent_attributes(uint8_t *attributes, uint32_t size) 320ae8ec5e1SHisping Lin { 321c7de5349SHisping Lin return trusty_base_read_security_data("attributes", 322c7de5349SHisping Lin sizeof("attributes"), attributes, size); 323ae8ec5e1SHisping Lin } 324ae8ec5e1SHisping Lin 325ae8ec5e1SHisping Lin uint32_t trusty_write_permanent_attributes(uint8_t *attributes, uint32_t size) 326ae8ec5e1SHisping Lin { 327c7de5349SHisping Lin return trusty_base_write_security_data("attributes", 328c7de5349SHisping Lin sizeof("attributes"), attributes, size); 3296651d4c0SJason Zhu } 330ae8ec5e1SHisping Lin 331c7de5349SHisping Lin uint32_t trusty_read_permanent_attributes_flag(uint8_t *attributes) 332c7de5349SHisping Lin { 333c7de5349SHisping Lin return trusty_base_read_security_data("attributes_flag", 334c7de5349SHisping Lin sizeof("attributes_flag"), attributes, 1); 335c7de5349SHisping Lin } 336ae8ec5e1SHisping Lin 337c7de5349SHisping Lin uint32_t trusty_write_permanent_attributes_flag(uint8_t attributes) 338c7de5349SHisping Lin { 339c7de5349SHisping Lin return trusty_base_write_security_data("attributes_flag", 340c7de5349SHisping Lin sizeof("attributes_flag"), &attributes, 1); 341ae8ec5e1SHisping Lin } 342ae8ec5e1SHisping Lin 343564654ebSJason Zhu uint32_t trusty_read_permanent_attributes_cer(uint8_t *attributes, 344564654ebSJason Zhu uint32_t size) 345564654ebSJason Zhu { 346c7de5349SHisping Lin return trusty_base_read_security_data("rsacer", 347c7de5349SHisping Lin sizeof("rsacer"), attributes, size); 348564654ebSJason Zhu } 349564654ebSJason Zhu 350564654ebSJason Zhu uint32_t trusty_write_permanent_attributes_cer(uint8_t *attributes, 351564654ebSJason Zhu uint32_t size) 352564654ebSJason Zhu { 353c7de5349SHisping Lin return trusty_base_write_security_data("rsacer", 354c7de5349SHisping Lin sizeof("rsacer"), attributes, size); 355564654ebSJason Zhu } 356564654ebSJason Zhu 357ae8ec5e1SHisping Lin uint32_t trusty_read_lock_state(uint8_t *lock_state) 358ae8ec5e1SHisping Lin { 359c7de5349SHisping Lin return trusty_base_read_security_data("lock_state", 360c7de5349SHisping Lin sizeof("lock_state"), lock_state, 1); 361ae8ec5e1SHisping Lin } 362ae8ec5e1SHisping Lin 363ae8ec5e1SHisping Lin uint32_t trusty_write_lock_state(uint8_t lock_state) 364ae8ec5e1SHisping Lin { 365c7de5349SHisping Lin return trusty_base_write_security_data("lock_state", 366c7de5349SHisping Lin sizeof("lock_state"), &lock_state, 1); 367ae8ec5e1SHisping Lin } 368ae8ec5e1SHisping Lin 369ae8ec5e1SHisping Lin uint32_t trusty_read_flash_lock_state(uint8_t *flash_lock_state) 370ae8ec5e1SHisping Lin { 371c7de5349SHisping Lin return trusty_base_read_security_data("flash_lock_state", 372c7de5349SHisping Lin sizeof("flash_lock_state"), flash_lock_state, 1); 373c7de5349SHisping Lin } 374c7de5349SHisping Lin 375c7de5349SHisping Lin uint32_t trusty_write_flash_lock_state(uint8_t flash_lock_state) 376c7de5349SHisping Lin { 377c7de5349SHisping Lin return trusty_base_write_security_data("flash_lock_state", 378c7de5349SHisping Lin sizeof("flash_lock_state"), &flash_lock_state, 1); 379c7de5349SHisping Lin } 380c7de5349SHisping Lin 381c7de5349SHisping Lin static uint32_t trusty_base_end_efuse_or_otp(void) 382c7de5349SHisping Lin { 383ae8ec5e1SHisping Lin TEEC_Result TeecResult; 384ae8ec5e1SHisping Lin TEEC_Context TeecContext; 385ae8ec5e1SHisping Lin TEEC_Session TeecSession; 386ae8ec5e1SHisping Lin uint32_t ErrorOrigin; 387c7de5349SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 388c7de5349SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 389c7de5349SHisping Lin 390ae8ec5e1SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 391ae8ec5e1SHisping Lin TEEC_Operation TeecOperation = {0}; 392ae8ec5e1SHisping Lin 393f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 394f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 395f4e1db95SHisping Lin return TeecResult; 396ae8ec5e1SHisping Lin 397ae8ec5e1SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 398f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 399f4e1db95SHisping Lin return TeecResult; 400ae8ec5e1SHisping Lin 401ae8ec5e1SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 402ae8ec5e1SHisping Lin &TeecSession, 403ae8ec5e1SHisping Lin TeecUuid, 404ae8ec5e1SHisping Lin TEEC_LOGIN_PUBLIC, 405ae8ec5e1SHisping Lin NULL, 406c7de5349SHisping Lin NULL, 407ae8ec5e1SHisping Lin &ErrorOrigin); 408f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 409f4e1db95SHisping Lin return TeecResult; 410ae8ec5e1SHisping Lin 411c7de5349SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE, 412c7de5349SHisping Lin TEEC_NONE, 413ae8ec5e1SHisping Lin TEEC_NONE, 414ae8ec5e1SHisping Lin TEEC_NONE); 415ae8ec5e1SHisping Lin 416ae8ec5e1SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 417c7de5349SHisping Lin STORAGE_CMD_UBOOT_END_OTP, 418ae8ec5e1SHisping Lin &TeecOperation, 419ae8ec5e1SHisping Lin &ErrorOrigin); 420c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 421c7de5349SHisping Lin goto exit; 422f4e1db95SHisping Lin exit: 423ae8ec5e1SHisping Lin TEEC_CloseSession(&TeecSession); 42446b2a054SHisping Lin TEEC_FinalizeContext(&TeecContext); 425ae8ec5e1SHisping Lin 426ae8ec5e1SHisping Lin return TeecResult; 427ae8ec5e1SHisping Lin } 428ae8ec5e1SHisping Lin 429c7de5349SHisping Lin static uint32_t trusty_base_efuse_or_otp_operation(uint32_t cmd, 430c7de5349SHisping Lin uint8_t is_write, 431c7de5349SHisping Lin uint32_t *buf, 432c7de5349SHisping Lin uint32_t length) 433ae8ec5e1SHisping Lin { 434ae8ec5e1SHisping Lin TEEC_Result TeecResult; 435ae8ec5e1SHisping Lin TEEC_Context TeecContext; 436ae8ec5e1SHisping Lin TEEC_Session TeecSession; 437ae8ec5e1SHisping Lin uint32_t ErrorOrigin; 438c7de5349SHisping Lin 439c7de5349SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 440c7de5349SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 441ae8ec5e1SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 442ae8ec5e1SHisping Lin TEEC_Operation TeecOperation = {0}; 443ae8ec5e1SHisping Lin 444f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 445f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 446f4e1db95SHisping Lin return TeecResult; 447ae8ec5e1SHisping Lin 448ae8ec5e1SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 449f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 450f4e1db95SHisping Lin return TeecResult; 451ae8ec5e1SHisping Lin 452ae8ec5e1SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 453ae8ec5e1SHisping Lin &TeecSession, 454ae8ec5e1SHisping Lin TeecUuid, 455ae8ec5e1SHisping Lin TEEC_LOGIN_PUBLIC, 456ae8ec5e1SHisping Lin NULL, 457c7de5349SHisping Lin NULL, 458ae8ec5e1SHisping Lin &ErrorOrigin); 459f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 460f4e1db95SHisping Lin return TeecResult; 461ae8ec5e1SHisping Lin 462ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 463ae8ec5e1SHisping Lin 464c7de5349SHisping Lin SharedMem0.size = length * sizeof(uint32_t); 465ae8ec5e1SHisping Lin SharedMem0.flags = 0; 466ae8ec5e1SHisping Lin 467ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 468f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 469f4e1db95SHisping Lin goto exit; 470ae8ec5e1SHisping Lin 471ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 472ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 473ae8ec5e1SHisping Lin 474c7de5349SHisping Lin if (is_write) { 475c7de5349SHisping Lin memcpy(SharedMem0.buffer, buf, SharedMem0.size); 476ae8ec5e1SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 477c7de5349SHisping Lin TEEC_NONE, 478ae8ec5e1SHisping Lin TEEC_NONE, 479ae8ec5e1SHisping Lin TEEC_NONE); 480ae8ec5e1SHisping Lin 481c7de5349SHisping Lin } else { 482c7de5349SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT, 483c7de5349SHisping Lin TEEC_NONE, 484c7de5349SHisping Lin TEEC_NONE, 485c7de5349SHisping Lin TEEC_NONE); 486c7de5349SHisping Lin } 487c7de5349SHisping Lin 488ae8ec5e1SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 489c7de5349SHisping Lin cmd, 490ae8ec5e1SHisping Lin &TeecOperation, 491ae8ec5e1SHisping Lin &ErrorOrigin); 492f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 493f4e1db95SHisping Lin goto exit; 494c7de5349SHisping Lin 495c7de5349SHisping Lin if (!is_write) 496c7de5349SHisping Lin memcpy(buf, SharedMem0.buffer, SharedMem0.size); 497c7de5349SHisping Lin 498f4e1db95SHisping Lin exit: 499ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 500ae8ec5e1SHisping Lin TEEC_CloseSession(&TeecSession); 50146b2a054SHisping Lin TEEC_FinalizeContext(&TeecContext); 502ae8ec5e1SHisping Lin 503ae8ec5e1SHisping Lin return TeecResult; 504ae8ec5e1SHisping Lin } 505ae8ec5e1SHisping Lin 5066ef445a4SHisping Lin uint32_t trusty_read_attribute_hash(uint32_t *buf, uint32_t length) 5076ef445a4SHisping Lin { 508c7de5349SHisping Lin return trusty_base_efuse_or_otp_operation(STORAGE_CMD_READ_ATTRIBUTE_HASH, 509c7de5349SHisping Lin false, buf, length); 5106ef445a4SHisping Lin } 5116ef445a4SHisping Lin 5126ef445a4SHisping Lin uint32_t trusty_write_attribute_hash(uint32_t *buf, uint32_t length) 5136ef445a4SHisping Lin { 514c7de5349SHisping Lin return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_ATTRIBUTE_HASH, 515c7de5349SHisping Lin true, buf, length); 51616539616SHisping Lin } 51716539616SHisping Lin 51816539616SHisping Lin uint32_t trusty_notify_optee_uboot_end(void) 51916539616SHisping Lin { 52016539616SHisping Lin TEEC_Result res; 521c7de5349SHisping Lin 522c7de5349SHisping Lin res = trusty_base_end_security_data(); 523c7de5349SHisping Lin res |= trusty_base_end_efuse_or_otp(); 52416539616SHisping Lin return res; 52516539616SHisping Lin } 5262cd27853SHisping Lin 5272cd27853SHisping Lin uint32_t trusty_read_vbootkey_hash(uint32_t *buf, uint32_t length) 5282cd27853SHisping Lin { 529c7de5349SHisping Lin return trusty_base_efuse_or_otp_operation(STORAGE_CMD_READ_VBOOTKEY_HASH, 530c7de5349SHisping Lin false, buf, length); 5312cd27853SHisping Lin } 532c7de5349SHisping Lin 5332cd27853SHisping Lin uint32_t trusty_write_vbootkey_hash(uint32_t *buf, uint32_t length) 5342cd27853SHisping Lin { 535c7de5349SHisping Lin return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_VBOOTKEY_HASH, 536c7de5349SHisping Lin true, buf, length); 5372cd27853SHisping Lin } 538095e2a82SHisping Lin 539468df3b2SHisping Lin uint32_t trusty_read_vbootkey_enable_flag(uint8_t *flag) 540468df3b2SHisping Lin { 541468df3b2SHisping Lin uint32_t bootflag; 542c7de5349SHisping Lin TEEC_Result TeecResult; 543468df3b2SHisping Lin 544*f07e1686SHisping Lin *flag = 0; 545*f07e1686SHisping Lin 546c7de5349SHisping Lin TeecResult = trusty_base_efuse_or_otp_operation(STORAGE_CMD_READ_ENABLE_FLAG, 547c7de5349SHisping Lin false, &bootflag, 1); 548468df3b2SHisping Lin 549468df3b2SHisping Lin if (TeecResult == TEEC_SUCCESS) { 5500202ee8aSHisping Lin #if defined(CONFIG_ROCKCHIP_RK3288) 5510202ee8aSHisping Lin if (bootflag == 0x00000001) 5520202ee8aSHisping Lin *flag = 1; 5530202ee8aSHisping Lin #else 554468df3b2SHisping Lin if (bootflag == 0x000000FF) 555468df3b2SHisping Lin *flag = 1; 5560202ee8aSHisping Lin #endif 557468df3b2SHisping Lin } 558095e2a82SHisping Lin return TeecResult; 559095e2a82SHisping Lin } 5604aa61755SAndy Ye 5611ef63c75SHisping Lin uint32_t trusty_write_ta_encryption_key(uint32_t *buf, uint32_t length) 5621ef63c75SHisping Lin { 5631ef63c75SHisping Lin return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_TA_ENCRYPTION_KEY, 5641ef63c75SHisping Lin true, buf, length); 5651ef63c75SHisping Lin } 5661ef63c75SHisping Lin 567fbf29bfbSHisping Lin uint32_t trusty_check_security_level_flag(uint8_t flag) 568fbf29bfbSHisping Lin { 569fbf29bfbSHisping Lin uint32_t levelflag; 570fbf29bfbSHisping Lin 571fbf29bfbSHisping Lin levelflag = flag; 572fbf29bfbSHisping Lin return trusty_base_efuse_or_otp_operation(STORAGE_CMD_CHECK_SECURITY_LEVEL_FLAG, 573fbf29bfbSHisping Lin true, &levelflag, 1); 574fbf29bfbSHisping Lin } 575fbf29bfbSHisping Lin 576f39d4289SHisping Lin uint32_t trusty_write_oem_huk(uint32_t *buf, uint32_t length) 577f39d4289SHisping Lin { 578f39d4289SHisping Lin return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_OEM_HUK, 579f39d4289SHisping Lin true, buf, length); 580f39d4289SHisping Lin } 581f39d4289SHisping Lin 5827504da74SHisping Lin void trusty_select_security_level(void) 5837504da74SHisping Lin { 5847504da74SHisping Lin #if (CONFIG_OPTEE_SECURITY_LEVEL > 0) 5857504da74SHisping Lin TEEC_Result TeecResult; 5867504da74SHisping Lin 5877504da74SHisping Lin TeecResult = trusty_check_security_level_flag(CONFIG_OPTEE_SECURITY_LEVEL); 5887504da74SHisping Lin if (TeecResult == TEE_ERROR_CANCEL) { 5897504da74SHisping Lin run_command("download", 0); 5907504da74SHisping Lin return; 5917504da74SHisping Lin } 5927504da74SHisping Lin 5937504da74SHisping Lin if (TeecResult == TEEC_SUCCESS) 5947504da74SHisping Lin debug("optee select security level success!"); 5957504da74SHisping Lin else 5967504da74SHisping Lin panic("optee select security level fail!"); 5977504da74SHisping Lin 5987504da74SHisping Lin return; 5997504da74SHisping Lin #endif 6007504da74SHisping Lin } 6017504da74SHisping Lin 602d5913350SHisping Lin uint32_t trusty_write_oem_ns_otp(uint32_t byte_off, uint8_t *byte_buf, uint32_t byte_len) 603d5913350SHisping Lin { 604d5913350SHisping Lin TEEC_Result TeecResult; 605d5913350SHisping Lin TEEC_Context TeecContext; 606d5913350SHisping Lin TEEC_Session TeecSession; 607d5913350SHisping Lin uint32_t ErrorOrigin; 608d5913350SHisping Lin 609d5913350SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 610d5913350SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 611d5913350SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 612d5913350SHisping Lin TEEC_Operation TeecOperation = {0}; 613d5913350SHisping Lin 614d5913350SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 615d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 616d5913350SHisping Lin return TeecResult; 617d5913350SHisping Lin 618d5913350SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 619d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 620d5913350SHisping Lin return TeecResult; 621d5913350SHisping Lin 622d5913350SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 623d5913350SHisping Lin &TeecSession, 624d5913350SHisping Lin TeecUuid, 625d5913350SHisping Lin TEEC_LOGIN_PUBLIC, 626d5913350SHisping Lin NULL, 627d5913350SHisping Lin NULL, 628d5913350SHisping Lin &ErrorOrigin); 629d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 630d5913350SHisping Lin return TeecResult; 631d5913350SHisping Lin 632d5913350SHisping Lin TeecOperation.params[0].value.a = byte_off; 633d5913350SHisping Lin 634d5913350SHisping Lin TEEC_SharedMemory SharedMem = {0}; 635d5913350SHisping Lin 636d5913350SHisping Lin SharedMem.size = byte_len; 637d5913350SHisping Lin SharedMem.flags = 0; 638d5913350SHisping Lin 639d5913350SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem); 640d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 641d5913350SHisping Lin goto exit; 642d5913350SHisping Lin 643d5913350SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem.buffer; 644d5913350SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem.size; 645d5913350SHisping Lin 646d5913350SHisping Lin memcpy(SharedMem.buffer, byte_buf, SharedMem.size); 647d5913350SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 648d5913350SHisping Lin TEEC_MEMREF_TEMP_INPUT, 649d5913350SHisping Lin TEEC_NONE, 650d5913350SHisping Lin TEEC_NONE); 651d5913350SHisping Lin 652d5913350SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 653d5913350SHisping Lin STORAGE_CMD_WRITE_OEM_NS_OTP, 654d5913350SHisping Lin &TeecOperation, 655d5913350SHisping Lin &ErrorOrigin); 656d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 657d5913350SHisping Lin goto exit; 658d5913350SHisping Lin 659d5913350SHisping Lin exit: 660d5913350SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem); 661d5913350SHisping Lin TEEC_CloseSession(&TeecSession); 662d5913350SHisping Lin TEEC_FinalizeContext(&TeecContext); 663d5913350SHisping Lin 664d5913350SHisping Lin return TeecResult; 665d5913350SHisping Lin } 666d5913350SHisping Lin 667d5913350SHisping Lin uint32_t trusty_read_oem_ns_otp(uint32_t byte_off, uint8_t *byte_buf, uint32_t byte_len) 668d5913350SHisping Lin { 669d5913350SHisping Lin TEEC_Result TeecResult; 670d5913350SHisping Lin TEEC_Context TeecContext; 671d5913350SHisping Lin TEEC_Session TeecSession; 672d5913350SHisping Lin uint32_t ErrorOrigin; 673d5913350SHisping Lin 674d5913350SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 675d5913350SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 676d5913350SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 677d5913350SHisping Lin TEEC_Operation TeecOperation = {0}; 678d5913350SHisping Lin 679d5913350SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 680d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 681d5913350SHisping Lin return TeecResult; 682d5913350SHisping Lin 683d5913350SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 684d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 685d5913350SHisping Lin return TeecResult; 686d5913350SHisping Lin 687d5913350SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 688d5913350SHisping Lin &TeecSession, 689d5913350SHisping Lin TeecUuid, 690d5913350SHisping Lin TEEC_LOGIN_PUBLIC, 691d5913350SHisping Lin NULL, 692d5913350SHisping Lin NULL, 693d5913350SHisping Lin &ErrorOrigin); 694d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 695d5913350SHisping Lin return TeecResult; 696d5913350SHisping Lin 697d5913350SHisping Lin TeecOperation.params[0].value.a = byte_off; 698d5913350SHisping Lin 699d5913350SHisping Lin TEEC_SharedMemory SharedMem = {0}; 700d5913350SHisping Lin 701d5913350SHisping Lin SharedMem.size = byte_len; 702d5913350SHisping Lin SharedMem.flags = 0; 703d5913350SHisping Lin 704d5913350SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem); 705d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 706d5913350SHisping Lin goto exit; 707d5913350SHisping Lin 708d5913350SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem.buffer; 709d5913350SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem.size; 710d5913350SHisping Lin 711d5913350SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 712d5913350SHisping Lin TEEC_MEMREF_TEMP_OUTPUT, 713d5913350SHisping Lin TEEC_NONE, 714d5913350SHisping Lin TEEC_NONE); 715d5913350SHisping Lin 716d5913350SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 717d5913350SHisping Lin STORAGE_CMD_READ_OEM_NS_OTP, 718d5913350SHisping Lin &TeecOperation, 719d5913350SHisping Lin &ErrorOrigin); 720d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 721d5913350SHisping Lin goto exit; 722d5913350SHisping Lin 723d5913350SHisping Lin memcpy(byte_buf, SharedMem.buffer, SharedMem.size); 724d5913350SHisping Lin 725d5913350SHisping Lin exit: 726d5913350SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem); 727d5913350SHisping Lin TEEC_CloseSession(&TeecSession); 728d5913350SHisping Lin TEEC_FinalizeContext(&TeecContext); 729d5913350SHisping Lin 730d5913350SHisping Lin return TeecResult; 731d5913350SHisping Lin } 732d5913350SHisping Lin 733bb1ba6acSHisping Lin uint32_t trusty_write_oem_hr_otp(enum RK_OEM_HR_OTP_KEYID key_id, 734bb1ba6acSHisping Lin uint8_t *byte_buf, uint32_t byte_len) 735bb1ba6acSHisping Lin { 736bb1ba6acSHisping Lin TEEC_Result TeecResult; 737bb1ba6acSHisping Lin TEEC_Context TeecContext; 738bb1ba6acSHisping Lin TEEC_Session TeecSession; 739bb1ba6acSHisping Lin uint32_t ErrorOrigin; 740bb1ba6acSHisping Lin 741bb1ba6acSHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 742bb1ba6acSHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 743bb1ba6acSHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 744bb1ba6acSHisping Lin TEEC_Operation TeecOperation = {0}; 745bb1ba6acSHisping Lin 746bb1ba6acSHisping Lin TeecResult = OpteeClientApiLibInitialize(); 747bb1ba6acSHisping Lin if (TeecResult != TEEC_SUCCESS) 748bb1ba6acSHisping Lin return TeecResult; 749bb1ba6acSHisping Lin 750bb1ba6acSHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 751bb1ba6acSHisping Lin if (TeecResult != TEEC_SUCCESS) 752bb1ba6acSHisping Lin return TeecResult; 753bb1ba6acSHisping Lin 754bb1ba6acSHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 755bb1ba6acSHisping Lin &TeecSession, 756bb1ba6acSHisping Lin TeecUuid, 757bb1ba6acSHisping Lin TEEC_LOGIN_PUBLIC, 758bb1ba6acSHisping Lin NULL, 759bb1ba6acSHisping Lin NULL, 760bb1ba6acSHisping Lin &ErrorOrigin); 761bb1ba6acSHisping Lin if (TeecResult != TEEC_SUCCESS) 762bb1ba6acSHisping Lin return TeecResult; 763bb1ba6acSHisping Lin 764bb1ba6acSHisping Lin TeecOperation.params[0].value.a = key_id; 765bb1ba6acSHisping Lin 766bb1ba6acSHisping Lin TEEC_SharedMemory SharedMem = {0}; 767bb1ba6acSHisping Lin 768bb1ba6acSHisping Lin SharedMem.size = byte_len; 769bb1ba6acSHisping Lin SharedMem.flags = 0; 770bb1ba6acSHisping Lin 771bb1ba6acSHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem); 772bb1ba6acSHisping Lin if (TeecResult != TEEC_SUCCESS) 773bb1ba6acSHisping Lin goto exit; 774bb1ba6acSHisping Lin 775bb1ba6acSHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem.buffer; 776bb1ba6acSHisping Lin TeecOperation.params[1].tmpref.size = SharedMem.size; 777bb1ba6acSHisping Lin 778bb1ba6acSHisping Lin memcpy(SharedMem.buffer, byte_buf, SharedMem.size); 779bb1ba6acSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 780bb1ba6acSHisping Lin TEEC_MEMREF_TEMP_INPUT, 781bb1ba6acSHisping Lin TEEC_NONE, 782bb1ba6acSHisping Lin TEEC_NONE); 783bb1ba6acSHisping Lin 784bb1ba6acSHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 785bb1ba6acSHisping Lin STORAGE_CMD_WRITE_OEM_HR_OTP, 786bb1ba6acSHisping Lin &TeecOperation, 787bb1ba6acSHisping Lin &ErrorOrigin); 788bb1ba6acSHisping Lin if (TeecResult != TEEC_SUCCESS) 789bb1ba6acSHisping Lin goto exit; 790bb1ba6acSHisping Lin 791bb1ba6acSHisping Lin exit: 792bb1ba6acSHisping Lin TEEC_ReleaseSharedMemory(&SharedMem); 793bb1ba6acSHisping Lin TEEC_CloseSession(&TeecSession); 794bb1ba6acSHisping Lin TEEC_FinalizeContext(&TeecContext); 795bb1ba6acSHisping Lin 796bb1ba6acSHisping Lin return TeecResult; 797bb1ba6acSHisping Lin } 798bb1ba6acSHisping Lin 799a405238aSHisping Lin uint32_t trusty_set_oem_hr_otp_read_lock(enum RK_OEM_HR_OTP_KEYID key_id) 800a405238aSHisping Lin { 801a405238aSHisping Lin TEEC_Result TeecResult; 802a405238aSHisping Lin TEEC_Context TeecContext; 803a405238aSHisping Lin TEEC_Session TeecSession; 804a405238aSHisping Lin uint32_t ErrorOrigin; 805a405238aSHisping Lin 806a405238aSHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 807a405238aSHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 808a405238aSHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 809a405238aSHisping Lin TEEC_Operation TeecOperation = {0}; 810a405238aSHisping Lin 811a405238aSHisping Lin TeecResult = OpteeClientApiLibInitialize(); 812a405238aSHisping Lin if (TeecResult != TEEC_SUCCESS) 813a405238aSHisping Lin return TeecResult; 814a405238aSHisping Lin 815a405238aSHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 816a405238aSHisping Lin if (TeecResult != TEEC_SUCCESS) 817a405238aSHisping Lin return TeecResult; 818a405238aSHisping Lin 819a405238aSHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 820a405238aSHisping Lin &TeecSession, 821a405238aSHisping Lin TeecUuid, 822a405238aSHisping Lin TEEC_LOGIN_PUBLIC, 823a405238aSHisping Lin NULL, 824a405238aSHisping Lin NULL, 825a405238aSHisping Lin &ErrorOrigin); 826a405238aSHisping Lin if (TeecResult != TEEC_SUCCESS) 827a405238aSHisping Lin return TeecResult; 828a405238aSHisping Lin 829a405238aSHisping Lin TeecOperation.params[0].value.a = key_id; 830a405238aSHisping Lin 831a405238aSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 832a405238aSHisping Lin TEEC_NONE, 833a405238aSHisping Lin TEEC_NONE, 834a405238aSHisping Lin TEEC_NONE); 835a405238aSHisping Lin 836a405238aSHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 837a405238aSHisping Lin STORAGE_CMD_SET_OEM_HR_OTP_READ_LOCK, 838a405238aSHisping Lin &TeecOperation, 839a405238aSHisping Lin &ErrorOrigin); 840a405238aSHisping Lin if (TeecResult != TEEC_SUCCESS) 841a405238aSHisping Lin goto exit; 842a405238aSHisping Lin 843a405238aSHisping Lin exit: 844a405238aSHisping Lin TEEC_CloseSession(&TeecSession); 845a405238aSHisping Lin TEEC_FinalizeContext(&TeecContext); 846a405238aSHisping Lin 847a405238aSHisping Lin return TeecResult; 848a405238aSHisping Lin } 849a405238aSHisping Lin 8504aa61755SAndy Ye uint32_t trusty_attest_dh(uint8_t *dh, uint32_t *dh_size) 8514aa61755SAndy Ye { 8524aa61755SAndy Ye TEEC_Result TeecResult; 8534aa61755SAndy Ye TEEC_Context TeecContext; 8544aa61755SAndy Ye TEEC_Session TeecSession; 8554aa61755SAndy Ye uint32_t ErrorOrigin; 8564aa61755SAndy Ye TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6, 8574aa61755SAndy Ye { 0xa8, 0x69, 0x9c, 0xe6, 8584aa61755SAndy Ye 0x88, 0x6c, 0x5d, 0x5d 8594aa61755SAndy Ye } 8604aa61755SAndy Ye }; 8614aa61755SAndy Ye TEEC_UUID *TeecUuid = &tempuuid; 8624aa61755SAndy Ye TEEC_Operation TeecOperation = {0}; 8633251364cSHisping Lin struct blk_desc *dev_desc; 8643251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 8656651d4c0SJason Zhu if (!dev_desc) { 8666651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 8676651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 8686651d4c0SJason Zhu } 8694aa61755SAndy Ye 870f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 871f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 872f4e1db95SHisping Lin return TeecResult; 8734aa61755SAndy Ye 8744aa61755SAndy Ye TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 875f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 876f4e1db95SHisping Lin return TeecResult; 8774aa61755SAndy Ye 8783251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 8793251364cSHisping Lin TEEC_NONE, 8803251364cSHisping Lin TEEC_NONE, 8813251364cSHisping Lin TEEC_NONE); 8823251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 883b9a7e756SHisping Lin if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0) 884b9a7e756SHisping Lin TeecOperation.params[0].value.a = 1; 885b9a7e756SHisping Lin else 886b9a7e756SHisping Lin TeecOperation.params[0].value.a = 0; 887b9a7e756SHisping Lin 8883251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 8893251364cSHisping Lin TeecOperation.params[0].value.a = 0; 8903251364cSHisping Lin #endif 8913251364cSHisping Lin 8924aa61755SAndy Ye TeecResult = TEEC_OpenSession(&TeecContext, 8934aa61755SAndy Ye &TeecSession, 8944aa61755SAndy Ye TeecUuid, 8954aa61755SAndy Ye TEEC_LOGIN_PUBLIC, 8964aa61755SAndy Ye NULL, 8973251364cSHisping Lin &TeecOperation, 8984aa61755SAndy Ye &ErrorOrigin); 899f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 900f4e1db95SHisping Lin return TeecResult; 9014aa61755SAndy Ye 9024aa61755SAndy Ye TEEC_SharedMemory SharedMem0 = {0}; 9034aa61755SAndy Ye 9044aa61755SAndy Ye SharedMem0.size = *dh_size; 9054aa61755SAndy Ye SharedMem0.flags = 0; 9064aa61755SAndy Ye 9074aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 908f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 909f4e1db95SHisping Lin goto exit; 9104aa61755SAndy Ye 9114aa61755SAndy Ye TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 9124aa61755SAndy Ye TeecOperation.params[0].tmpref.size = SharedMem0.size; 9134aa61755SAndy Ye 9144aa61755SAndy Ye TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, 9154aa61755SAndy Ye TEEC_NONE, 9164aa61755SAndy Ye TEEC_NONE, 9174aa61755SAndy Ye TEEC_NONE); 9184aa61755SAndy Ye 9194aa61755SAndy Ye TeecResult = TEEC_InvokeCommand(&TeecSession, 9204aa61755SAndy Ye 143, 9214aa61755SAndy Ye &TeecOperation, 9224aa61755SAndy Ye &ErrorOrigin); 923f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 924f4e1db95SHisping Lin goto exit; 9254aa61755SAndy Ye 9264aa61755SAndy Ye *dh_size = TeecOperation.params[0].tmpref.size; 9274aa61755SAndy Ye memcpy(dh, SharedMem0.buffer, SharedMem0.size); 928f4e1db95SHisping Lin exit: 9294aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem0); 9304aa61755SAndy Ye TEEC_CloseSession(&TeecSession); 931f4e1db95SHisping Lin TEEC_FinalizeContext(&TeecContext); 9324aa61755SAndy Ye 9334aa61755SAndy Ye return TeecResult; 9344aa61755SAndy Ye } 9354aa61755SAndy Ye 9364aa61755SAndy Ye uint32_t trusty_attest_uuid(uint8_t *uuid, uint32_t *uuid_size) 9374aa61755SAndy Ye { 9384aa61755SAndy Ye TEEC_Result TeecResult; 9394aa61755SAndy Ye TEEC_Context TeecContext; 9404aa61755SAndy Ye TEEC_Session TeecSession; 9414aa61755SAndy Ye uint32_t ErrorOrigin; 9424aa61755SAndy Ye TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6, 9434aa61755SAndy Ye { 0xa8, 0x69, 0x9c, 0xe6, 9444aa61755SAndy Ye 0x88, 0x6c, 0x5d, 0x5d 9454aa61755SAndy Ye } 9464aa61755SAndy Ye }; 9474aa61755SAndy Ye TEEC_UUID *TeecUuid = &tempuuid; 9484aa61755SAndy Ye TEEC_Operation TeecOperation = {0}; 9493251364cSHisping Lin struct blk_desc *dev_desc; 9503251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 9516651d4c0SJason Zhu if (!dev_desc) { 9526651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 9536651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 9546651d4c0SJason Zhu } 9554aa61755SAndy Ye 956f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 957f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 958f4e1db95SHisping Lin return TeecResult; 9594aa61755SAndy Ye 9604aa61755SAndy Ye TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 961f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 962f4e1db95SHisping Lin return TeecResult; 9634aa61755SAndy Ye 9643251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 9653251364cSHisping Lin TEEC_NONE, 9663251364cSHisping Lin TEEC_NONE, 9673251364cSHisping Lin TEEC_NONE); 9683251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 969b9a7e756SHisping Lin if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0) 970b9a7e756SHisping Lin TeecOperation.params[0].value.a = 1; 971b9a7e756SHisping Lin else 972b9a7e756SHisping Lin TeecOperation.params[0].value.a = 0; 973b9a7e756SHisping Lin 9743251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 9753251364cSHisping Lin TeecOperation.params[0].value.a = 0; 9763251364cSHisping Lin #endif 9773251364cSHisping Lin 9784aa61755SAndy Ye TeecResult = TEEC_OpenSession(&TeecContext, 9794aa61755SAndy Ye &TeecSession, 9804aa61755SAndy Ye TeecUuid, 9814aa61755SAndy Ye TEEC_LOGIN_PUBLIC, 9824aa61755SAndy Ye NULL, 9833251364cSHisping Lin &TeecOperation, 9844aa61755SAndy Ye &ErrorOrigin); 985f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 986f4e1db95SHisping Lin return TeecResult; 9874aa61755SAndy Ye 9884aa61755SAndy Ye TEEC_SharedMemory SharedMem0 = {0}; 9894aa61755SAndy Ye 9904aa61755SAndy Ye SharedMem0.size = *uuid_size; 9914aa61755SAndy Ye SharedMem0.flags = 0; 9924aa61755SAndy Ye 9934aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 994f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 995f4e1db95SHisping Lin goto exit; 9964aa61755SAndy Ye 9974aa61755SAndy Ye TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 9984aa61755SAndy Ye TeecOperation.params[0].tmpref.size = SharedMem0.size; 9994aa61755SAndy Ye 10004aa61755SAndy Ye TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, 10014aa61755SAndy Ye TEEC_NONE, 10024aa61755SAndy Ye TEEC_NONE, 10034aa61755SAndy Ye TEEC_NONE); 10044aa61755SAndy Ye 10054aa61755SAndy Ye TeecResult = TEEC_InvokeCommand(&TeecSession, 10064aa61755SAndy Ye 144, 10074aa61755SAndy Ye &TeecOperation, 10084aa61755SAndy Ye &ErrorOrigin); 1009f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1010f4e1db95SHisping Lin goto exit; 10114aa61755SAndy Ye 10124aa61755SAndy Ye *uuid_size = TeecOperation.params[0].tmpref.size; 10134aa61755SAndy Ye memcpy(uuid, SharedMem0.buffer, SharedMem0.size); 1014f4e1db95SHisping Lin exit: 10154aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem0); 10164aa61755SAndy Ye TEEC_CloseSession(&TeecSession); 1017f4e1db95SHisping Lin TEEC_FinalizeContext(&TeecContext); 10184aa61755SAndy Ye 10194aa61755SAndy Ye return TeecResult; 10204aa61755SAndy Ye } 10214aa61755SAndy Ye 10224aa61755SAndy Ye uint32_t trusty_attest_get_ca(uint8_t *operation_start, 10234aa61755SAndy Ye uint32_t *operation_size, 10244aa61755SAndy Ye uint8_t *out, 10254aa61755SAndy Ye uint32_t *out_len) 10264aa61755SAndy Ye { 10274aa61755SAndy Ye TEEC_Result TeecResult; 10284aa61755SAndy Ye TEEC_Context TeecContext; 10294aa61755SAndy Ye TEEC_Session TeecSession; 10304aa61755SAndy Ye uint32_t ErrorOrigin; 10314aa61755SAndy Ye 10324aa61755SAndy Ye TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6, 10334aa61755SAndy Ye { 0xa8, 0x69, 0x9c, 0xe6, 10344aa61755SAndy Ye 0x88, 0x6c, 0x5d, 0x5d 10354aa61755SAndy Ye } 10364aa61755SAndy Ye }; 10374aa61755SAndy Ye 10384aa61755SAndy Ye TEEC_UUID *TeecUuid = &tempuuid; 10394aa61755SAndy Ye TEEC_Operation TeecOperation = {0}; 10403251364cSHisping Lin struct blk_desc *dev_desc; 10413251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 10426651d4c0SJason Zhu if (!dev_desc) { 10436651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 10446651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 10456651d4c0SJason Zhu } 10464aa61755SAndy Ye 1047f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 1048f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1049f4e1db95SHisping Lin return TeecResult; 10504aa61755SAndy Ye 10514aa61755SAndy Ye TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1052f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1053f4e1db95SHisping Lin return TeecResult; 10544aa61755SAndy Ye 10553251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 10563251364cSHisping Lin TEEC_NONE, 10573251364cSHisping Lin TEEC_NONE, 10583251364cSHisping Lin TEEC_NONE); 10593251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 1060b9a7e756SHisping Lin if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0) 1061b9a7e756SHisping Lin TeecOperation.params[0].value.a = 1; 1062b9a7e756SHisping Lin else 1063b9a7e756SHisping Lin TeecOperation.params[0].value.a = 0; 1064b9a7e756SHisping Lin 10653251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 10663251364cSHisping Lin TeecOperation.params[0].value.a = 0; 10673251364cSHisping Lin #endif 10683251364cSHisping Lin 10694aa61755SAndy Ye TeecResult = TEEC_OpenSession(&TeecContext, 10704aa61755SAndy Ye &TeecSession, 10714aa61755SAndy Ye TeecUuid, 10724aa61755SAndy Ye TEEC_LOGIN_PUBLIC, 10734aa61755SAndy Ye NULL, 10743251364cSHisping Lin &TeecOperation, 10754aa61755SAndy Ye &ErrorOrigin); 1076f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1077f4e1db95SHisping Lin return TeecResult; 10784aa61755SAndy Ye 10794aa61755SAndy Ye TEEC_SharedMemory SharedMem0 = {0}; 10804aa61755SAndy Ye 10814aa61755SAndy Ye SharedMem0.size = *operation_size; 10824aa61755SAndy Ye SharedMem0.flags = 0; 10834aa61755SAndy Ye 10844aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 1085f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1086f4e1db95SHisping Lin goto exit; 10874aa61755SAndy Ye 10884aa61755SAndy Ye memcpy(SharedMem0.buffer, operation_start, SharedMem0.size); 10894aa61755SAndy Ye 10904aa61755SAndy Ye TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 10914aa61755SAndy Ye TeecOperation.params[0].tmpref.size = SharedMem0.size; 10924aa61755SAndy Ye 10934aa61755SAndy Ye TEEC_SharedMemory SharedMem1 = {0}; 10944aa61755SAndy Ye 10954aa61755SAndy Ye SharedMem1.size = *out_len; 10964aa61755SAndy Ye SharedMem1.flags = 0; 10974aa61755SAndy Ye 10984aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 1099f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1100f4e1db95SHisping Lin goto exit; 11014aa61755SAndy Ye 11024aa61755SAndy Ye TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 11034aa61755SAndy Ye TeecOperation.params[1].tmpref.size = SharedMem1.size; 11044aa61755SAndy Ye 11054aa61755SAndy Ye TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, 11064aa61755SAndy Ye TEEC_MEMREF_TEMP_INOUT, 11074aa61755SAndy Ye TEEC_NONE, 11084aa61755SAndy Ye TEEC_NONE); 11094aa61755SAndy Ye 11104aa61755SAndy Ye TeecResult = TEEC_InvokeCommand(&TeecSession, 11114aa61755SAndy Ye 145, 11124aa61755SAndy Ye &TeecOperation, 11134aa61755SAndy Ye &ErrorOrigin); 1114f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1115f4e1db95SHisping Lin goto exit; 11164aa61755SAndy Ye 11174aa61755SAndy Ye *out_len = TeecOperation.params[1].tmpref.size; 11184aa61755SAndy Ye memcpy(out, SharedMem1.buffer, SharedMem1.size); 1119f4e1db95SHisping Lin exit: 11204aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem0); 11214aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem1); 1122f4e1db95SHisping Lin TEEC_CloseSession(&TeecSession); 1123f4e1db95SHisping Lin TEEC_FinalizeContext(&TeecContext); 11244aa61755SAndy Ye 11254aa61755SAndy Ye return TeecResult; 11264aa61755SAndy Ye } 11274aa61755SAndy Ye 11284aa61755SAndy Ye uint32_t trusty_attest_set_ca(uint8_t *ca_response, uint32_t *ca_response_size) 11294aa61755SAndy Ye { 11304aa61755SAndy Ye TEEC_Result TeecResult; 11314aa61755SAndy Ye TEEC_Context TeecContext; 11324aa61755SAndy Ye TEEC_Session TeecSession; 11334aa61755SAndy Ye uint32_t ErrorOrigin; 11344aa61755SAndy Ye TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6, 11354aa61755SAndy Ye { 0xa8, 0x69, 0x9c, 0xe6, 11364aa61755SAndy Ye 0x88, 0x6c, 0x5d, 0x5d 11374aa61755SAndy Ye } 11384aa61755SAndy Ye }; 11394aa61755SAndy Ye TEEC_UUID *TeecUuid = &tempuuid; 11404aa61755SAndy Ye TEEC_Operation TeecOperation = {0}; 11413251364cSHisping Lin struct blk_desc *dev_desc; 11423251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 11436651d4c0SJason Zhu if (!dev_desc) { 11446651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 11456651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 11466651d4c0SJason Zhu } 1147f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 1148f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1149f4e1db95SHisping Lin return TeecResult; 11504aa61755SAndy Ye 11514aa61755SAndy Ye TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1152f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1153f4e1db95SHisping Lin return TeecResult; 11544aa61755SAndy Ye 11553251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 11563251364cSHisping Lin TEEC_NONE, 11573251364cSHisping Lin TEEC_NONE, 11583251364cSHisping Lin TEEC_NONE); 11593251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 1160b9a7e756SHisping Lin if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0) 1161b9a7e756SHisping Lin TeecOperation.params[0].value.a = 1; 1162b9a7e756SHisping Lin else 1163b9a7e756SHisping Lin TeecOperation.params[0].value.a = 0; 1164b9a7e756SHisping Lin 11653251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 11663251364cSHisping Lin TeecOperation.params[0].value.a = 0; 11673251364cSHisping Lin #endif 11683251364cSHisping Lin 11694aa61755SAndy Ye TeecResult = TEEC_OpenSession(&TeecContext, 11704aa61755SAndy Ye &TeecSession, 11714aa61755SAndy Ye TeecUuid, 11724aa61755SAndy Ye TEEC_LOGIN_PUBLIC, 11734aa61755SAndy Ye NULL, 11743251364cSHisping Lin &TeecOperation, 11754aa61755SAndy Ye &ErrorOrigin); 1176f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1177f4e1db95SHisping Lin return TeecResult; 11784aa61755SAndy Ye 11794aa61755SAndy Ye TEEC_SharedMemory SharedMem0 = {0}; 11804aa61755SAndy Ye 11814aa61755SAndy Ye SharedMem0.size = *ca_response_size; 11824aa61755SAndy Ye SharedMem0.flags = 0; 11834aa61755SAndy Ye 11844aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 1185f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1186f4e1db95SHisping Lin goto exit; 11874aa61755SAndy Ye 11884aa61755SAndy Ye memcpy(SharedMem0.buffer, ca_response, SharedMem0.size); 11894aa61755SAndy Ye 11904aa61755SAndy Ye TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 11914aa61755SAndy Ye TeecOperation.params[0].tmpref.size = SharedMem0.size; 11924aa61755SAndy Ye 11934aa61755SAndy Ye TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, 11944aa61755SAndy Ye TEEC_NONE, 11954aa61755SAndy Ye TEEC_NONE, 11964aa61755SAndy Ye TEEC_NONE); 11974aa61755SAndy Ye 11984aa61755SAndy Ye TeecResult = TEEC_InvokeCommand(&TeecSession, 11994aa61755SAndy Ye 146, 12004aa61755SAndy Ye &TeecOperation, 12014aa61755SAndy Ye &ErrorOrigin); 1202f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1203f4e1db95SHisping Lin goto exit; 1204f4e1db95SHisping Lin exit: 12054aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem0); 12064aa61755SAndy Ye TEEC_CloseSession(&TeecSession); 1207f4e1db95SHisping Lin TEEC_FinalizeContext(&TeecContext); 12084aa61755SAndy Ye 12094aa61755SAndy Ye return TeecResult; 12104aa61755SAndy Ye } 1211