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> 9*bb1ba6acSHisping 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 29*bb1ba6acSHisping Lin #define STORAGE_CMD_WRITE_OEM_HR_OTP 14 30ae8ec5e1SHisping Lin 31ae8ec5e1SHisping Lin static uint8_t b2hs_add_base(uint8_t in) 32ae8ec5e1SHisping Lin { 33ae8ec5e1SHisping Lin if (in > 9) 34ae8ec5e1SHisping Lin return in + 55; 35ae8ec5e1SHisping Lin else 36ae8ec5e1SHisping Lin return in + 48; 37ae8ec5e1SHisping Lin } 38ae8ec5e1SHisping Lin 39c7de5349SHisping Lin static uint32_t b2hs(uint8_t *b, uint8_t *hs, uint32_t blen, uint32_t hslen) 40ae8ec5e1SHisping Lin { 41ae8ec5e1SHisping Lin uint32_t i = 0; 42ae8ec5e1SHisping Lin 43ae8ec5e1SHisping Lin if (blen * 2 + 1 > hslen) 44ae8ec5e1SHisping Lin return 0; 45ae8ec5e1SHisping Lin 46ae8ec5e1SHisping Lin for (; i < blen; i++) { 47ae8ec5e1SHisping Lin hs[i * 2 + 1] = b2hs_add_base(b[i] & 0xf); 48ae8ec5e1SHisping Lin hs[i * 2] = b2hs_add_base(b[i] >> 4); 49ae8ec5e1SHisping Lin } 50ae8ec5e1SHisping Lin hs[blen * 2] = 0; 51ae8ec5e1SHisping Lin 52ae8ec5e1SHisping Lin return blen * 2; 53ae8ec5e1SHisping Lin } 54ae8ec5e1SHisping Lin 55c7de5349SHisping Lin static uint32_t trusty_base_write_security_data(char *filename, 56c7de5349SHisping Lin uint32_t filename_size, 57c7de5349SHisping Lin uint8_t *data, 58c7de5349SHisping Lin uint32_t data_size) 59ae8ec5e1SHisping Lin { 60ae8ec5e1SHisping Lin TEEC_Result TeecResult; 61ae8ec5e1SHisping Lin TEEC_Context TeecContext; 62ae8ec5e1SHisping Lin TEEC_Session TeecSession; 63ae8ec5e1SHisping Lin uint32_t ErrorOrigin; 64ae8ec5e1SHisping Lin TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 65ae8ec5e1SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 66ae8ec5e1SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 67ae8ec5e1SHisping Lin TEEC_Operation TeecOperation = {0}; 683251364cSHisping Lin struct blk_desc *dev_desc; 693251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 706651d4c0SJason Zhu if (!dev_desc) { 716651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 726651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 736651d4c0SJason Zhu } 743251364cSHisping Lin 75f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 76f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 77f4e1db95SHisping Lin return TeecResult; 78ae8ec5e1SHisping Lin 79ae8ec5e1SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 80f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 81f4e1db95SHisping Lin return TeecResult; 82ae8ec5e1SHisping Lin 833251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 843251364cSHisping Lin TEEC_NONE, 853251364cSHisping Lin TEEC_NONE, 863251364cSHisping Lin TEEC_NONE); 873251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 88b9a7e756SHisping Lin if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0) 89b9a7e756SHisping Lin TeecOperation.params[0].value.a = 1; 90b9a7e756SHisping Lin else 91b9a7e756SHisping Lin TeecOperation.params[0].value.a = 0; 923251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 933251364cSHisping Lin TeecOperation.params[0].value.a = 0; 943251364cSHisping Lin #endif 953251364cSHisping Lin 96ae8ec5e1SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 97ae8ec5e1SHisping Lin &TeecSession, 98ae8ec5e1SHisping Lin TeecUuid, 99ae8ec5e1SHisping Lin TEEC_LOGIN_PUBLIC, 100ae8ec5e1SHisping Lin NULL, 1013251364cSHisping Lin &TeecOperation, 102ae8ec5e1SHisping Lin &ErrorOrigin); 103f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 104f4e1db95SHisping Lin return TeecResult; 105ae8ec5e1SHisping Lin 106ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 107ae8ec5e1SHisping Lin 108c7de5349SHisping Lin SharedMem0.size = filename_size; 109ae8ec5e1SHisping Lin SharedMem0.flags = 0; 110ae8ec5e1SHisping Lin 111ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 112f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 113f4e1db95SHisping Lin goto exit; 114ae8ec5e1SHisping Lin 115c7de5349SHisping Lin memcpy(SharedMem0.buffer, filename, SharedMem0.size); 116ae8ec5e1SHisping Lin 117ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem1 = {0}; 118ae8ec5e1SHisping Lin 119c7de5349SHisping Lin SharedMem1.size = data_size; 120c7de5349SHisping Lin SharedMem1.flags = 0; 121c7de5349SHisping Lin 122c7de5349SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 123c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 124c7de5349SHisping Lin goto exit; 125c7de5349SHisping Lin 126c7de5349SHisping Lin memcpy(SharedMem1.buffer, data, SharedMem1.size); 127c7de5349SHisping Lin 128c7de5349SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 129c7de5349SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 130c7de5349SHisping Lin 131c7de5349SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 132c7de5349SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem1.size; 133c7de5349SHisping Lin 134c7de5349SHisping Lin 135c7de5349SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 136c7de5349SHisping Lin TEEC_MEMREF_TEMP_INOUT, 137c7de5349SHisping Lin TEEC_NONE, 138c7de5349SHisping Lin TEEC_NONE); 139c7de5349SHisping Lin 140c7de5349SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 141c7de5349SHisping Lin 1, 142c7de5349SHisping Lin &TeecOperation, 143c7de5349SHisping Lin &ErrorOrigin); 144c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 145c7de5349SHisping Lin goto exit; 146c7de5349SHisping Lin exit: 147c7de5349SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 148c7de5349SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem1); 149c7de5349SHisping Lin TEEC_CloseSession(&TeecSession); 150c7de5349SHisping Lin TEEC_FinalizeContext(&TeecContext); 151c7de5349SHisping Lin 152c7de5349SHisping Lin return TeecResult; 153c7de5349SHisping Lin } 154c7de5349SHisping Lin 155c7de5349SHisping Lin static uint32_t trusty_base_read_security_data(char *filename, 156c7de5349SHisping Lin uint32_t filename_size, 157c7de5349SHisping Lin uint8_t *data, 158c7de5349SHisping Lin uint32_t data_size) 159c7de5349SHisping Lin { 160c7de5349SHisping Lin TEEC_Result TeecResult; 161c7de5349SHisping Lin TEEC_Context TeecContext; 162c7de5349SHisping Lin TEEC_Session TeecSession; 163c7de5349SHisping Lin uint32_t ErrorOrigin; 164c7de5349SHisping Lin TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 165c7de5349SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 166c7de5349SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 167c7de5349SHisping Lin TEEC_Operation TeecOperation = {0}; 168c7de5349SHisping Lin 169c7de5349SHisping Lin struct blk_desc *dev_desc; 170c7de5349SHisping Lin dev_desc = rockchip_get_bootdev(); 171c7de5349SHisping Lin if (!dev_desc) { 172c7de5349SHisping Lin printf("%s: dev_desc is NULL!\n", __func__); 173c7de5349SHisping Lin return -TEEC_ERROR_GENERIC; 174c7de5349SHisping Lin } 175c7de5349SHisping Lin 176c7de5349SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 177c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 178c7de5349SHisping Lin return TeecResult; 179c7de5349SHisping Lin 180c7de5349SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 181c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 182c7de5349SHisping Lin return TeecResult; 183c7de5349SHisping Lin 184c7de5349SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 185c7de5349SHisping Lin TEEC_NONE, 186c7de5349SHisping Lin TEEC_NONE, 187c7de5349SHisping Lin TEEC_NONE); 188c7de5349SHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 189c7de5349SHisping Lin if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0) 190c7de5349SHisping Lin TeecOperation.params[0].value.a = 1; 191c7de5349SHisping Lin else 192c7de5349SHisping Lin TeecOperation.params[0].value.a = 0; 193c7de5349SHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 194c7de5349SHisping Lin TeecOperation.params[0].value.a = 0; 195c7de5349SHisping Lin #endif 196c7de5349SHisping Lin 197c7de5349SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 198c7de5349SHisping Lin &TeecSession, 199c7de5349SHisping Lin TeecUuid, 200c7de5349SHisping Lin TEEC_LOGIN_PUBLIC, 201c7de5349SHisping Lin NULL, 202c7de5349SHisping Lin &TeecOperation, 203c7de5349SHisping Lin &ErrorOrigin); 204c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 205c7de5349SHisping Lin return TeecResult; 206c7de5349SHisping Lin 207c7de5349SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 208c7de5349SHisping Lin 209c7de5349SHisping Lin SharedMem0.size = filename_size; 210c7de5349SHisping Lin SharedMem0.flags = 0; 211c7de5349SHisping Lin 212c7de5349SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 213c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 214c7de5349SHisping Lin goto exit; 215c7de5349SHisping Lin 216c7de5349SHisping Lin memcpy(SharedMem0.buffer, filename, SharedMem0.size); 217c7de5349SHisping Lin 218c7de5349SHisping Lin TEEC_SharedMemory SharedMem1 = {0}; 219c7de5349SHisping Lin 220c7de5349SHisping Lin SharedMem1.size = data_size; 221ae8ec5e1SHisping Lin SharedMem1.flags = 0; 222ae8ec5e1SHisping Lin 223ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 224f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 225f4e1db95SHisping Lin goto exit; 226ae8ec5e1SHisping Lin 227ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 228ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 229ae8ec5e1SHisping Lin 230ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 231ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem1.size; 232ae8ec5e1SHisping Lin 233ae8ec5e1SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 234ae8ec5e1SHisping Lin TEEC_MEMREF_TEMP_INOUT, 235ae8ec5e1SHisping Lin TEEC_NONE, 236ae8ec5e1SHisping Lin TEEC_NONE); 237ae8ec5e1SHisping Lin 238ae8ec5e1SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 239ae8ec5e1SHisping Lin 0, 240ae8ec5e1SHisping Lin &TeecOperation, 241ae8ec5e1SHisping Lin &ErrorOrigin); 24246b2a054SHisping Lin if (TeecResult == TEEC_SUCCESS) 243c7de5349SHisping Lin memcpy(data, SharedMem1.buffer, SharedMem1.size); 244f4e1db95SHisping Lin exit: 245ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 246ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem1); 247ae8ec5e1SHisping Lin TEEC_CloseSession(&TeecSession); 24846b2a054SHisping Lin TEEC_FinalizeContext(&TeecContext); 249ae8ec5e1SHisping Lin 250ae8ec5e1SHisping Lin return TeecResult; 251ae8ec5e1SHisping Lin } 252ae8ec5e1SHisping Lin 253c7de5349SHisping Lin static uint32_t trusty_base_end_security_data(void) 254c7de5349SHisping Lin { 255c7de5349SHisping Lin TEEC_Result TeecResult; 256c7de5349SHisping Lin TEEC_Context TeecContext; 257c7de5349SHisping Lin TEEC_Session TeecSession; 258c7de5349SHisping Lin uint32_t ErrorOrigin; 259c7de5349SHisping Lin TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 260c7de5349SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 261c7de5349SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 262c7de5349SHisping Lin TEEC_Operation TeecOperation = {0}; 263c7de5349SHisping Lin 264c7de5349SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 265c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 266c7de5349SHisping Lin return TeecResult; 267c7de5349SHisping Lin 268c7de5349SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 269c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 270c7de5349SHisping Lin return TeecResult; 271c7de5349SHisping Lin 272c7de5349SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 273c7de5349SHisping Lin &TeecSession, 274c7de5349SHisping Lin TeecUuid, 275c7de5349SHisping Lin TEEC_LOGIN_PUBLIC, 276c7de5349SHisping Lin NULL, 277c7de5349SHisping Lin NULL, 278c7de5349SHisping Lin &ErrorOrigin); 279c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 280c7de5349SHisping Lin return TeecResult; 281c7de5349SHisping Lin 282c7de5349SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE, 283c7de5349SHisping Lin TEEC_NONE, 284c7de5349SHisping Lin TEEC_NONE, 285c7de5349SHisping Lin TEEC_NONE); 286c7de5349SHisping Lin 287c7de5349SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 288c7de5349SHisping Lin 2, 289c7de5349SHisping Lin &TeecOperation, 290c7de5349SHisping Lin &ErrorOrigin); 291c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 292c7de5349SHisping Lin goto exit; 293c7de5349SHisping Lin exit: 294c7de5349SHisping Lin TEEC_CloseSession(&TeecSession); 295c7de5349SHisping Lin TEEC_FinalizeContext(&TeecContext); 296c7de5349SHisping Lin 297c7de5349SHisping Lin return TeecResult; 298c7de5349SHisping Lin } 299c7de5349SHisping Lin 300c7de5349SHisping Lin uint32_t trusty_read_rollback_index(uint32_t slot, uint64_t *value) 301c7de5349SHisping Lin { 302c7de5349SHisping Lin char hs[9]; 303c7de5349SHisping Lin 304c7de5349SHisping Lin b2hs((uint8_t *)&slot, (uint8_t *)hs, 4, 9); 305c7de5349SHisping Lin 306c7de5349SHisping Lin return trusty_base_read_security_data(hs, 8, (uint8_t *)value, 8); 307c7de5349SHisping Lin } 308c7de5349SHisping Lin 309ae8ec5e1SHisping Lin uint32_t trusty_write_rollback_index(uint32_t slot, uint64_t value) 310ae8ec5e1SHisping Lin { 311c7de5349SHisping Lin char hs[9]; 3123251364cSHisping Lin 313c7de5349SHisping Lin b2hs((uint8_t *)&slot, (uint8_t *)hs, 4, 9); 314ae8ec5e1SHisping Lin 315c7de5349SHisping Lin return trusty_base_write_security_data(hs, 8, (uint8_t *)&value, 8); 316ae8ec5e1SHisping Lin } 317ae8ec5e1SHisping Lin 318ae8ec5e1SHisping Lin uint32_t trusty_read_permanent_attributes(uint8_t *attributes, uint32_t size) 319ae8ec5e1SHisping Lin { 320c7de5349SHisping Lin return trusty_base_read_security_data("attributes", 321c7de5349SHisping Lin sizeof("attributes"), attributes, size); 322ae8ec5e1SHisping Lin } 323ae8ec5e1SHisping Lin 324ae8ec5e1SHisping Lin uint32_t trusty_write_permanent_attributes(uint8_t *attributes, uint32_t size) 325ae8ec5e1SHisping Lin { 326c7de5349SHisping Lin return trusty_base_write_security_data("attributes", 327c7de5349SHisping Lin sizeof("attributes"), attributes, size); 3286651d4c0SJason Zhu } 329ae8ec5e1SHisping Lin 330c7de5349SHisping Lin uint32_t trusty_read_permanent_attributes_flag(uint8_t *attributes) 331c7de5349SHisping Lin { 332c7de5349SHisping Lin return trusty_base_read_security_data("attributes_flag", 333c7de5349SHisping Lin sizeof("attributes_flag"), attributes, 1); 334c7de5349SHisping Lin } 335ae8ec5e1SHisping Lin 336c7de5349SHisping Lin uint32_t trusty_write_permanent_attributes_flag(uint8_t attributes) 337c7de5349SHisping Lin { 338c7de5349SHisping Lin return trusty_base_write_security_data("attributes_flag", 339c7de5349SHisping Lin sizeof("attributes_flag"), &attributes, 1); 340ae8ec5e1SHisping Lin } 341ae8ec5e1SHisping Lin 342564654ebSJason Zhu uint32_t trusty_read_permanent_attributes_cer(uint8_t *attributes, 343564654ebSJason Zhu uint32_t size) 344564654ebSJason Zhu { 345c7de5349SHisping Lin return trusty_base_read_security_data("rsacer", 346c7de5349SHisping Lin sizeof("rsacer"), attributes, size); 347564654ebSJason Zhu } 348564654ebSJason Zhu 349564654ebSJason Zhu uint32_t trusty_write_permanent_attributes_cer(uint8_t *attributes, 350564654ebSJason Zhu uint32_t size) 351564654ebSJason Zhu { 352c7de5349SHisping Lin return trusty_base_write_security_data("rsacer", 353c7de5349SHisping Lin sizeof("rsacer"), attributes, size); 354564654ebSJason Zhu } 355564654ebSJason Zhu 356ae8ec5e1SHisping Lin uint32_t trusty_read_lock_state(uint8_t *lock_state) 357ae8ec5e1SHisping Lin { 358c7de5349SHisping Lin return trusty_base_read_security_data("lock_state", 359c7de5349SHisping Lin sizeof("lock_state"), lock_state, 1); 360ae8ec5e1SHisping Lin } 361ae8ec5e1SHisping Lin 362ae8ec5e1SHisping Lin uint32_t trusty_write_lock_state(uint8_t lock_state) 363ae8ec5e1SHisping Lin { 364c7de5349SHisping Lin return trusty_base_write_security_data("lock_state", 365c7de5349SHisping Lin sizeof("lock_state"), &lock_state, 1); 366ae8ec5e1SHisping Lin } 367ae8ec5e1SHisping Lin 368ae8ec5e1SHisping Lin uint32_t trusty_read_flash_lock_state(uint8_t *flash_lock_state) 369ae8ec5e1SHisping Lin { 370c7de5349SHisping Lin return trusty_base_read_security_data("flash_lock_state", 371c7de5349SHisping Lin sizeof("flash_lock_state"), flash_lock_state, 1); 372c7de5349SHisping Lin } 373c7de5349SHisping Lin 374c7de5349SHisping Lin uint32_t trusty_write_flash_lock_state(uint8_t flash_lock_state) 375c7de5349SHisping Lin { 376c7de5349SHisping Lin return trusty_base_write_security_data("flash_lock_state", 377c7de5349SHisping Lin sizeof("flash_lock_state"), &flash_lock_state, 1); 378c7de5349SHisping Lin } 379c7de5349SHisping Lin 380c7de5349SHisping Lin static uint32_t trusty_base_end_efuse_or_otp(void) 381c7de5349SHisping Lin { 382ae8ec5e1SHisping Lin TEEC_Result TeecResult; 383ae8ec5e1SHisping Lin TEEC_Context TeecContext; 384ae8ec5e1SHisping Lin TEEC_Session TeecSession; 385ae8ec5e1SHisping Lin uint32_t ErrorOrigin; 386c7de5349SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 387c7de5349SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 388c7de5349SHisping Lin 389ae8ec5e1SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 390ae8ec5e1SHisping Lin TEEC_Operation TeecOperation = {0}; 391ae8ec5e1SHisping Lin 392f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 393f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 394f4e1db95SHisping Lin return TeecResult; 395ae8ec5e1SHisping Lin 396ae8ec5e1SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 397f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 398f4e1db95SHisping Lin return TeecResult; 399ae8ec5e1SHisping Lin 400ae8ec5e1SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 401ae8ec5e1SHisping Lin &TeecSession, 402ae8ec5e1SHisping Lin TeecUuid, 403ae8ec5e1SHisping Lin TEEC_LOGIN_PUBLIC, 404ae8ec5e1SHisping Lin NULL, 405c7de5349SHisping Lin NULL, 406ae8ec5e1SHisping Lin &ErrorOrigin); 407f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 408f4e1db95SHisping Lin return TeecResult; 409ae8ec5e1SHisping Lin 410c7de5349SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE, 411c7de5349SHisping Lin TEEC_NONE, 412ae8ec5e1SHisping Lin TEEC_NONE, 413ae8ec5e1SHisping Lin TEEC_NONE); 414ae8ec5e1SHisping Lin 415ae8ec5e1SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 416c7de5349SHisping Lin STORAGE_CMD_UBOOT_END_OTP, 417ae8ec5e1SHisping Lin &TeecOperation, 418ae8ec5e1SHisping Lin &ErrorOrigin); 419c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 420c7de5349SHisping Lin goto exit; 421f4e1db95SHisping Lin exit: 422ae8ec5e1SHisping Lin TEEC_CloseSession(&TeecSession); 42346b2a054SHisping Lin TEEC_FinalizeContext(&TeecContext); 424ae8ec5e1SHisping Lin 425ae8ec5e1SHisping Lin return TeecResult; 426ae8ec5e1SHisping Lin } 427ae8ec5e1SHisping Lin 428c7de5349SHisping Lin static uint32_t trusty_base_efuse_or_otp_operation(uint32_t cmd, 429c7de5349SHisping Lin uint8_t is_write, 430c7de5349SHisping Lin uint32_t *buf, 431c7de5349SHisping Lin uint32_t length) 432ae8ec5e1SHisping Lin { 433ae8ec5e1SHisping Lin TEEC_Result TeecResult; 434ae8ec5e1SHisping Lin TEEC_Context TeecContext; 435ae8ec5e1SHisping Lin TEEC_Session TeecSession; 436ae8ec5e1SHisping Lin uint32_t ErrorOrigin; 437c7de5349SHisping Lin 438c7de5349SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 439c7de5349SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 440ae8ec5e1SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 441ae8ec5e1SHisping Lin TEEC_Operation TeecOperation = {0}; 442ae8ec5e1SHisping Lin 443f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 444f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 445f4e1db95SHisping Lin return TeecResult; 446ae8ec5e1SHisping Lin 447ae8ec5e1SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 448f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 449f4e1db95SHisping Lin return TeecResult; 450ae8ec5e1SHisping Lin 451ae8ec5e1SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 452ae8ec5e1SHisping Lin &TeecSession, 453ae8ec5e1SHisping Lin TeecUuid, 454ae8ec5e1SHisping Lin TEEC_LOGIN_PUBLIC, 455ae8ec5e1SHisping Lin NULL, 456c7de5349SHisping Lin NULL, 457ae8ec5e1SHisping Lin &ErrorOrigin); 458f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 459f4e1db95SHisping Lin return TeecResult; 460ae8ec5e1SHisping Lin 461ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 462ae8ec5e1SHisping Lin 463c7de5349SHisping Lin SharedMem0.size = length * sizeof(uint32_t); 464ae8ec5e1SHisping Lin SharedMem0.flags = 0; 465ae8ec5e1SHisping Lin 466ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 467f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 468f4e1db95SHisping Lin goto exit; 469ae8ec5e1SHisping Lin 470ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 471ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 472ae8ec5e1SHisping Lin 473c7de5349SHisping Lin if (is_write) { 474c7de5349SHisping Lin memcpy(SharedMem0.buffer, buf, SharedMem0.size); 475ae8ec5e1SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 476c7de5349SHisping Lin TEEC_NONE, 477ae8ec5e1SHisping Lin TEEC_NONE, 478ae8ec5e1SHisping Lin TEEC_NONE); 479ae8ec5e1SHisping Lin 480c7de5349SHisping Lin } else { 481c7de5349SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT, 482c7de5349SHisping Lin TEEC_NONE, 483c7de5349SHisping Lin TEEC_NONE, 484c7de5349SHisping Lin TEEC_NONE); 485c7de5349SHisping Lin } 486c7de5349SHisping Lin 487ae8ec5e1SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 488c7de5349SHisping Lin cmd, 489ae8ec5e1SHisping Lin &TeecOperation, 490ae8ec5e1SHisping Lin &ErrorOrigin); 491f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 492f4e1db95SHisping Lin goto exit; 493c7de5349SHisping Lin 494c7de5349SHisping Lin if (!is_write) 495c7de5349SHisping Lin memcpy(buf, SharedMem0.buffer, SharedMem0.size); 496c7de5349SHisping Lin 497f4e1db95SHisping Lin exit: 498ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 499ae8ec5e1SHisping Lin TEEC_CloseSession(&TeecSession); 50046b2a054SHisping Lin TEEC_FinalizeContext(&TeecContext); 501ae8ec5e1SHisping Lin 502ae8ec5e1SHisping Lin return TeecResult; 503ae8ec5e1SHisping Lin } 504ae8ec5e1SHisping Lin 5056ef445a4SHisping Lin uint32_t trusty_read_attribute_hash(uint32_t *buf, uint32_t length) 5066ef445a4SHisping Lin { 507c7de5349SHisping Lin return trusty_base_efuse_or_otp_operation(STORAGE_CMD_READ_ATTRIBUTE_HASH, 508c7de5349SHisping Lin false, buf, length); 5096ef445a4SHisping Lin } 5106ef445a4SHisping Lin 5116ef445a4SHisping Lin uint32_t trusty_write_attribute_hash(uint32_t *buf, uint32_t length) 5126ef445a4SHisping Lin { 513c7de5349SHisping Lin return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_ATTRIBUTE_HASH, 514c7de5349SHisping Lin true, buf, length); 51516539616SHisping Lin } 51616539616SHisping Lin 51716539616SHisping Lin uint32_t trusty_notify_optee_uboot_end(void) 51816539616SHisping Lin { 51916539616SHisping Lin TEEC_Result res; 520c7de5349SHisping Lin 521c7de5349SHisping Lin res = trusty_base_end_security_data(); 522c7de5349SHisping Lin res |= trusty_base_end_efuse_or_otp(); 52316539616SHisping Lin return res; 52416539616SHisping Lin } 5252cd27853SHisping Lin 5262cd27853SHisping Lin uint32_t trusty_read_vbootkey_hash(uint32_t *buf, uint32_t length) 5272cd27853SHisping Lin { 528c7de5349SHisping Lin return trusty_base_efuse_or_otp_operation(STORAGE_CMD_READ_VBOOTKEY_HASH, 529c7de5349SHisping Lin false, buf, length); 5302cd27853SHisping Lin } 531c7de5349SHisping Lin 5322cd27853SHisping Lin uint32_t trusty_write_vbootkey_hash(uint32_t *buf, uint32_t length) 5332cd27853SHisping Lin { 534c7de5349SHisping Lin return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_VBOOTKEY_HASH, 535c7de5349SHisping Lin true, buf, length); 5362cd27853SHisping Lin } 537095e2a82SHisping Lin 538468df3b2SHisping Lin uint32_t trusty_read_vbootkey_enable_flag(uint8_t *flag) 539468df3b2SHisping Lin { 540468df3b2SHisping Lin uint32_t bootflag; 541c7de5349SHisping Lin TEEC_Result TeecResult; 542468df3b2SHisping Lin 543c7de5349SHisping Lin TeecResult = trusty_base_efuse_or_otp_operation(STORAGE_CMD_READ_ENABLE_FLAG, 544c7de5349SHisping Lin false, &bootflag, 1); 545468df3b2SHisping Lin 546468df3b2SHisping Lin if (TeecResult == TEEC_SUCCESS) { 5470202ee8aSHisping Lin #if defined(CONFIG_ROCKCHIP_RK3288) 5480202ee8aSHisping Lin if (bootflag == 0x00000001) 5490202ee8aSHisping Lin *flag = 1; 5500202ee8aSHisping Lin #else 551468df3b2SHisping Lin if (bootflag == 0x000000FF) 552468df3b2SHisping Lin *flag = 1; 5530202ee8aSHisping Lin #endif 554468df3b2SHisping Lin } 555095e2a82SHisping Lin return TeecResult; 556095e2a82SHisping Lin } 5574aa61755SAndy Ye 5581ef63c75SHisping Lin uint32_t trusty_write_ta_encryption_key(uint32_t *buf, uint32_t length) 5591ef63c75SHisping Lin { 5601ef63c75SHisping Lin return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_TA_ENCRYPTION_KEY, 5611ef63c75SHisping Lin true, buf, length); 5621ef63c75SHisping Lin } 5631ef63c75SHisping Lin 564fbf29bfbSHisping Lin uint32_t trusty_check_security_level_flag(uint8_t flag) 565fbf29bfbSHisping Lin { 566fbf29bfbSHisping Lin uint32_t levelflag; 567fbf29bfbSHisping Lin 568fbf29bfbSHisping Lin levelflag = flag; 569fbf29bfbSHisping Lin return trusty_base_efuse_or_otp_operation(STORAGE_CMD_CHECK_SECURITY_LEVEL_FLAG, 570fbf29bfbSHisping Lin true, &levelflag, 1); 571fbf29bfbSHisping Lin } 572fbf29bfbSHisping Lin 573f39d4289SHisping Lin uint32_t trusty_write_oem_huk(uint32_t *buf, uint32_t length) 574f39d4289SHisping Lin { 575f39d4289SHisping Lin return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_OEM_HUK, 576f39d4289SHisping Lin true, buf, length); 577f39d4289SHisping Lin } 578f39d4289SHisping Lin 5797504da74SHisping Lin void trusty_select_security_level(void) 5807504da74SHisping Lin { 5817504da74SHisping Lin #if (CONFIG_OPTEE_SECURITY_LEVEL > 0) 5827504da74SHisping Lin TEEC_Result TeecResult; 5837504da74SHisping Lin 5847504da74SHisping Lin TeecResult = trusty_check_security_level_flag(CONFIG_OPTEE_SECURITY_LEVEL); 5857504da74SHisping Lin if (TeecResult == TEE_ERROR_CANCEL) { 5867504da74SHisping Lin run_command("download", 0); 5877504da74SHisping Lin return; 5887504da74SHisping Lin } 5897504da74SHisping Lin 5907504da74SHisping Lin if (TeecResult == TEEC_SUCCESS) 5917504da74SHisping Lin debug("optee select security level success!"); 5927504da74SHisping Lin else 5937504da74SHisping Lin panic("optee select security level fail!"); 5947504da74SHisping Lin 5957504da74SHisping Lin return; 5967504da74SHisping Lin #endif 5977504da74SHisping Lin } 5987504da74SHisping Lin 599d5913350SHisping Lin uint32_t trusty_write_oem_ns_otp(uint32_t byte_off, uint8_t *byte_buf, uint32_t byte_len) 600d5913350SHisping Lin { 601d5913350SHisping Lin TEEC_Result TeecResult; 602d5913350SHisping Lin TEEC_Context TeecContext; 603d5913350SHisping Lin TEEC_Session TeecSession; 604d5913350SHisping Lin uint32_t ErrorOrigin; 605d5913350SHisping Lin 606d5913350SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 607d5913350SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 608d5913350SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 609d5913350SHisping Lin TEEC_Operation TeecOperation = {0}; 610d5913350SHisping Lin 611d5913350SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 612d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 613d5913350SHisping Lin return TeecResult; 614d5913350SHisping Lin 615d5913350SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 616d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 617d5913350SHisping Lin return TeecResult; 618d5913350SHisping Lin 619d5913350SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 620d5913350SHisping Lin &TeecSession, 621d5913350SHisping Lin TeecUuid, 622d5913350SHisping Lin TEEC_LOGIN_PUBLIC, 623d5913350SHisping Lin NULL, 624d5913350SHisping Lin NULL, 625d5913350SHisping Lin &ErrorOrigin); 626d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 627d5913350SHisping Lin return TeecResult; 628d5913350SHisping Lin 629d5913350SHisping Lin TeecOperation.params[0].value.a = byte_off; 630d5913350SHisping Lin 631d5913350SHisping Lin TEEC_SharedMemory SharedMem = {0}; 632d5913350SHisping Lin 633d5913350SHisping Lin SharedMem.size = byte_len; 634d5913350SHisping Lin SharedMem.flags = 0; 635d5913350SHisping Lin 636d5913350SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem); 637d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 638d5913350SHisping Lin goto exit; 639d5913350SHisping Lin 640d5913350SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem.buffer; 641d5913350SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem.size; 642d5913350SHisping Lin 643d5913350SHisping Lin memcpy(SharedMem.buffer, byte_buf, SharedMem.size); 644d5913350SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 645d5913350SHisping Lin TEEC_MEMREF_TEMP_INPUT, 646d5913350SHisping Lin TEEC_NONE, 647d5913350SHisping Lin TEEC_NONE); 648d5913350SHisping Lin 649d5913350SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 650d5913350SHisping Lin STORAGE_CMD_WRITE_OEM_NS_OTP, 651d5913350SHisping Lin &TeecOperation, 652d5913350SHisping Lin &ErrorOrigin); 653d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 654d5913350SHisping Lin goto exit; 655d5913350SHisping Lin 656d5913350SHisping Lin exit: 657d5913350SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem); 658d5913350SHisping Lin TEEC_CloseSession(&TeecSession); 659d5913350SHisping Lin TEEC_FinalizeContext(&TeecContext); 660d5913350SHisping Lin 661d5913350SHisping Lin return TeecResult; 662d5913350SHisping Lin } 663d5913350SHisping Lin 664d5913350SHisping Lin uint32_t trusty_read_oem_ns_otp(uint32_t byte_off, uint8_t *byte_buf, uint32_t byte_len) 665d5913350SHisping Lin { 666d5913350SHisping Lin TEEC_Result TeecResult; 667d5913350SHisping Lin TEEC_Context TeecContext; 668d5913350SHisping Lin TEEC_Session TeecSession; 669d5913350SHisping Lin uint32_t ErrorOrigin; 670d5913350SHisping Lin 671d5913350SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 672d5913350SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 673d5913350SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 674d5913350SHisping Lin TEEC_Operation TeecOperation = {0}; 675d5913350SHisping Lin 676d5913350SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 677d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 678d5913350SHisping Lin return TeecResult; 679d5913350SHisping Lin 680d5913350SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 681d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 682d5913350SHisping Lin return TeecResult; 683d5913350SHisping Lin 684d5913350SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 685d5913350SHisping Lin &TeecSession, 686d5913350SHisping Lin TeecUuid, 687d5913350SHisping Lin TEEC_LOGIN_PUBLIC, 688d5913350SHisping Lin NULL, 689d5913350SHisping Lin NULL, 690d5913350SHisping Lin &ErrorOrigin); 691d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 692d5913350SHisping Lin return TeecResult; 693d5913350SHisping Lin 694d5913350SHisping Lin TeecOperation.params[0].value.a = byte_off; 695d5913350SHisping Lin 696d5913350SHisping Lin TEEC_SharedMemory SharedMem = {0}; 697d5913350SHisping Lin 698d5913350SHisping Lin SharedMem.size = byte_len; 699d5913350SHisping Lin SharedMem.flags = 0; 700d5913350SHisping Lin 701d5913350SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem); 702d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 703d5913350SHisping Lin goto exit; 704d5913350SHisping Lin 705d5913350SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem.buffer; 706d5913350SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem.size; 707d5913350SHisping Lin 708d5913350SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 709d5913350SHisping Lin TEEC_MEMREF_TEMP_OUTPUT, 710d5913350SHisping Lin TEEC_NONE, 711d5913350SHisping Lin TEEC_NONE); 712d5913350SHisping Lin 713d5913350SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 714d5913350SHisping Lin STORAGE_CMD_READ_OEM_NS_OTP, 715d5913350SHisping Lin &TeecOperation, 716d5913350SHisping Lin &ErrorOrigin); 717d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 718d5913350SHisping Lin goto exit; 719d5913350SHisping Lin 720d5913350SHisping Lin memcpy(byte_buf, SharedMem.buffer, SharedMem.size); 721d5913350SHisping Lin 722d5913350SHisping Lin exit: 723d5913350SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem); 724d5913350SHisping Lin TEEC_CloseSession(&TeecSession); 725d5913350SHisping Lin TEEC_FinalizeContext(&TeecContext); 726d5913350SHisping Lin 727d5913350SHisping Lin return TeecResult; 728d5913350SHisping Lin } 729d5913350SHisping Lin 730*bb1ba6acSHisping Lin uint32_t trusty_write_oem_hr_otp(enum RK_OEM_HR_OTP_KEYID key_id, 731*bb1ba6acSHisping Lin uint8_t *byte_buf, uint32_t byte_len) 732*bb1ba6acSHisping Lin { 733*bb1ba6acSHisping Lin TEEC_Result TeecResult; 734*bb1ba6acSHisping Lin TEEC_Context TeecContext; 735*bb1ba6acSHisping Lin TEEC_Session TeecSession; 736*bb1ba6acSHisping Lin uint32_t ErrorOrigin; 737*bb1ba6acSHisping Lin 738*bb1ba6acSHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 739*bb1ba6acSHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 740*bb1ba6acSHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 741*bb1ba6acSHisping Lin TEEC_Operation TeecOperation = {0}; 742*bb1ba6acSHisping Lin 743*bb1ba6acSHisping Lin TeecResult = OpteeClientApiLibInitialize(); 744*bb1ba6acSHisping Lin if (TeecResult != TEEC_SUCCESS) 745*bb1ba6acSHisping Lin return TeecResult; 746*bb1ba6acSHisping Lin 747*bb1ba6acSHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 748*bb1ba6acSHisping Lin if (TeecResult != TEEC_SUCCESS) 749*bb1ba6acSHisping Lin return TeecResult; 750*bb1ba6acSHisping Lin 751*bb1ba6acSHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 752*bb1ba6acSHisping Lin &TeecSession, 753*bb1ba6acSHisping Lin TeecUuid, 754*bb1ba6acSHisping Lin TEEC_LOGIN_PUBLIC, 755*bb1ba6acSHisping Lin NULL, 756*bb1ba6acSHisping Lin NULL, 757*bb1ba6acSHisping Lin &ErrorOrigin); 758*bb1ba6acSHisping Lin if (TeecResult != TEEC_SUCCESS) 759*bb1ba6acSHisping Lin return TeecResult; 760*bb1ba6acSHisping Lin 761*bb1ba6acSHisping Lin TeecOperation.params[0].value.a = key_id; 762*bb1ba6acSHisping Lin 763*bb1ba6acSHisping Lin TEEC_SharedMemory SharedMem = {0}; 764*bb1ba6acSHisping Lin 765*bb1ba6acSHisping Lin SharedMem.size = byte_len; 766*bb1ba6acSHisping Lin SharedMem.flags = 0; 767*bb1ba6acSHisping Lin 768*bb1ba6acSHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem); 769*bb1ba6acSHisping Lin if (TeecResult != TEEC_SUCCESS) 770*bb1ba6acSHisping Lin goto exit; 771*bb1ba6acSHisping Lin 772*bb1ba6acSHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem.buffer; 773*bb1ba6acSHisping Lin TeecOperation.params[1].tmpref.size = SharedMem.size; 774*bb1ba6acSHisping Lin 775*bb1ba6acSHisping Lin memcpy(SharedMem.buffer, byte_buf, SharedMem.size); 776*bb1ba6acSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 777*bb1ba6acSHisping Lin TEEC_MEMREF_TEMP_INPUT, 778*bb1ba6acSHisping Lin TEEC_NONE, 779*bb1ba6acSHisping Lin TEEC_NONE); 780*bb1ba6acSHisping Lin 781*bb1ba6acSHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 782*bb1ba6acSHisping Lin STORAGE_CMD_WRITE_OEM_HR_OTP, 783*bb1ba6acSHisping Lin &TeecOperation, 784*bb1ba6acSHisping Lin &ErrorOrigin); 785*bb1ba6acSHisping Lin if (TeecResult != TEEC_SUCCESS) 786*bb1ba6acSHisping Lin goto exit; 787*bb1ba6acSHisping Lin 788*bb1ba6acSHisping Lin exit: 789*bb1ba6acSHisping Lin TEEC_ReleaseSharedMemory(&SharedMem); 790*bb1ba6acSHisping Lin TEEC_CloseSession(&TeecSession); 791*bb1ba6acSHisping Lin TEEC_FinalizeContext(&TeecContext); 792*bb1ba6acSHisping Lin 793*bb1ba6acSHisping Lin return TeecResult; 794*bb1ba6acSHisping Lin } 795*bb1ba6acSHisping Lin 7964aa61755SAndy Ye uint32_t trusty_attest_dh(uint8_t *dh, uint32_t *dh_size) 7974aa61755SAndy Ye { 7984aa61755SAndy Ye TEEC_Result TeecResult; 7994aa61755SAndy Ye TEEC_Context TeecContext; 8004aa61755SAndy Ye TEEC_Session TeecSession; 8014aa61755SAndy Ye uint32_t ErrorOrigin; 8024aa61755SAndy Ye TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6, 8034aa61755SAndy Ye { 0xa8, 0x69, 0x9c, 0xe6, 8044aa61755SAndy Ye 0x88, 0x6c, 0x5d, 0x5d 8054aa61755SAndy Ye } 8064aa61755SAndy Ye }; 8074aa61755SAndy Ye TEEC_UUID *TeecUuid = &tempuuid; 8084aa61755SAndy Ye TEEC_Operation TeecOperation = {0}; 8093251364cSHisping Lin struct blk_desc *dev_desc; 8103251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 8116651d4c0SJason Zhu if (!dev_desc) { 8126651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 8136651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 8146651d4c0SJason Zhu } 8154aa61755SAndy Ye 816f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 817f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 818f4e1db95SHisping Lin return TeecResult; 8194aa61755SAndy Ye 8204aa61755SAndy Ye TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 821f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 822f4e1db95SHisping Lin return TeecResult; 8234aa61755SAndy Ye 8243251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 8253251364cSHisping Lin TEEC_NONE, 8263251364cSHisping Lin TEEC_NONE, 8273251364cSHisping Lin TEEC_NONE); 8283251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 829b9a7e756SHisping Lin if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0) 830b9a7e756SHisping Lin TeecOperation.params[0].value.a = 1; 831b9a7e756SHisping Lin else 832b9a7e756SHisping Lin TeecOperation.params[0].value.a = 0; 833b9a7e756SHisping Lin 8343251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 8353251364cSHisping Lin TeecOperation.params[0].value.a = 0; 8363251364cSHisping Lin #endif 8373251364cSHisping Lin 8384aa61755SAndy Ye TeecResult = TEEC_OpenSession(&TeecContext, 8394aa61755SAndy Ye &TeecSession, 8404aa61755SAndy Ye TeecUuid, 8414aa61755SAndy Ye TEEC_LOGIN_PUBLIC, 8424aa61755SAndy Ye NULL, 8433251364cSHisping Lin &TeecOperation, 8444aa61755SAndy Ye &ErrorOrigin); 845f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 846f4e1db95SHisping Lin return TeecResult; 8474aa61755SAndy Ye 8484aa61755SAndy Ye TEEC_SharedMemory SharedMem0 = {0}; 8494aa61755SAndy Ye 8504aa61755SAndy Ye SharedMem0.size = *dh_size; 8514aa61755SAndy Ye SharedMem0.flags = 0; 8524aa61755SAndy Ye 8534aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 854f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 855f4e1db95SHisping Lin goto exit; 8564aa61755SAndy Ye 8574aa61755SAndy Ye TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 8584aa61755SAndy Ye TeecOperation.params[0].tmpref.size = SharedMem0.size; 8594aa61755SAndy Ye 8604aa61755SAndy Ye TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, 8614aa61755SAndy Ye TEEC_NONE, 8624aa61755SAndy Ye TEEC_NONE, 8634aa61755SAndy Ye TEEC_NONE); 8644aa61755SAndy Ye 8654aa61755SAndy Ye TeecResult = TEEC_InvokeCommand(&TeecSession, 8664aa61755SAndy Ye 143, 8674aa61755SAndy Ye &TeecOperation, 8684aa61755SAndy Ye &ErrorOrigin); 869f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 870f4e1db95SHisping Lin goto exit; 8714aa61755SAndy Ye 8724aa61755SAndy Ye *dh_size = TeecOperation.params[0].tmpref.size; 8734aa61755SAndy Ye memcpy(dh, SharedMem0.buffer, SharedMem0.size); 874f4e1db95SHisping Lin exit: 8754aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem0); 8764aa61755SAndy Ye TEEC_CloseSession(&TeecSession); 877f4e1db95SHisping Lin TEEC_FinalizeContext(&TeecContext); 8784aa61755SAndy Ye 8794aa61755SAndy Ye return TeecResult; 8804aa61755SAndy Ye } 8814aa61755SAndy Ye 8824aa61755SAndy Ye uint32_t trusty_attest_uuid(uint8_t *uuid, uint32_t *uuid_size) 8834aa61755SAndy Ye { 8844aa61755SAndy Ye TEEC_Result TeecResult; 8854aa61755SAndy Ye TEEC_Context TeecContext; 8864aa61755SAndy Ye TEEC_Session TeecSession; 8874aa61755SAndy Ye uint32_t ErrorOrigin; 8884aa61755SAndy Ye TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6, 8894aa61755SAndy Ye { 0xa8, 0x69, 0x9c, 0xe6, 8904aa61755SAndy Ye 0x88, 0x6c, 0x5d, 0x5d 8914aa61755SAndy Ye } 8924aa61755SAndy Ye }; 8934aa61755SAndy Ye TEEC_UUID *TeecUuid = &tempuuid; 8944aa61755SAndy Ye TEEC_Operation TeecOperation = {0}; 8953251364cSHisping Lin struct blk_desc *dev_desc; 8963251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 8976651d4c0SJason Zhu if (!dev_desc) { 8986651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 8996651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 9006651d4c0SJason Zhu } 9014aa61755SAndy Ye 902f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 903f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 904f4e1db95SHisping Lin return TeecResult; 9054aa61755SAndy Ye 9064aa61755SAndy Ye TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 907f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 908f4e1db95SHisping Lin return TeecResult; 9094aa61755SAndy Ye 9103251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 9113251364cSHisping Lin TEEC_NONE, 9123251364cSHisping Lin TEEC_NONE, 9133251364cSHisping Lin TEEC_NONE); 9143251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 915b9a7e756SHisping Lin if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0) 916b9a7e756SHisping Lin TeecOperation.params[0].value.a = 1; 917b9a7e756SHisping Lin else 918b9a7e756SHisping Lin TeecOperation.params[0].value.a = 0; 919b9a7e756SHisping Lin 9203251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 9213251364cSHisping Lin TeecOperation.params[0].value.a = 0; 9223251364cSHisping Lin #endif 9233251364cSHisping Lin 9244aa61755SAndy Ye TeecResult = TEEC_OpenSession(&TeecContext, 9254aa61755SAndy Ye &TeecSession, 9264aa61755SAndy Ye TeecUuid, 9274aa61755SAndy Ye TEEC_LOGIN_PUBLIC, 9284aa61755SAndy Ye NULL, 9293251364cSHisping Lin &TeecOperation, 9304aa61755SAndy Ye &ErrorOrigin); 931f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 932f4e1db95SHisping Lin return TeecResult; 9334aa61755SAndy Ye 9344aa61755SAndy Ye TEEC_SharedMemory SharedMem0 = {0}; 9354aa61755SAndy Ye 9364aa61755SAndy Ye SharedMem0.size = *uuid_size; 9374aa61755SAndy Ye SharedMem0.flags = 0; 9384aa61755SAndy Ye 9394aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 940f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 941f4e1db95SHisping Lin goto exit; 9424aa61755SAndy Ye 9434aa61755SAndy Ye TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 9444aa61755SAndy Ye TeecOperation.params[0].tmpref.size = SharedMem0.size; 9454aa61755SAndy Ye 9464aa61755SAndy Ye TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, 9474aa61755SAndy Ye TEEC_NONE, 9484aa61755SAndy Ye TEEC_NONE, 9494aa61755SAndy Ye TEEC_NONE); 9504aa61755SAndy Ye 9514aa61755SAndy Ye TeecResult = TEEC_InvokeCommand(&TeecSession, 9524aa61755SAndy Ye 144, 9534aa61755SAndy Ye &TeecOperation, 9544aa61755SAndy Ye &ErrorOrigin); 955f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 956f4e1db95SHisping Lin goto exit; 9574aa61755SAndy Ye 9584aa61755SAndy Ye *uuid_size = TeecOperation.params[0].tmpref.size; 9594aa61755SAndy Ye memcpy(uuid, SharedMem0.buffer, SharedMem0.size); 960f4e1db95SHisping Lin exit: 9614aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem0); 9624aa61755SAndy Ye TEEC_CloseSession(&TeecSession); 963f4e1db95SHisping Lin TEEC_FinalizeContext(&TeecContext); 9644aa61755SAndy Ye 9654aa61755SAndy Ye return TeecResult; 9664aa61755SAndy Ye } 9674aa61755SAndy Ye 9684aa61755SAndy Ye uint32_t trusty_attest_get_ca(uint8_t *operation_start, 9694aa61755SAndy Ye uint32_t *operation_size, 9704aa61755SAndy Ye uint8_t *out, 9714aa61755SAndy Ye uint32_t *out_len) 9724aa61755SAndy Ye { 9734aa61755SAndy Ye TEEC_Result TeecResult; 9744aa61755SAndy Ye TEEC_Context TeecContext; 9754aa61755SAndy Ye TEEC_Session TeecSession; 9764aa61755SAndy Ye uint32_t ErrorOrigin; 9774aa61755SAndy Ye 9784aa61755SAndy Ye TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6, 9794aa61755SAndy Ye { 0xa8, 0x69, 0x9c, 0xe6, 9804aa61755SAndy Ye 0x88, 0x6c, 0x5d, 0x5d 9814aa61755SAndy Ye } 9824aa61755SAndy Ye }; 9834aa61755SAndy Ye 9844aa61755SAndy Ye TEEC_UUID *TeecUuid = &tempuuid; 9854aa61755SAndy Ye TEEC_Operation TeecOperation = {0}; 9863251364cSHisping Lin struct blk_desc *dev_desc; 9873251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 9886651d4c0SJason Zhu if (!dev_desc) { 9896651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 9906651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 9916651d4c0SJason Zhu } 9924aa61755SAndy Ye 993f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 994f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 995f4e1db95SHisping Lin return TeecResult; 9964aa61755SAndy Ye 9974aa61755SAndy Ye TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 998f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 999f4e1db95SHisping Lin return TeecResult; 10004aa61755SAndy Ye 10013251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 10023251364cSHisping Lin TEEC_NONE, 10033251364cSHisping Lin TEEC_NONE, 10043251364cSHisping Lin TEEC_NONE); 10053251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 1006b9a7e756SHisping Lin if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0) 1007b9a7e756SHisping Lin TeecOperation.params[0].value.a = 1; 1008b9a7e756SHisping Lin else 1009b9a7e756SHisping Lin TeecOperation.params[0].value.a = 0; 1010b9a7e756SHisping Lin 10113251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 10123251364cSHisping Lin TeecOperation.params[0].value.a = 0; 10133251364cSHisping Lin #endif 10143251364cSHisping Lin 10154aa61755SAndy Ye TeecResult = TEEC_OpenSession(&TeecContext, 10164aa61755SAndy Ye &TeecSession, 10174aa61755SAndy Ye TeecUuid, 10184aa61755SAndy Ye TEEC_LOGIN_PUBLIC, 10194aa61755SAndy Ye NULL, 10203251364cSHisping Lin &TeecOperation, 10214aa61755SAndy Ye &ErrorOrigin); 1022f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1023f4e1db95SHisping Lin return TeecResult; 10244aa61755SAndy Ye 10254aa61755SAndy Ye TEEC_SharedMemory SharedMem0 = {0}; 10264aa61755SAndy Ye 10274aa61755SAndy Ye SharedMem0.size = *operation_size; 10284aa61755SAndy Ye SharedMem0.flags = 0; 10294aa61755SAndy Ye 10304aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 1031f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1032f4e1db95SHisping Lin goto exit; 10334aa61755SAndy Ye 10344aa61755SAndy Ye memcpy(SharedMem0.buffer, operation_start, SharedMem0.size); 10354aa61755SAndy Ye 10364aa61755SAndy Ye TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 10374aa61755SAndy Ye TeecOperation.params[0].tmpref.size = SharedMem0.size; 10384aa61755SAndy Ye 10394aa61755SAndy Ye TEEC_SharedMemory SharedMem1 = {0}; 10404aa61755SAndy Ye 10414aa61755SAndy Ye SharedMem1.size = *out_len; 10424aa61755SAndy Ye SharedMem1.flags = 0; 10434aa61755SAndy Ye 10444aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 1045f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1046f4e1db95SHisping Lin goto exit; 10474aa61755SAndy Ye 10484aa61755SAndy Ye TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 10494aa61755SAndy Ye TeecOperation.params[1].tmpref.size = SharedMem1.size; 10504aa61755SAndy Ye 10514aa61755SAndy Ye TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, 10524aa61755SAndy Ye TEEC_MEMREF_TEMP_INOUT, 10534aa61755SAndy Ye TEEC_NONE, 10544aa61755SAndy Ye TEEC_NONE); 10554aa61755SAndy Ye 10564aa61755SAndy Ye TeecResult = TEEC_InvokeCommand(&TeecSession, 10574aa61755SAndy Ye 145, 10584aa61755SAndy Ye &TeecOperation, 10594aa61755SAndy Ye &ErrorOrigin); 1060f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1061f4e1db95SHisping Lin goto exit; 10624aa61755SAndy Ye 10634aa61755SAndy Ye *out_len = TeecOperation.params[1].tmpref.size; 10644aa61755SAndy Ye memcpy(out, SharedMem1.buffer, SharedMem1.size); 1065f4e1db95SHisping Lin exit: 10664aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem0); 10674aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem1); 1068f4e1db95SHisping Lin TEEC_CloseSession(&TeecSession); 1069f4e1db95SHisping Lin TEEC_FinalizeContext(&TeecContext); 10704aa61755SAndy Ye 10714aa61755SAndy Ye return TeecResult; 10724aa61755SAndy Ye } 10734aa61755SAndy Ye 10744aa61755SAndy Ye uint32_t trusty_attest_set_ca(uint8_t *ca_response, uint32_t *ca_response_size) 10754aa61755SAndy Ye { 10764aa61755SAndy Ye TEEC_Result TeecResult; 10774aa61755SAndy Ye TEEC_Context TeecContext; 10784aa61755SAndy Ye TEEC_Session TeecSession; 10794aa61755SAndy Ye uint32_t ErrorOrigin; 10804aa61755SAndy Ye TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6, 10814aa61755SAndy Ye { 0xa8, 0x69, 0x9c, 0xe6, 10824aa61755SAndy Ye 0x88, 0x6c, 0x5d, 0x5d 10834aa61755SAndy Ye } 10844aa61755SAndy Ye }; 10854aa61755SAndy Ye TEEC_UUID *TeecUuid = &tempuuid; 10864aa61755SAndy Ye TEEC_Operation TeecOperation = {0}; 10873251364cSHisping Lin struct blk_desc *dev_desc; 10883251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 10896651d4c0SJason Zhu if (!dev_desc) { 10906651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 10916651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 10926651d4c0SJason Zhu } 1093f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 1094f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1095f4e1db95SHisping Lin return TeecResult; 10964aa61755SAndy Ye 10974aa61755SAndy Ye TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1098f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1099f4e1db95SHisping Lin return TeecResult; 11004aa61755SAndy Ye 11013251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 11023251364cSHisping Lin TEEC_NONE, 11033251364cSHisping Lin TEEC_NONE, 11043251364cSHisping Lin TEEC_NONE); 11053251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 1106b9a7e756SHisping Lin if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0) 1107b9a7e756SHisping Lin TeecOperation.params[0].value.a = 1; 1108b9a7e756SHisping Lin else 1109b9a7e756SHisping Lin TeecOperation.params[0].value.a = 0; 1110b9a7e756SHisping Lin 11113251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 11123251364cSHisping Lin TeecOperation.params[0].value.a = 0; 11133251364cSHisping Lin #endif 11143251364cSHisping Lin 11154aa61755SAndy Ye TeecResult = TEEC_OpenSession(&TeecContext, 11164aa61755SAndy Ye &TeecSession, 11174aa61755SAndy Ye TeecUuid, 11184aa61755SAndy Ye TEEC_LOGIN_PUBLIC, 11194aa61755SAndy Ye NULL, 11203251364cSHisping Lin &TeecOperation, 11214aa61755SAndy Ye &ErrorOrigin); 1122f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1123f4e1db95SHisping Lin return TeecResult; 11244aa61755SAndy Ye 11254aa61755SAndy Ye TEEC_SharedMemory SharedMem0 = {0}; 11264aa61755SAndy Ye 11274aa61755SAndy Ye SharedMem0.size = *ca_response_size; 11284aa61755SAndy Ye SharedMem0.flags = 0; 11294aa61755SAndy Ye 11304aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 1131f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1132f4e1db95SHisping Lin goto exit; 11334aa61755SAndy Ye 11344aa61755SAndy Ye memcpy(SharedMem0.buffer, ca_response, SharedMem0.size); 11354aa61755SAndy Ye 11364aa61755SAndy Ye TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 11374aa61755SAndy Ye TeecOperation.params[0].tmpref.size = SharedMem0.size; 11384aa61755SAndy Ye 11394aa61755SAndy Ye TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, 11404aa61755SAndy Ye TEEC_NONE, 11414aa61755SAndy Ye TEEC_NONE, 11424aa61755SAndy Ye TEEC_NONE); 11434aa61755SAndy Ye 11444aa61755SAndy Ye TeecResult = TEEC_InvokeCommand(&TeecSession, 11454aa61755SAndy Ye 146, 11464aa61755SAndy Ye &TeecOperation, 11474aa61755SAndy Ye &ErrorOrigin); 1148f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1149f4e1db95SHisping Lin goto exit; 1150f4e1db95SHisping Lin exit: 11514aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem0); 11524aa61755SAndy Ye TEEC_CloseSession(&TeecSession); 1153f4e1db95SHisping Lin TEEC_FinalizeContext(&TeecContext); 11544aa61755SAndy Ye 11554aa61755SAndy Ye return TeecResult; 11564aa61755SAndy Ye } 1157