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> 9ae8ec5e1SHisping Lin #include <optee_include/OpteeClientApiLib.h> 10ae8ec5e1SHisping Lin #include <optee_include/tee_client_api.h> 1178ef5fbdSqiujian #include <optee_include/tee_api_defines.h> 123251364cSHisping Lin #include <boot_rkimg.h> 13a7df4868Stony.xu #include <stdlib.h> 141e8c0e44STony Xu #include <attestation_key.h> 15a7df4868Stony.xu 16a7df4868Stony.xu #define BOOT_FROM_EMMC (1 << 1) 17c7de5349SHisping Lin #define STORAGE_CMD_READ_ATTRIBUTE_HASH 0 18c7de5349SHisping Lin #define STORAGE_CMD_WRITE_ATTRIBUTE_HASH 1 19c7de5349SHisping Lin #define STORAGE_CMD_UBOOT_END_OTP 2 20c7de5349SHisping Lin #define STORAGE_CMD_READ_VBOOTKEY_HASH 3 21c7de5349SHisping Lin #define STORAGE_CMD_WRITE_VBOOTKEY_HASH 4 22c7de5349SHisping Lin #define STORAGE_CMD_READ_ENABLE_FLAG 5 231ef63c75SHisping Lin #define STORAGE_CMD_WRITE_TA_ENCRYPTION_KEY 9 24*fbf29bfbSHisping Lin #define STORAGE_CMD_CHECK_SECURITY_LEVEL_FLAG 10 25ae8ec5e1SHisping Lin 26ae8ec5e1SHisping Lin static uint8_t b2hs_add_base(uint8_t in) 27ae8ec5e1SHisping Lin { 28ae8ec5e1SHisping Lin if (in > 9) 29ae8ec5e1SHisping Lin return in + 55; 30ae8ec5e1SHisping Lin else 31ae8ec5e1SHisping Lin return in + 48; 32ae8ec5e1SHisping Lin } 33ae8ec5e1SHisping Lin 34c7de5349SHisping Lin static uint32_t b2hs(uint8_t *b, uint8_t *hs, uint32_t blen, uint32_t hslen) 35ae8ec5e1SHisping Lin { 36ae8ec5e1SHisping Lin uint32_t i = 0; 37ae8ec5e1SHisping Lin 38ae8ec5e1SHisping Lin if (blen * 2 + 1 > hslen) 39ae8ec5e1SHisping Lin return 0; 40ae8ec5e1SHisping Lin 41ae8ec5e1SHisping Lin for (; i < blen; i++) { 42ae8ec5e1SHisping Lin hs[i * 2 + 1] = b2hs_add_base(b[i] & 0xf); 43ae8ec5e1SHisping Lin hs[i * 2] = b2hs_add_base(b[i] >> 4); 44ae8ec5e1SHisping Lin } 45ae8ec5e1SHisping Lin hs[blen * 2] = 0; 46ae8ec5e1SHisping Lin 47ae8ec5e1SHisping Lin return blen * 2; 48ae8ec5e1SHisping Lin } 49ae8ec5e1SHisping Lin 50c7de5349SHisping Lin static uint32_t trusty_base_write_security_data(char *filename, 51c7de5349SHisping Lin uint32_t filename_size, 52c7de5349SHisping Lin uint8_t *data, 53c7de5349SHisping Lin uint32_t data_size) 54ae8ec5e1SHisping Lin { 55ae8ec5e1SHisping Lin TEEC_Result TeecResult; 56ae8ec5e1SHisping Lin TEEC_Context TeecContext; 57ae8ec5e1SHisping Lin TEEC_Session TeecSession; 58ae8ec5e1SHisping Lin uint32_t ErrorOrigin; 59ae8ec5e1SHisping Lin TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 60ae8ec5e1SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 61ae8ec5e1SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 62ae8ec5e1SHisping Lin TEEC_Operation TeecOperation = {0}; 633251364cSHisping Lin struct blk_desc *dev_desc; 643251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 656651d4c0SJason Zhu if (!dev_desc) { 666651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 676651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 686651d4c0SJason Zhu } 693251364cSHisping Lin 70f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 71f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 72f4e1db95SHisping Lin return TeecResult; 73ae8ec5e1SHisping Lin 74ae8ec5e1SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 75f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 76f4e1db95SHisping Lin return TeecResult; 77ae8ec5e1SHisping Lin 783251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 793251364cSHisping Lin TEEC_NONE, 803251364cSHisping Lin TEEC_NONE, 813251364cSHisping Lin TEEC_NONE); 823251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 83b9a7e756SHisping Lin if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0) 84b9a7e756SHisping Lin TeecOperation.params[0].value.a = 1; 85b9a7e756SHisping Lin else 86b9a7e756SHisping Lin TeecOperation.params[0].value.a = 0; 873251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 883251364cSHisping Lin TeecOperation.params[0].value.a = 0; 893251364cSHisping Lin #endif 903251364cSHisping Lin 91ae8ec5e1SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 92ae8ec5e1SHisping Lin &TeecSession, 93ae8ec5e1SHisping Lin TeecUuid, 94ae8ec5e1SHisping Lin TEEC_LOGIN_PUBLIC, 95ae8ec5e1SHisping Lin NULL, 963251364cSHisping Lin &TeecOperation, 97ae8ec5e1SHisping Lin &ErrorOrigin); 98f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 99f4e1db95SHisping Lin return TeecResult; 100ae8ec5e1SHisping Lin 101ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 102ae8ec5e1SHisping Lin 103c7de5349SHisping Lin SharedMem0.size = filename_size; 104ae8ec5e1SHisping Lin SharedMem0.flags = 0; 105ae8ec5e1SHisping Lin 106ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 107f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 108f4e1db95SHisping Lin goto exit; 109ae8ec5e1SHisping Lin 110c7de5349SHisping Lin memcpy(SharedMem0.buffer, filename, SharedMem0.size); 111ae8ec5e1SHisping Lin 112ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem1 = {0}; 113ae8ec5e1SHisping Lin 114c7de5349SHisping Lin SharedMem1.size = data_size; 115c7de5349SHisping Lin SharedMem1.flags = 0; 116c7de5349SHisping Lin 117c7de5349SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 118c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 119c7de5349SHisping Lin goto exit; 120c7de5349SHisping Lin 121c7de5349SHisping Lin memcpy(SharedMem1.buffer, data, SharedMem1.size); 122c7de5349SHisping Lin 123c7de5349SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 124c7de5349SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 125c7de5349SHisping Lin 126c7de5349SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 127c7de5349SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem1.size; 128c7de5349SHisping Lin 129c7de5349SHisping Lin 130c7de5349SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 131c7de5349SHisping Lin TEEC_MEMREF_TEMP_INOUT, 132c7de5349SHisping Lin TEEC_NONE, 133c7de5349SHisping Lin TEEC_NONE); 134c7de5349SHisping Lin 135c7de5349SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 136c7de5349SHisping Lin 1, 137c7de5349SHisping Lin &TeecOperation, 138c7de5349SHisping Lin &ErrorOrigin); 139c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 140c7de5349SHisping Lin goto exit; 141c7de5349SHisping Lin exit: 142c7de5349SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 143c7de5349SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem1); 144c7de5349SHisping Lin TEEC_CloseSession(&TeecSession); 145c7de5349SHisping Lin TEEC_FinalizeContext(&TeecContext); 146c7de5349SHisping Lin 147c7de5349SHisping Lin return TeecResult; 148c7de5349SHisping Lin } 149c7de5349SHisping Lin 150c7de5349SHisping Lin static uint32_t trusty_base_read_security_data(char *filename, 151c7de5349SHisping Lin uint32_t filename_size, 152c7de5349SHisping Lin uint8_t *data, 153c7de5349SHisping Lin uint32_t data_size) 154c7de5349SHisping Lin { 155c7de5349SHisping Lin TEEC_Result TeecResult; 156c7de5349SHisping Lin TEEC_Context TeecContext; 157c7de5349SHisping Lin TEEC_Session TeecSession; 158c7de5349SHisping Lin uint32_t ErrorOrigin; 159c7de5349SHisping Lin TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 160c7de5349SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 161c7de5349SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 162c7de5349SHisping Lin TEEC_Operation TeecOperation = {0}; 163c7de5349SHisping Lin 164c7de5349SHisping Lin struct blk_desc *dev_desc; 165c7de5349SHisping Lin dev_desc = rockchip_get_bootdev(); 166c7de5349SHisping Lin if (!dev_desc) { 167c7de5349SHisping Lin printf("%s: dev_desc is NULL!\n", __func__); 168c7de5349SHisping Lin return -TEEC_ERROR_GENERIC; 169c7de5349SHisping Lin } 170c7de5349SHisping Lin 171c7de5349SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 172c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 173c7de5349SHisping Lin return TeecResult; 174c7de5349SHisping Lin 175c7de5349SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 176c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 177c7de5349SHisping Lin return TeecResult; 178c7de5349SHisping Lin 179c7de5349SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 180c7de5349SHisping Lin TEEC_NONE, 181c7de5349SHisping Lin TEEC_NONE, 182c7de5349SHisping Lin TEEC_NONE); 183c7de5349SHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 184c7de5349SHisping Lin if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0) 185c7de5349SHisping Lin TeecOperation.params[0].value.a = 1; 186c7de5349SHisping Lin else 187c7de5349SHisping Lin TeecOperation.params[0].value.a = 0; 188c7de5349SHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 189c7de5349SHisping Lin TeecOperation.params[0].value.a = 0; 190c7de5349SHisping Lin #endif 191c7de5349SHisping Lin 192c7de5349SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 193c7de5349SHisping Lin &TeecSession, 194c7de5349SHisping Lin TeecUuid, 195c7de5349SHisping Lin TEEC_LOGIN_PUBLIC, 196c7de5349SHisping Lin NULL, 197c7de5349SHisping Lin &TeecOperation, 198c7de5349SHisping Lin &ErrorOrigin); 199c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 200c7de5349SHisping Lin return TeecResult; 201c7de5349SHisping Lin 202c7de5349SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 203c7de5349SHisping Lin 204c7de5349SHisping Lin SharedMem0.size = filename_size; 205c7de5349SHisping Lin SharedMem0.flags = 0; 206c7de5349SHisping Lin 207c7de5349SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 208c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 209c7de5349SHisping Lin goto exit; 210c7de5349SHisping Lin 211c7de5349SHisping Lin memcpy(SharedMem0.buffer, filename, SharedMem0.size); 212c7de5349SHisping Lin 213c7de5349SHisping Lin TEEC_SharedMemory SharedMem1 = {0}; 214c7de5349SHisping Lin 215c7de5349SHisping Lin SharedMem1.size = data_size; 216ae8ec5e1SHisping Lin SharedMem1.flags = 0; 217ae8ec5e1SHisping Lin 218ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 219f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 220f4e1db95SHisping Lin goto exit; 221ae8ec5e1SHisping Lin 222ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 223ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 224ae8ec5e1SHisping Lin 225ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 226ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem1.size; 227ae8ec5e1SHisping Lin 228ae8ec5e1SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 229ae8ec5e1SHisping Lin TEEC_MEMREF_TEMP_INOUT, 230ae8ec5e1SHisping Lin TEEC_NONE, 231ae8ec5e1SHisping Lin TEEC_NONE); 232ae8ec5e1SHisping Lin 233ae8ec5e1SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 234ae8ec5e1SHisping Lin 0, 235ae8ec5e1SHisping Lin &TeecOperation, 236ae8ec5e1SHisping Lin &ErrorOrigin); 23746b2a054SHisping Lin if (TeecResult == TEEC_SUCCESS) 238c7de5349SHisping Lin memcpy(data, SharedMem1.buffer, SharedMem1.size); 239f4e1db95SHisping Lin exit: 240ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 241ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem1); 242ae8ec5e1SHisping Lin TEEC_CloseSession(&TeecSession); 24346b2a054SHisping Lin TEEC_FinalizeContext(&TeecContext); 244ae8ec5e1SHisping Lin 245ae8ec5e1SHisping Lin return TeecResult; 246ae8ec5e1SHisping Lin } 247ae8ec5e1SHisping Lin 248c7de5349SHisping Lin static uint32_t trusty_base_end_security_data(void) 249c7de5349SHisping Lin { 250c7de5349SHisping Lin TEEC_Result TeecResult; 251c7de5349SHisping Lin TEEC_Context TeecContext; 252c7de5349SHisping Lin TEEC_Session TeecSession; 253c7de5349SHisping Lin uint32_t ErrorOrigin; 254c7de5349SHisping Lin TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 255c7de5349SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 256c7de5349SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 257c7de5349SHisping Lin TEEC_Operation TeecOperation = {0}; 258c7de5349SHisping Lin 259c7de5349SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 260c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 261c7de5349SHisping Lin return TeecResult; 262c7de5349SHisping Lin 263c7de5349SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 264c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 265c7de5349SHisping Lin return TeecResult; 266c7de5349SHisping Lin 267c7de5349SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 268c7de5349SHisping Lin &TeecSession, 269c7de5349SHisping Lin TeecUuid, 270c7de5349SHisping Lin TEEC_LOGIN_PUBLIC, 271c7de5349SHisping Lin NULL, 272c7de5349SHisping Lin NULL, 273c7de5349SHisping Lin &ErrorOrigin); 274c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 275c7de5349SHisping Lin return TeecResult; 276c7de5349SHisping Lin 277c7de5349SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE, 278c7de5349SHisping Lin TEEC_NONE, 279c7de5349SHisping Lin TEEC_NONE, 280c7de5349SHisping Lin TEEC_NONE); 281c7de5349SHisping Lin 282c7de5349SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 283c7de5349SHisping Lin 2, 284c7de5349SHisping Lin &TeecOperation, 285c7de5349SHisping Lin &ErrorOrigin); 286c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 287c7de5349SHisping Lin goto exit; 288c7de5349SHisping Lin exit: 289c7de5349SHisping Lin TEEC_CloseSession(&TeecSession); 290c7de5349SHisping Lin TEEC_FinalizeContext(&TeecContext); 291c7de5349SHisping Lin 292c7de5349SHisping Lin return TeecResult; 293c7de5349SHisping Lin } 294c7de5349SHisping Lin 295c7de5349SHisping Lin uint32_t trusty_read_rollback_index(uint32_t slot, uint64_t *value) 296c7de5349SHisping Lin { 297c7de5349SHisping Lin char hs[9]; 298c7de5349SHisping Lin 299c7de5349SHisping Lin b2hs((uint8_t *)&slot, (uint8_t *)hs, 4, 9); 300c7de5349SHisping Lin 301c7de5349SHisping Lin return trusty_base_read_security_data(hs, 8, (uint8_t *)value, 8); 302c7de5349SHisping Lin } 303c7de5349SHisping Lin 304ae8ec5e1SHisping Lin uint32_t trusty_write_rollback_index(uint32_t slot, uint64_t value) 305ae8ec5e1SHisping Lin { 306c7de5349SHisping Lin char hs[9]; 3073251364cSHisping Lin 308c7de5349SHisping Lin b2hs((uint8_t *)&slot, (uint8_t *)hs, 4, 9); 309ae8ec5e1SHisping Lin 310c7de5349SHisping Lin return trusty_base_write_security_data(hs, 8, (uint8_t *)&value, 8); 311ae8ec5e1SHisping Lin } 312ae8ec5e1SHisping Lin 313ae8ec5e1SHisping Lin uint32_t trusty_read_permanent_attributes(uint8_t *attributes, uint32_t size) 314ae8ec5e1SHisping Lin { 315c7de5349SHisping Lin return trusty_base_read_security_data("attributes", 316c7de5349SHisping Lin sizeof("attributes"), attributes, size); 317ae8ec5e1SHisping Lin } 318ae8ec5e1SHisping Lin 319ae8ec5e1SHisping Lin uint32_t trusty_write_permanent_attributes(uint8_t *attributes, uint32_t size) 320ae8ec5e1SHisping Lin { 321c7de5349SHisping Lin return trusty_base_write_security_data("attributes", 322c7de5349SHisping Lin sizeof("attributes"), attributes, size); 3236651d4c0SJason Zhu } 324ae8ec5e1SHisping Lin 325c7de5349SHisping Lin uint32_t trusty_read_permanent_attributes_flag(uint8_t *attributes) 326c7de5349SHisping Lin { 327c7de5349SHisping Lin return trusty_base_read_security_data("attributes_flag", 328c7de5349SHisping Lin sizeof("attributes_flag"), attributes, 1); 329c7de5349SHisping Lin } 330ae8ec5e1SHisping Lin 331c7de5349SHisping Lin uint32_t trusty_write_permanent_attributes_flag(uint8_t attributes) 332c7de5349SHisping Lin { 333c7de5349SHisping Lin return trusty_base_write_security_data("attributes_flag", 334c7de5349SHisping Lin sizeof("attributes_flag"), &attributes, 1); 335ae8ec5e1SHisping Lin } 336ae8ec5e1SHisping Lin 337564654ebSJason Zhu uint32_t trusty_read_permanent_attributes_cer(uint8_t *attributes, 338564654ebSJason Zhu uint32_t size) 339564654ebSJason Zhu { 340c7de5349SHisping Lin return trusty_base_read_security_data("rsacer", 341c7de5349SHisping Lin sizeof("rsacer"), attributes, size); 342564654ebSJason Zhu } 343564654ebSJason Zhu 344564654ebSJason Zhu uint32_t trusty_write_permanent_attributes_cer(uint8_t *attributes, 345564654ebSJason Zhu uint32_t size) 346564654ebSJason Zhu { 347c7de5349SHisping Lin return trusty_base_write_security_data("rsacer", 348c7de5349SHisping Lin sizeof("rsacer"), attributes, size); 349564654ebSJason Zhu } 350564654ebSJason Zhu 351ae8ec5e1SHisping Lin uint32_t trusty_read_lock_state(uint8_t *lock_state) 352ae8ec5e1SHisping Lin { 353c7de5349SHisping Lin return trusty_base_read_security_data("lock_state", 354c7de5349SHisping Lin sizeof("lock_state"), lock_state, 1); 355ae8ec5e1SHisping Lin } 356ae8ec5e1SHisping Lin 357ae8ec5e1SHisping Lin uint32_t trusty_write_lock_state(uint8_t lock_state) 358ae8ec5e1SHisping Lin { 359c7de5349SHisping Lin return trusty_base_write_security_data("lock_state", 360c7de5349SHisping Lin sizeof("lock_state"), &lock_state, 1); 361ae8ec5e1SHisping Lin } 362ae8ec5e1SHisping Lin 363ae8ec5e1SHisping Lin uint32_t trusty_read_flash_lock_state(uint8_t *flash_lock_state) 364ae8ec5e1SHisping Lin { 365c7de5349SHisping Lin return trusty_base_read_security_data("flash_lock_state", 366c7de5349SHisping Lin sizeof("flash_lock_state"), flash_lock_state, 1); 367c7de5349SHisping Lin } 368c7de5349SHisping Lin 369c7de5349SHisping Lin uint32_t trusty_write_flash_lock_state(uint8_t flash_lock_state) 370c7de5349SHisping Lin { 371c7de5349SHisping Lin return trusty_base_write_security_data("flash_lock_state", 372c7de5349SHisping Lin sizeof("flash_lock_state"), &flash_lock_state, 1); 373c7de5349SHisping Lin } 374c7de5349SHisping Lin 375c7de5349SHisping Lin static uint32_t trusty_base_end_efuse_or_otp(void) 376c7de5349SHisping Lin { 377ae8ec5e1SHisping Lin TEEC_Result TeecResult; 378ae8ec5e1SHisping Lin TEEC_Context TeecContext; 379ae8ec5e1SHisping Lin TEEC_Session TeecSession; 380ae8ec5e1SHisping Lin uint32_t ErrorOrigin; 381c7de5349SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 382c7de5349SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 383c7de5349SHisping Lin 384ae8ec5e1SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 385ae8ec5e1SHisping Lin TEEC_Operation TeecOperation = {0}; 386ae8ec5e1SHisping Lin 387f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 388f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 389f4e1db95SHisping Lin return TeecResult; 390ae8ec5e1SHisping Lin 391ae8ec5e1SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 392f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 393f4e1db95SHisping Lin return TeecResult; 394ae8ec5e1SHisping Lin 395ae8ec5e1SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 396ae8ec5e1SHisping Lin &TeecSession, 397ae8ec5e1SHisping Lin TeecUuid, 398ae8ec5e1SHisping Lin TEEC_LOGIN_PUBLIC, 399ae8ec5e1SHisping Lin NULL, 400c7de5349SHisping Lin NULL, 401ae8ec5e1SHisping Lin &ErrorOrigin); 402f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 403f4e1db95SHisping Lin return TeecResult; 404ae8ec5e1SHisping Lin 405c7de5349SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE, 406c7de5349SHisping Lin TEEC_NONE, 407ae8ec5e1SHisping Lin TEEC_NONE, 408ae8ec5e1SHisping Lin TEEC_NONE); 409ae8ec5e1SHisping Lin 410ae8ec5e1SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 411c7de5349SHisping Lin STORAGE_CMD_UBOOT_END_OTP, 412ae8ec5e1SHisping Lin &TeecOperation, 413ae8ec5e1SHisping Lin &ErrorOrigin); 414c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 415c7de5349SHisping Lin goto exit; 416f4e1db95SHisping Lin exit: 417ae8ec5e1SHisping Lin TEEC_CloseSession(&TeecSession); 41846b2a054SHisping Lin TEEC_FinalizeContext(&TeecContext); 419ae8ec5e1SHisping Lin 420ae8ec5e1SHisping Lin return TeecResult; 421ae8ec5e1SHisping Lin } 422ae8ec5e1SHisping Lin 423c7de5349SHisping Lin static uint32_t trusty_base_efuse_or_otp_operation(uint32_t cmd, 424c7de5349SHisping Lin uint8_t is_write, 425c7de5349SHisping Lin uint32_t *buf, 426c7de5349SHisping Lin uint32_t length) 427ae8ec5e1SHisping Lin { 428ae8ec5e1SHisping Lin TEEC_Result TeecResult; 429ae8ec5e1SHisping Lin TEEC_Context TeecContext; 430ae8ec5e1SHisping Lin TEEC_Session TeecSession; 431ae8ec5e1SHisping Lin uint32_t ErrorOrigin; 432c7de5349SHisping Lin 433c7de5349SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 434c7de5349SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 435ae8ec5e1SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 436ae8ec5e1SHisping Lin TEEC_Operation TeecOperation = {0}; 437ae8ec5e1SHisping Lin 438f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 439f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 440f4e1db95SHisping Lin return TeecResult; 441ae8ec5e1SHisping Lin 442ae8ec5e1SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 443f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 444f4e1db95SHisping Lin return TeecResult; 445ae8ec5e1SHisping Lin 446ae8ec5e1SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 447ae8ec5e1SHisping Lin &TeecSession, 448ae8ec5e1SHisping Lin TeecUuid, 449ae8ec5e1SHisping Lin TEEC_LOGIN_PUBLIC, 450ae8ec5e1SHisping Lin NULL, 451c7de5349SHisping Lin NULL, 452ae8ec5e1SHisping Lin &ErrorOrigin); 453f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 454f4e1db95SHisping Lin return TeecResult; 455ae8ec5e1SHisping Lin 456ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 457ae8ec5e1SHisping Lin 458c7de5349SHisping Lin SharedMem0.size = length * sizeof(uint32_t); 459ae8ec5e1SHisping Lin SharedMem0.flags = 0; 460ae8ec5e1SHisping Lin 461ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 462f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 463f4e1db95SHisping Lin goto exit; 464ae8ec5e1SHisping Lin 465ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 466ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 467ae8ec5e1SHisping Lin 468c7de5349SHisping Lin if (is_write) { 469c7de5349SHisping Lin memcpy(SharedMem0.buffer, buf, SharedMem0.size); 470ae8ec5e1SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 471c7de5349SHisping Lin TEEC_NONE, 472ae8ec5e1SHisping Lin TEEC_NONE, 473ae8ec5e1SHisping Lin TEEC_NONE); 474ae8ec5e1SHisping Lin 475c7de5349SHisping Lin } else { 476c7de5349SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT, 477c7de5349SHisping Lin TEEC_NONE, 478c7de5349SHisping Lin TEEC_NONE, 479c7de5349SHisping Lin TEEC_NONE); 480c7de5349SHisping Lin } 481c7de5349SHisping Lin 482ae8ec5e1SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 483c7de5349SHisping Lin cmd, 484ae8ec5e1SHisping Lin &TeecOperation, 485ae8ec5e1SHisping Lin &ErrorOrigin); 486f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 487f4e1db95SHisping Lin goto exit; 488c7de5349SHisping Lin 489c7de5349SHisping Lin if (!is_write) 490c7de5349SHisping Lin memcpy(buf, SharedMem0.buffer, SharedMem0.size); 491c7de5349SHisping Lin 492f4e1db95SHisping Lin exit: 493ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 494ae8ec5e1SHisping Lin TEEC_CloseSession(&TeecSession); 49546b2a054SHisping Lin TEEC_FinalizeContext(&TeecContext); 496ae8ec5e1SHisping Lin 497ae8ec5e1SHisping Lin return TeecResult; 498ae8ec5e1SHisping Lin } 499ae8ec5e1SHisping Lin 5006ef445a4SHisping Lin uint32_t trusty_read_attribute_hash(uint32_t *buf, uint32_t length) 5016ef445a4SHisping Lin { 502c7de5349SHisping Lin return trusty_base_efuse_or_otp_operation(STORAGE_CMD_READ_ATTRIBUTE_HASH, 503c7de5349SHisping Lin false, buf, length); 5046ef445a4SHisping Lin } 5056ef445a4SHisping Lin 5066ef445a4SHisping Lin uint32_t trusty_write_attribute_hash(uint32_t *buf, uint32_t length) 5076ef445a4SHisping Lin { 508c7de5349SHisping Lin return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_ATTRIBUTE_HASH, 509c7de5349SHisping Lin true, buf, length); 51016539616SHisping Lin } 51116539616SHisping Lin 51216539616SHisping Lin uint32_t trusty_notify_optee_uboot_end(void) 51316539616SHisping Lin { 51416539616SHisping Lin TEEC_Result res; 515c7de5349SHisping Lin 516c7de5349SHisping Lin res = trusty_base_end_security_data(); 517c7de5349SHisping Lin res |= trusty_base_end_efuse_or_otp(); 51816539616SHisping Lin return res; 51916539616SHisping Lin } 5202cd27853SHisping Lin 5212cd27853SHisping Lin uint32_t trusty_read_vbootkey_hash(uint32_t *buf, uint32_t length) 5222cd27853SHisping Lin { 523c7de5349SHisping Lin return trusty_base_efuse_or_otp_operation(STORAGE_CMD_READ_VBOOTKEY_HASH, 524c7de5349SHisping Lin false, buf, length); 5252cd27853SHisping Lin } 526c7de5349SHisping Lin 5272cd27853SHisping Lin uint32_t trusty_write_vbootkey_hash(uint32_t *buf, uint32_t length) 5282cd27853SHisping Lin { 529c7de5349SHisping Lin return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_VBOOTKEY_HASH, 530c7de5349SHisping Lin true, buf, length); 5312cd27853SHisping Lin } 532095e2a82SHisping Lin 533468df3b2SHisping Lin uint32_t trusty_read_vbootkey_enable_flag(uint8_t *flag) 534468df3b2SHisping Lin { 535468df3b2SHisping Lin uint32_t bootflag; 536c7de5349SHisping Lin TEEC_Result TeecResult; 537468df3b2SHisping Lin 538c7de5349SHisping Lin TeecResult = trusty_base_efuse_or_otp_operation(STORAGE_CMD_READ_ENABLE_FLAG, 539c7de5349SHisping Lin false, &bootflag, 1); 540468df3b2SHisping Lin 541468df3b2SHisping Lin if (TeecResult == TEEC_SUCCESS) { 5420202ee8aSHisping Lin #if defined(CONFIG_ROCKCHIP_RK3288) 5430202ee8aSHisping Lin if (bootflag == 0x00000001) 5440202ee8aSHisping Lin *flag = 1; 5450202ee8aSHisping Lin #else 546468df3b2SHisping Lin if (bootflag == 0x000000FF) 547468df3b2SHisping Lin *flag = 1; 5480202ee8aSHisping Lin #endif 549468df3b2SHisping Lin } 550095e2a82SHisping Lin return TeecResult; 551095e2a82SHisping Lin } 5524aa61755SAndy Ye 5531ef63c75SHisping Lin uint32_t trusty_write_ta_encryption_key(uint32_t *buf, uint32_t length) 5541ef63c75SHisping Lin { 5551ef63c75SHisping Lin return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_TA_ENCRYPTION_KEY, 5561ef63c75SHisping Lin true, buf, length); 5571ef63c75SHisping Lin } 5581ef63c75SHisping Lin 559*fbf29bfbSHisping Lin uint32_t trusty_check_security_level_flag(uint8_t flag) 560*fbf29bfbSHisping Lin { 561*fbf29bfbSHisping Lin uint32_t levelflag; 562*fbf29bfbSHisping Lin 563*fbf29bfbSHisping Lin levelflag = flag; 564*fbf29bfbSHisping Lin return trusty_base_efuse_or_otp_operation(STORAGE_CMD_CHECK_SECURITY_LEVEL_FLAG, 565*fbf29bfbSHisping Lin true, &levelflag, 1); 566*fbf29bfbSHisping Lin } 567*fbf29bfbSHisping Lin 5684aa61755SAndy Ye uint32_t trusty_attest_dh(uint8_t *dh, uint32_t *dh_size) 5694aa61755SAndy Ye { 5704aa61755SAndy Ye TEEC_Result TeecResult; 5714aa61755SAndy Ye TEEC_Context TeecContext; 5724aa61755SAndy Ye TEEC_Session TeecSession; 5734aa61755SAndy Ye uint32_t ErrorOrigin; 5744aa61755SAndy Ye TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6, 5754aa61755SAndy Ye { 0xa8, 0x69, 0x9c, 0xe6, 5764aa61755SAndy Ye 0x88, 0x6c, 0x5d, 0x5d 5774aa61755SAndy Ye } 5784aa61755SAndy Ye }; 5794aa61755SAndy Ye TEEC_UUID *TeecUuid = &tempuuid; 5804aa61755SAndy Ye TEEC_Operation TeecOperation = {0}; 5813251364cSHisping Lin struct blk_desc *dev_desc; 5823251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 5836651d4c0SJason Zhu if (!dev_desc) { 5846651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 5856651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 5866651d4c0SJason Zhu } 5874aa61755SAndy Ye 588f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 589f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 590f4e1db95SHisping Lin return TeecResult; 5914aa61755SAndy Ye 5924aa61755SAndy Ye TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 593f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 594f4e1db95SHisping Lin return TeecResult; 5954aa61755SAndy Ye 5963251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 5973251364cSHisping Lin TEEC_NONE, 5983251364cSHisping Lin TEEC_NONE, 5993251364cSHisping Lin TEEC_NONE); 6003251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 601b9a7e756SHisping Lin if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0) 602b9a7e756SHisping Lin TeecOperation.params[0].value.a = 1; 603b9a7e756SHisping Lin else 604b9a7e756SHisping Lin TeecOperation.params[0].value.a = 0; 605b9a7e756SHisping Lin 6063251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 6073251364cSHisping Lin TeecOperation.params[0].value.a = 0; 6083251364cSHisping Lin #endif 6093251364cSHisping Lin 6104aa61755SAndy Ye TeecResult = TEEC_OpenSession(&TeecContext, 6114aa61755SAndy Ye &TeecSession, 6124aa61755SAndy Ye TeecUuid, 6134aa61755SAndy Ye TEEC_LOGIN_PUBLIC, 6144aa61755SAndy Ye NULL, 6153251364cSHisping Lin &TeecOperation, 6164aa61755SAndy Ye &ErrorOrigin); 617f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 618f4e1db95SHisping Lin return TeecResult; 6194aa61755SAndy Ye 6204aa61755SAndy Ye TEEC_SharedMemory SharedMem0 = {0}; 6214aa61755SAndy Ye 6224aa61755SAndy Ye SharedMem0.size = *dh_size; 6234aa61755SAndy Ye SharedMem0.flags = 0; 6244aa61755SAndy Ye 6254aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 626f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 627f4e1db95SHisping Lin goto exit; 6284aa61755SAndy Ye 6294aa61755SAndy Ye TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 6304aa61755SAndy Ye TeecOperation.params[0].tmpref.size = SharedMem0.size; 6314aa61755SAndy Ye 6324aa61755SAndy Ye TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, 6334aa61755SAndy Ye TEEC_NONE, 6344aa61755SAndy Ye TEEC_NONE, 6354aa61755SAndy Ye TEEC_NONE); 6364aa61755SAndy Ye 6374aa61755SAndy Ye TeecResult = TEEC_InvokeCommand(&TeecSession, 6384aa61755SAndy Ye 143, 6394aa61755SAndy Ye &TeecOperation, 6404aa61755SAndy Ye &ErrorOrigin); 641f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 642f4e1db95SHisping Lin goto exit; 6434aa61755SAndy Ye 6444aa61755SAndy Ye *dh_size = TeecOperation.params[0].tmpref.size; 6454aa61755SAndy Ye memcpy(dh, SharedMem0.buffer, SharedMem0.size); 646f4e1db95SHisping Lin exit: 6474aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem0); 6484aa61755SAndy Ye TEEC_CloseSession(&TeecSession); 649f4e1db95SHisping Lin TEEC_FinalizeContext(&TeecContext); 6504aa61755SAndy Ye 6514aa61755SAndy Ye return TeecResult; 6524aa61755SAndy Ye } 6534aa61755SAndy Ye 6544aa61755SAndy Ye uint32_t trusty_attest_uuid(uint8_t *uuid, uint32_t *uuid_size) 6554aa61755SAndy Ye { 6564aa61755SAndy Ye TEEC_Result TeecResult; 6574aa61755SAndy Ye TEEC_Context TeecContext; 6584aa61755SAndy Ye TEEC_Session TeecSession; 6594aa61755SAndy Ye uint32_t ErrorOrigin; 6604aa61755SAndy Ye TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6, 6614aa61755SAndy Ye { 0xa8, 0x69, 0x9c, 0xe6, 6624aa61755SAndy Ye 0x88, 0x6c, 0x5d, 0x5d 6634aa61755SAndy Ye } 6644aa61755SAndy Ye }; 6654aa61755SAndy Ye TEEC_UUID *TeecUuid = &tempuuid; 6664aa61755SAndy Ye TEEC_Operation TeecOperation = {0}; 6673251364cSHisping Lin struct blk_desc *dev_desc; 6683251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 6696651d4c0SJason Zhu if (!dev_desc) { 6706651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 6716651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 6726651d4c0SJason Zhu } 6734aa61755SAndy Ye 674f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 675f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 676f4e1db95SHisping Lin return TeecResult; 6774aa61755SAndy Ye 6784aa61755SAndy Ye TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 679f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 680f4e1db95SHisping Lin return TeecResult; 6814aa61755SAndy Ye 6823251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 6833251364cSHisping Lin TEEC_NONE, 6843251364cSHisping Lin TEEC_NONE, 6853251364cSHisping Lin TEEC_NONE); 6863251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 687b9a7e756SHisping Lin if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0) 688b9a7e756SHisping Lin TeecOperation.params[0].value.a = 1; 689b9a7e756SHisping Lin else 690b9a7e756SHisping Lin TeecOperation.params[0].value.a = 0; 691b9a7e756SHisping Lin 6923251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 6933251364cSHisping Lin TeecOperation.params[0].value.a = 0; 6943251364cSHisping Lin #endif 6953251364cSHisping Lin 6964aa61755SAndy Ye TeecResult = TEEC_OpenSession(&TeecContext, 6974aa61755SAndy Ye &TeecSession, 6984aa61755SAndy Ye TeecUuid, 6994aa61755SAndy Ye TEEC_LOGIN_PUBLIC, 7004aa61755SAndy Ye NULL, 7013251364cSHisping Lin &TeecOperation, 7024aa61755SAndy Ye &ErrorOrigin); 703f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 704f4e1db95SHisping Lin return TeecResult; 7054aa61755SAndy Ye 7064aa61755SAndy Ye TEEC_SharedMemory SharedMem0 = {0}; 7074aa61755SAndy Ye 7084aa61755SAndy Ye SharedMem0.size = *uuid_size; 7094aa61755SAndy Ye SharedMem0.flags = 0; 7104aa61755SAndy Ye 7114aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 712f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 713f4e1db95SHisping Lin goto exit; 7144aa61755SAndy Ye 7154aa61755SAndy Ye TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 7164aa61755SAndy Ye TeecOperation.params[0].tmpref.size = SharedMem0.size; 7174aa61755SAndy Ye 7184aa61755SAndy Ye TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, 7194aa61755SAndy Ye TEEC_NONE, 7204aa61755SAndy Ye TEEC_NONE, 7214aa61755SAndy Ye TEEC_NONE); 7224aa61755SAndy Ye 7234aa61755SAndy Ye TeecResult = TEEC_InvokeCommand(&TeecSession, 7244aa61755SAndy Ye 144, 7254aa61755SAndy Ye &TeecOperation, 7264aa61755SAndy Ye &ErrorOrigin); 727f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 728f4e1db95SHisping Lin goto exit; 7294aa61755SAndy Ye 7304aa61755SAndy Ye *uuid_size = TeecOperation.params[0].tmpref.size; 7314aa61755SAndy Ye memcpy(uuid, SharedMem0.buffer, SharedMem0.size); 732f4e1db95SHisping Lin exit: 7334aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem0); 7344aa61755SAndy Ye TEEC_CloseSession(&TeecSession); 735f4e1db95SHisping Lin TEEC_FinalizeContext(&TeecContext); 7364aa61755SAndy Ye 7374aa61755SAndy Ye return TeecResult; 7384aa61755SAndy Ye } 7394aa61755SAndy Ye 7404aa61755SAndy Ye uint32_t trusty_attest_get_ca(uint8_t *operation_start, 7414aa61755SAndy Ye uint32_t *operation_size, 7424aa61755SAndy Ye uint8_t *out, 7434aa61755SAndy Ye uint32_t *out_len) 7444aa61755SAndy Ye { 7454aa61755SAndy Ye TEEC_Result TeecResult; 7464aa61755SAndy Ye TEEC_Context TeecContext; 7474aa61755SAndy Ye TEEC_Session TeecSession; 7484aa61755SAndy Ye uint32_t ErrorOrigin; 7494aa61755SAndy Ye 7504aa61755SAndy Ye TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6, 7514aa61755SAndy Ye { 0xa8, 0x69, 0x9c, 0xe6, 7524aa61755SAndy Ye 0x88, 0x6c, 0x5d, 0x5d 7534aa61755SAndy Ye } 7544aa61755SAndy Ye }; 7554aa61755SAndy Ye 7564aa61755SAndy Ye TEEC_UUID *TeecUuid = &tempuuid; 7574aa61755SAndy Ye TEEC_Operation TeecOperation = {0}; 7583251364cSHisping Lin struct blk_desc *dev_desc; 7593251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 7606651d4c0SJason Zhu if (!dev_desc) { 7616651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 7626651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 7636651d4c0SJason Zhu } 7644aa61755SAndy Ye 765f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 766f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 767f4e1db95SHisping Lin return TeecResult; 7684aa61755SAndy Ye 7694aa61755SAndy Ye TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 770f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 771f4e1db95SHisping Lin return TeecResult; 7724aa61755SAndy Ye 7733251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 7743251364cSHisping Lin TEEC_NONE, 7753251364cSHisping Lin TEEC_NONE, 7763251364cSHisping Lin TEEC_NONE); 7773251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 778b9a7e756SHisping Lin if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0) 779b9a7e756SHisping Lin TeecOperation.params[0].value.a = 1; 780b9a7e756SHisping Lin else 781b9a7e756SHisping Lin TeecOperation.params[0].value.a = 0; 782b9a7e756SHisping Lin 7833251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 7843251364cSHisping Lin TeecOperation.params[0].value.a = 0; 7853251364cSHisping Lin #endif 7863251364cSHisping Lin 7874aa61755SAndy Ye TeecResult = TEEC_OpenSession(&TeecContext, 7884aa61755SAndy Ye &TeecSession, 7894aa61755SAndy Ye TeecUuid, 7904aa61755SAndy Ye TEEC_LOGIN_PUBLIC, 7914aa61755SAndy Ye NULL, 7923251364cSHisping Lin &TeecOperation, 7934aa61755SAndy Ye &ErrorOrigin); 794f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 795f4e1db95SHisping Lin return TeecResult; 7964aa61755SAndy Ye 7974aa61755SAndy Ye TEEC_SharedMemory SharedMem0 = {0}; 7984aa61755SAndy Ye 7994aa61755SAndy Ye SharedMem0.size = *operation_size; 8004aa61755SAndy Ye SharedMem0.flags = 0; 8014aa61755SAndy Ye 8024aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 803f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 804f4e1db95SHisping Lin goto exit; 8054aa61755SAndy Ye 8064aa61755SAndy Ye memcpy(SharedMem0.buffer, operation_start, SharedMem0.size); 8074aa61755SAndy Ye 8084aa61755SAndy Ye TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 8094aa61755SAndy Ye TeecOperation.params[0].tmpref.size = SharedMem0.size; 8104aa61755SAndy Ye 8114aa61755SAndy Ye TEEC_SharedMemory SharedMem1 = {0}; 8124aa61755SAndy Ye 8134aa61755SAndy Ye SharedMem1.size = *out_len; 8144aa61755SAndy Ye SharedMem1.flags = 0; 8154aa61755SAndy Ye 8164aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 817f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 818f4e1db95SHisping Lin goto exit; 8194aa61755SAndy Ye 8204aa61755SAndy Ye TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 8214aa61755SAndy Ye TeecOperation.params[1].tmpref.size = SharedMem1.size; 8224aa61755SAndy Ye 8234aa61755SAndy Ye TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, 8244aa61755SAndy Ye TEEC_MEMREF_TEMP_INOUT, 8254aa61755SAndy Ye TEEC_NONE, 8264aa61755SAndy Ye TEEC_NONE); 8274aa61755SAndy Ye 8284aa61755SAndy Ye TeecResult = TEEC_InvokeCommand(&TeecSession, 8294aa61755SAndy Ye 145, 8304aa61755SAndy Ye &TeecOperation, 8314aa61755SAndy Ye &ErrorOrigin); 832f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 833f4e1db95SHisping Lin goto exit; 8344aa61755SAndy Ye 8354aa61755SAndy Ye *out_len = TeecOperation.params[1].tmpref.size; 8364aa61755SAndy Ye memcpy(out, SharedMem1.buffer, SharedMem1.size); 837f4e1db95SHisping Lin exit: 8384aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem0); 8394aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem1); 840f4e1db95SHisping Lin TEEC_CloseSession(&TeecSession); 841f4e1db95SHisping Lin TEEC_FinalizeContext(&TeecContext); 8424aa61755SAndy Ye 8434aa61755SAndy Ye return TeecResult; 8444aa61755SAndy Ye } 8454aa61755SAndy Ye 8464aa61755SAndy Ye uint32_t trusty_attest_set_ca(uint8_t *ca_response, uint32_t *ca_response_size) 8474aa61755SAndy Ye { 8484aa61755SAndy Ye TEEC_Result TeecResult; 8494aa61755SAndy Ye TEEC_Context TeecContext; 8504aa61755SAndy Ye TEEC_Session TeecSession; 8514aa61755SAndy Ye uint32_t ErrorOrigin; 8524aa61755SAndy Ye TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6, 8534aa61755SAndy Ye { 0xa8, 0x69, 0x9c, 0xe6, 8544aa61755SAndy Ye 0x88, 0x6c, 0x5d, 0x5d 8554aa61755SAndy Ye } 8564aa61755SAndy Ye }; 8574aa61755SAndy Ye TEEC_UUID *TeecUuid = &tempuuid; 8584aa61755SAndy Ye TEEC_Operation TeecOperation = {0}; 8593251364cSHisping Lin struct blk_desc *dev_desc; 8603251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 8616651d4c0SJason Zhu if (!dev_desc) { 8626651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 8636651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 8646651d4c0SJason Zhu } 865f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 866f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 867f4e1db95SHisping Lin return TeecResult; 8684aa61755SAndy Ye 8694aa61755SAndy Ye TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 870f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 871f4e1db95SHisping Lin return TeecResult; 8724aa61755SAndy Ye 8733251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 8743251364cSHisping Lin TEEC_NONE, 8753251364cSHisping Lin TEEC_NONE, 8763251364cSHisping Lin TEEC_NONE); 8773251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 878b9a7e756SHisping Lin if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0) 879b9a7e756SHisping Lin TeecOperation.params[0].value.a = 1; 880b9a7e756SHisping Lin else 881b9a7e756SHisping Lin TeecOperation.params[0].value.a = 0; 882b9a7e756SHisping Lin 8833251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 8843251364cSHisping Lin TeecOperation.params[0].value.a = 0; 8853251364cSHisping Lin #endif 8863251364cSHisping Lin 8874aa61755SAndy Ye TeecResult = TEEC_OpenSession(&TeecContext, 8884aa61755SAndy Ye &TeecSession, 8894aa61755SAndy Ye TeecUuid, 8904aa61755SAndy Ye TEEC_LOGIN_PUBLIC, 8914aa61755SAndy Ye NULL, 8923251364cSHisping Lin &TeecOperation, 8934aa61755SAndy Ye &ErrorOrigin); 894f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 895f4e1db95SHisping Lin return TeecResult; 8964aa61755SAndy Ye 8974aa61755SAndy Ye TEEC_SharedMemory SharedMem0 = {0}; 8984aa61755SAndy Ye 8994aa61755SAndy Ye SharedMem0.size = *ca_response_size; 9004aa61755SAndy Ye SharedMem0.flags = 0; 9014aa61755SAndy Ye 9024aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 903f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 904f4e1db95SHisping Lin goto exit; 9054aa61755SAndy Ye 9064aa61755SAndy Ye memcpy(SharedMem0.buffer, ca_response, SharedMem0.size); 9074aa61755SAndy Ye 9084aa61755SAndy Ye TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 9094aa61755SAndy Ye TeecOperation.params[0].tmpref.size = SharedMem0.size; 9104aa61755SAndy Ye 9114aa61755SAndy Ye TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, 9124aa61755SAndy Ye TEEC_NONE, 9134aa61755SAndy Ye TEEC_NONE, 9144aa61755SAndy Ye TEEC_NONE); 9154aa61755SAndy Ye 9164aa61755SAndy Ye TeecResult = TEEC_InvokeCommand(&TeecSession, 9174aa61755SAndy Ye 146, 9184aa61755SAndy Ye &TeecOperation, 9194aa61755SAndy Ye &ErrorOrigin); 920f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 921f4e1db95SHisping Lin goto exit; 922f4e1db95SHisping Lin exit: 9234aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem0); 9244aa61755SAndy Ye TEEC_CloseSession(&TeecSession); 925f4e1db95SHisping Lin TEEC_FinalizeContext(&TeecContext); 9264aa61755SAndy Ye 9274aa61755SAndy Ye return TeecResult; 9284aa61755SAndy Ye } 929