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 23*1ef63c75SHisping Lin #define STORAGE_CMD_WRITE_TA_ENCRYPTION_KEY 9 24ae8ec5e1SHisping Lin 25ae8ec5e1SHisping Lin static uint8_t b2hs_add_base(uint8_t in) 26ae8ec5e1SHisping Lin { 27ae8ec5e1SHisping Lin if (in > 9) 28ae8ec5e1SHisping Lin return in + 55; 29ae8ec5e1SHisping Lin else 30ae8ec5e1SHisping Lin return in + 48; 31ae8ec5e1SHisping Lin } 32ae8ec5e1SHisping Lin 33c7de5349SHisping Lin static uint32_t b2hs(uint8_t *b, uint8_t *hs, uint32_t blen, uint32_t hslen) 34ae8ec5e1SHisping Lin { 35ae8ec5e1SHisping Lin uint32_t i = 0; 36ae8ec5e1SHisping Lin 37ae8ec5e1SHisping Lin if (blen * 2 + 1 > hslen) 38ae8ec5e1SHisping Lin return 0; 39ae8ec5e1SHisping Lin 40ae8ec5e1SHisping Lin for (; i < blen; i++) { 41ae8ec5e1SHisping Lin hs[i * 2 + 1] = b2hs_add_base(b[i] & 0xf); 42ae8ec5e1SHisping Lin hs[i * 2] = b2hs_add_base(b[i] >> 4); 43ae8ec5e1SHisping Lin } 44ae8ec5e1SHisping Lin hs[blen * 2] = 0; 45ae8ec5e1SHisping Lin 46ae8ec5e1SHisping Lin return blen * 2; 47ae8ec5e1SHisping Lin } 48ae8ec5e1SHisping Lin 49c7de5349SHisping Lin static uint32_t trusty_base_write_security_data(char *filename, 50c7de5349SHisping Lin uint32_t filename_size, 51c7de5349SHisping Lin uint8_t *data, 52c7de5349SHisping Lin uint32_t data_size) 53ae8ec5e1SHisping Lin { 54ae8ec5e1SHisping Lin TEEC_Result TeecResult; 55ae8ec5e1SHisping Lin TEEC_Context TeecContext; 56ae8ec5e1SHisping Lin TEEC_Session TeecSession; 57ae8ec5e1SHisping Lin uint32_t ErrorOrigin; 58ae8ec5e1SHisping Lin TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 59ae8ec5e1SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 60ae8ec5e1SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 61ae8ec5e1SHisping Lin TEEC_Operation TeecOperation = {0}; 623251364cSHisping Lin struct blk_desc *dev_desc; 633251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 646651d4c0SJason Zhu if (!dev_desc) { 656651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 666651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 676651d4c0SJason Zhu } 683251364cSHisping Lin 69f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 70f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 71f4e1db95SHisping Lin return TeecResult; 72ae8ec5e1SHisping Lin 73ae8ec5e1SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 74f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 75f4e1db95SHisping Lin return TeecResult; 76ae8ec5e1SHisping Lin 773251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 783251364cSHisping Lin TEEC_NONE, 793251364cSHisping Lin TEEC_NONE, 803251364cSHisping Lin TEEC_NONE); 813251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 82b9a7e756SHisping Lin if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0) 83b9a7e756SHisping Lin TeecOperation.params[0].value.a = 1; 84b9a7e756SHisping Lin else 85b9a7e756SHisping Lin TeecOperation.params[0].value.a = 0; 863251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 873251364cSHisping Lin TeecOperation.params[0].value.a = 0; 883251364cSHisping Lin #endif 893251364cSHisping Lin 90ae8ec5e1SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 91ae8ec5e1SHisping Lin &TeecSession, 92ae8ec5e1SHisping Lin TeecUuid, 93ae8ec5e1SHisping Lin TEEC_LOGIN_PUBLIC, 94ae8ec5e1SHisping Lin NULL, 953251364cSHisping Lin &TeecOperation, 96ae8ec5e1SHisping Lin &ErrorOrigin); 97f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 98f4e1db95SHisping Lin return TeecResult; 99ae8ec5e1SHisping Lin 100ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 101ae8ec5e1SHisping Lin 102c7de5349SHisping Lin SharedMem0.size = filename_size; 103ae8ec5e1SHisping Lin SharedMem0.flags = 0; 104ae8ec5e1SHisping Lin 105ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 106f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 107f4e1db95SHisping Lin goto exit; 108ae8ec5e1SHisping Lin 109c7de5349SHisping Lin memcpy(SharedMem0.buffer, filename, SharedMem0.size); 110ae8ec5e1SHisping Lin 111ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem1 = {0}; 112ae8ec5e1SHisping Lin 113c7de5349SHisping Lin SharedMem1.size = data_size; 114c7de5349SHisping Lin SharedMem1.flags = 0; 115c7de5349SHisping Lin 116c7de5349SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 117c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 118c7de5349SHisping Lin goto exit; 119c7de5349SHisping Lin 120c7de5349SHisping Lin memcpy(SharedMem1.buffer, data, SharedMem1.size); 121c7de5349SHisping Lin 122c7de5349SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 123c7de5349SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 124c7de5349SHisping Lin 125c7de5349SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 126c7de5349SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem1.size; 127c7de5349SHisping Lin 128c7de5349SHisping Lin 129c7de5349SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 130c7de5349SHisping Lin TEEC_MEMREF_TEMP_INOUT, 131c7de5349SHisping Lin TEEC_NONE, 132c7de5349SHisping Lin TEEC_NONE); 133c7de5349SHisping Lin 134c7de5349SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 135c7de5349SHisping Lin 1, 136c7de5349SHisping Lin &TeecOperation, 137c7de5349SHisping Lin &ErrorOrigin); 138c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 139c7de5349SHisping Lin goto exit; 140c7de5349SHisping Lin exit: 141c7de5349SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 142c7de5349SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem1); 143c7de5349SHisping Lin TEEC_CloseSession(&TeecSession); 144c7de5349SHisping Lin TEEC_FinalizeContext(&TeecContext); 145c7de5349SHisping Lin 146c7de5349SHisping Lin return TeecResult; 147c7de5349SHisping Lin } 148c7de5349SHisping Lin 149c7de5349SHisping Lin static uint32_t trusty_base_read_security_data(char *filename, 150c7de5349SHisping Lin uint32_t filename_size, 151c7de5349SHisping Lin uint8_t *data, 152c7de5349SHisping Lin uint32_t data_size) 153c7de5349SHisping Lin { 154c7de5349SHisping Lin TEEC_Result TeecResult; 155c7de5349SHisping Lin TEEC_Context TeecContext; 156c7de5349SHisping Lin TEEC_Session TeecSession; 157c7de5349SHisping Lin uint32_t ErrorOrigin; 158c7de5349SHisping Lin TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 159c7de5349SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 160c7de5349SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 161c7de5349SHisping Lin TEEC_Operation TeecOperation = {0}; 162c7de5349SHisping Lin 163c7de5349SHisping Lin struct blk_desc *dev_desc; 164c7de5349SHisping Lin dev_desc = rockchip_get_bootdev(); 165c7de5349SHisping Lin if (!dev_desc) { 166c7de5349SHisping Lin printf("%s: dev_desc is NULL!\n", __func__); 167c7de5349SHisping Lin return -TEEC_ERROR_GENERIC; 168c7de5349SHisping Lin } 169c7de5349SHisping Lin 170c7de5349SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 171c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 172c7de5349SHisping Lin return TeecResult; 173c7de5349SHisping Lin 174c7de5349SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 175c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 176c7de5349SHisping Lin return TeecResult; 177c7de5349SHisping Lin 178c7de5349SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 179c7de5349SHisping Lin TEEC_NONE, 180c7de5349SHisping Lin TEEC_NONE, 181c7de5349SHisping Lin TEEC_NONE); 182c7de5349SHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 183c7de5349SHisping Lin if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0) 184c7de5349SHisping Lin TeecOperation.params[0].value.a = 1; 185c7de5349SHisping Lin else 186c7de5349SHisping Lin TeecOperation.params[0].value.a = 0; 187c7de5349SHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 188c7de5349SHisping Lin TeecOperation.params[0].value.a = 0; 189c7de5349SHisping Lin #endif 190c7de5349SHisping Lin 191c7de5349SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 192c7de5349SHisping Lin &TeecSession, 193c7de5349SHisping Lin TeecUuid, 194c7de5349SHisping Lin TEEC_LOGIN_PUBLIC, 195c7de5349SHisping Lin NULL, 196c7de5349SHisping Lin &TeecOperation, 197c7de5349SHisping Lin &ErrorOrigin); 198c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 199c7de5349SHisping Lin return TeecResult; 200c7de5349SHisping Lin 201c7de5349SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 202c7de5349SHisping Lin 203c7de5349SHisping Lin SharedMem0.size = filename_size; 204c7de5349SHisping Lin SharedMem0.flags = 0; 205c7de5349SHisping Lin 206c7de5349SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 207c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 208c7de5349SHisping Lin goto exit; 209c7de5349SHisping Lin 210c7de5349SHisping Lin memcpy(SharedMem0.buffer, filename, SharedMem0.size); 211c7de5349SHisping Lin 212c7de5349SHisping Lin TEEC_SharedMemory SharedMem1 = {0}; 213c7de5349SHisping Lin 214c7de5349SHisping Lin SharedMem1.size = data_size; 215ae8ec5e1SHisping Lin SharedMem1.flags = 0; 216ae8ec5e1SHisping Lin 217ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 218f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 219f4e1db95SHisping Lin goto exit; 220ae8ec5e1SHisping Lin 221ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 222ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 223ae8ec5e1SHisping Lin 224ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 225ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem1.size; 226ae8ec5e1SHisping Lin 227ae8ec5e1SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 228ae8ec5e1SHisping Lin TEEC_MEMREF_TEMP_INOUT, 229ae8ec5e1SHisping Lin TEEC_NONE, 230ae8ec5e1SHisping Lin TEEC_NONE); 231ae8ec5e1SHisping Lin 232ae8ec5e1SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 233ae8ec5e1SHisping Lin 0, 234ae8ec5e1SHisping Lin &TeecOperation, 235ae8ec5e1SHisping Lin &ErrorOrigin); 23646b2a054SHisping Lin if (TeecResult == TEEC_SUCCESS) 237c7de5349SHisping Lin memcpy(data, SharedMem1.buffer, SharedMem1.size); 238f4e1db95SHisping Lin exit: 239ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 240ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem1); 241ae8ec5e1SHisping Lin TEEC_CloseSession(&TeecSession); 24246b2a054SHisping Lin TEEC_FinalizeContext(&TeecContext); 243ae8ec5e1SHisping Lin 244ae8ec5e1SHisping Lin return TeecResult; 245ae8ec5e1SHisping Lin } 246ae8ec5e1SHisping Lin 247c7de5349SHisping Lin static uint32_t trusty_base_end_security_data(void) 248c7de5349SHisping Lin { 249c7de5349SHisping Lin TEEC_Result TeecResult; 250c7de5349SHisping Lin TEEC_Context TeecContext; 251c7de5349SHisping Lin TEEC_Session TeecSession; 252c7de5349SHisping Lin uint32_t ErrorOrigin; 253c7de5349SHisping Lin TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 254c7de5349SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 255c7de5349SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 256c7de5349SHisping Lin TEEC_Operation TeecOperation = {0}; 257c7de5349SHisping Lin 258c7de5349SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 259c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 260c7de5349SHisping Lin return TeecResult; 261c7de5349SHisping Lin 262c7de5349SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 263c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 264c7de5349SHisping Lin return TeecResult; 265c7de5349SHisping Lin 266c7de5349SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 267c7de5349SHisping Lin &TeecSession, 268c7de5349SHisping Lin TeecUuid, 269c7de5349SHisping Lin TEEC_LOGIN_PUBLIC, 270c7de5349SHisping Lin NULL, 271c7de5349SHisping Lin NULL, 272c7de5349SHisping Lin &ErrorOrigin); 273c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 274c7de5349SHisping Lin return TeecResult; 275c7de5349SHisping Lin 276c7de5349SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE, 277c7de5349SHisping Lin TEEC_NONE, 278c7de5349SHisping Lin TEEC_NONE, 279c7de5349SHisping Lin TEEC_NONE); 280c7de5349SHisping Lin 281c7de5349SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 282c7de5349SHisping Lin 2, 283c7de5349SHisping Lin &TeecOperation, 284c7de5349SHisping Lin &ErrorOrigin); 285c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 286c7de5349SHisping Lin goto exit; 287c7de5349SHisping Lin exit: 288c7de5349SHisping Lin TEEC_CloseSession(&TeecSession); 289c7de5349SHisping Lin TEEC_FinalizeContext(&TeecContext); 290c7de5349SHisping Lin 291c7de5349SHisping Lin return TeecResult; 292c7de5349SHisping Lin } 293c7de5349SHisping Lin 294c7de5349SHisping Lin uint32_t trusty_read_rollback_index(uint32_t slot, uint64_t *value) 295c7de5349SHisping Lin { 296c7de5349SHisping Lin char hs[9]; 297c7de5349SHisping Lin 298c7de5349SHisping Lin b2hs((uint8_t *)&slot, (uint8_t *)hs, 4, 9); 299c7de5349SHisping Lin 300c7de5349SHisping Lin return trusty_base_read_security_data(hs, 8, (uint8_t *)value, 8); 301c7de5349SHisping Lin } 302c7de5349SHisping Lin 303ae8ec5e1SHisping Lin uint32_t trusty_write_rollback_index(uint32_t slot, uint64_t value) 304ae8ec5e1SHisping Lin { 305c7de5349SHisping Lin char hs[9]; 3063251364cSHisping Lin 307c7de5349SHisping Lin b2hs((uint8_t *)&slot, (uint8_t *)hs, 4, 9); 308ae8ec5e1SHisping Lin 309c7de5349SHisping Lin return trusty_base_write_security_data(hs, 8, (uint8_t *)&value, 8); 310ae8ec5e1SHisping Lin } 311ae8ec5e1SHisping Lin 312ae8ec5e1SHisping Lin uint32_t trusty_read_permanent_attributes(uint8_t *attributes, uint32_t size) 313ae8ec5e1SHisping Lin { 314c7de5349SHisping Lin return trusty_base_read_security_data("attributes", 315c7de5349SHisping Lin sizeof("attributes"), attributes, size); 316ae8ec5e1SHisping Lin } 317ae8ec5e1SHisping Lin 318ae8ec5e1SHisping Lin uint32_t trusty_write_permanent_attributes(uint8_t *attributes, uint32_t size) 319ae8ec5e1SHisping Lin { 320c7de5349SHisping Lin return trusty_base_write_security_data("attributes", 321c7de5349SHisping Lin sizeof("attributes"), attributes, size); 3226651d4c0SJason Zhu } 323ae8ec5e1SHisping Lin 324c7de5349SHisping Lin uint32_t trusty_read_permanent_attributes_flag(uint8_t *attributes) 325c7de5349SHisping Lin { 326c7de5349SHisping Lin return trusty_base_read_security_data("attributes_flag", 327c7de5349SHisping Lin sizeof("attributes_flag"), attributes, 1); 328c7de5349SHisping Lin } 329ae8ec5e1SHisping Lin 330c7de5349SHisping Lin uint32_t trusty_write_permanent_attributes_flag(uint8_t attributes) 331c7de5349SHisping Lin { 332c7de5349SHisping Lin return trusty_base_write_security_data("attributes_flag", 333c7de5349SHisping Lin sizeof("attributes_flag"), &attributes, 1); 334ae8ec5e1SHisping Lin } 335ae8ec5e1SHisping Lin 336564654ebSJason Zhu uint32_t trusty_read_permanent_attributes_cer(uint8_t *attributes, 337564654ebSJason Zhu uint32_t size) 338564654ebSJason Zhu { 339c7de5349SHisping Lin return trusty_base_read_security_data("rsacer", 340c7de5349SHisping Lin sizeof("rsacer"), attributes, size); 341564654ebSJason Zhu } 342564654ebSJason Zhu 343564654ebSJason Zhu uint32_t trusty_write_permanent_attributes_cer(uint8_t *attributes, 344564654ebSJason Zhu uint32_t size) 345564654ebSJason Zhu { 346c7de5349SHisping Lin return trusty_base_write_security_data("rsacer", 347c7de5349SHisping Lin sizeof("rsacer"), attributes, size); 348564654ebSJason Zhu } 349564654ebSJason Zhu 350ae8ec5e1SHisping Lin uint32_t trusty_read_lock_state(uint8_t *lock_state) 351ae8ec5e1SHisping Lin { 352c7de5349SHisping Lin return trusty_base_read_security_data("lock_state", 353c7de5349SHisping Lin sizeof("lock_state"), lock_state, 1); 354ae8ec5e1SHisping Lin } 355ae8ec5e1SHisping Lin 356ae8ec5e1SHisping Lin uint32_t trusty_write_lock_state(uint8_t lock_state) 357ae8ec5e1SHisping Lin { 358c7de5349SHisping Lin return trusty_base_write_security_data("lock_state", 359c7de5349SHisping Lin sizeof("lock_state"), &lock_state, 1); 360ae8ec5e1SHisping Lin } 361ae8ec5e1SHisping Lin 362ae8ec5e1SHisping Lin uint32_t trusty_read_flash_lock_state(uint8_t *flash_lock_state) 363ae8ec5e1SHisping Lin { 364c7de5349SHisping Lin return trusty_base_read_security_data("flash_lock_state", 365c7de5349SHisping Lin sizeof("flash_lock_state"), flash_lock_state, 1); 366c7de5349SHisping Lin } 367c7de5349SHisping Lin 368c7de5349SHisping Lin uint32_t trusty_write_flash_lock_state(uint8_t flash_lock_state) 369c7de5349SHisping Lin { 370c7de5349SHisping Lin return trusty_base_write_security_data("flash_lock_state", 371c7de5349SHisping Lin sizeof("flash_lock_state"), &flash_lock_state, 1); 372c7de5349SHisping Lin } 373c7de5349SHisping Lin 374c7de5349SHisping Lin static uint32_t trusty_base_end_efuse_or_otp(void) 375c7de5349SHisping Lin { 376ae8ec5e1SHisping Lin TEEC_Result TeecResult; 377ae8ec5e1SHisping Lin TEEC_Context TeecContext; 378ae8ec5e1SHisping Lin TEEC_Session TeecSession; 379ae8ec5e1SHisping Lin uint32_t ErrorOrigin; 380c7de5349SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 381c7de5349SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 382c7de5349SHisping Lin 383ae8ec5e1SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 384ae8ec5e1SHisping Lin TEEC_Operation TeecOperation = {0}; 385ae8ec5e1SHisping Lin 386f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 387f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 388f4e1db95SHisping Lin return TeecResult; 389ae8ec5e1SHisping Lin 390ae8ec5e1SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 391f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 392f4e1db95SHisping Lin return TeecResult; 393ae8ec5e1SHisping Lin 394ae8ec5e1SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 395ae8ec5e1SHisping Lin &TeecSession, 396ae8ec5e1SHisping Lin TeecUuid, 397ae8ec5e1SHisping Lin TEEC_LOGIN_PUBLIC, 398ae8ec5e1SHisping Lin NULL, 399c7de5349SHisping Lin NULL, 400ae8ec5e1SHisping Lin &ErrorOrigin); 401f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 402f4e1db95SHisping Lin return TeecResult; 403ae8ec5e1SHisping Lin 404c7de5349SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE, 405c7de5349SHisping Lin TEEC_NONE, 406ae8ec5e1SHisping Lin TEEC_NONE, 407ae8ec5e1SHisping Lin TEEC_NONE); 408ae8ec5e1SHisping Lin 409ae8ec5e1SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 410c7de5349SHisping Lin STORAGE_CMD_UBOOT_END_OTP, 411ae8ec5e1SHisping Lin &TeecOperation, 412ae8ec5e1SHisping Lin &ErrorOrigin); 413c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 414c7de5349SHisping Lin goto exit; 415f4e1db95SHisping Lin exit: 416ae8ec5e1SHisping Lin TEEC_CloseSession(&TeecSession); 41746b2a054SHisping Lin TEEC_FinalizeContext(&TeecContext); 418ae8ec5e1SHisping Lin 419ae8ec5e1SHisping Lin return TeecResult; 420ae8ec5e1SHisping Lin } 421ae8ec5e1SHisping Lin 422c7de5349SHisping Lin static uint32_t trusty_base_efuse_or_otp_operation(uint32_t cmd, 423c7de5349SHisping Lin uint8_t is_write, 424c7de5349SHisping Lin uint32_t *buf, 425c7de5349SHisping Lin uint32_t length) 426ae8ec5e1SHisping Lin { 427ae8ec5e1SHisping Lin TEEC_Result TeecResult; 428ae8ec5e1SHisping Lin TEEC_Context TeecContext; 429ae8ec5e1SHisping Lin TEEC_Session TeecSession; 430ae8ec5e1SHisping Lin uint32_t ErrorOrigin; 431c7de5349SHisping Lin 432c7de5349SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 433c7de5349SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 434ae8ec5e1SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 435ae8ec5e1SHisping Lin TEEC_Operation TeecOperation = {0}; 436ae8ec5e1SHisping Lin 437f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 438f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 439f4e1db95SHisping Lin return TeecResult; 440ae8ec5e1SHisping Lin 441ae8ec5e1SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 442f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 443f4e1db95SHisping Lin return TeecResult; 444ae8ec5e1SHisping Lin 445ae8ec5e1SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 446ae8ec5e1SHisping Lin &TeecSession, 447ae8ec5e1SHisping Lin TeecUuid, 448ae8ec5e1SHisping Lin TEEC_LOGIN_PUBLIC, 449ae8ec5e1SHisping Lin NULL, 450c7de5349SHisping Lin NULL, 451ae8ec5e1SHisping Lin &ErrorOrigin); 452f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 453f4e1db95SHisping Lin return TeecResult; 454ae8ec5e1SHisping Lin 455ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 456ae8ec5e1SHisping Lin 457c7de5349SHisping Lin SharedMem0.size = length * sizeof(uint32_t); 458ae8ec5e1SHisping Lin SharedMem0.flags = 0; 459ae8ec5e1SHisping Lin 460ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 461f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 462f4e1db95SHisping Lin goto exit; 463ae8ec5e1SHisping Lin 464ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 465ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 466ae8ec5e1SHisping Lin 467c7de5349SHisping Lin if (is_write) { 468c7de5349SHisping Lin memcpy(SharedMem0.buffer, buf, SharedMem0.size); 469ae8ec5e1SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 470c7de5349SHisping Lin TEEC_NONE, 471ae8ec5e1SHisping Lin TEEC_NONE, 472ae8ec5e1SHisping Lin TEEC_NONE); 473ae8ec5e1SHisping Lin 474c7de5349SHisping Lin } else { 475c7de5349SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT, 476c7de5349SHisping Lin TEEC_NONE, 477c7de5349SHisping Lin TEEC_NONE, 478c7de5349SHisping Lin TEEC_NONE); 479c7de5349SHisping Lin } 480c7de5349SHisping Lin 481ae8ec5e1SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 482c7de5349SHisping Lin cmd, 483ae8ec5e1SHisping Lin &TeecOperation, 484ae8ec5e1SHisping Lin &ErrorOrigin); 485f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 486f4e1db95SHisping Lin goto exit; 487c7de5349SHisping Lin 488c7de5349SHisping Lin if (!is_write) 489c7de5349SHisping Lin memcpy(buf, SharedMem0.buffer, SharedMem0.size); 490c7de5349SHisping Lin 491f4e1db95SHisping Lin exit: 492ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 493ae8ec5e1SHisping Lin TEEC_CloseSession(&TeecSession); 49446b2a054SHisping Lin TEEC_FinalizeContext(&TeecContext); 495ae8ec5e1SHisping Lin 496ae8ec5e1SHisping Lin return TeecResult; 497ae8ec5e1SHisping Lin } 498ae8ec5e1SHisping Lin 4996ef445a4SHisping Lin uint32_t trusty_read_attribute_hash(uint32_t *buf, uint32_t length) 5006ef445a4SHisping Lin { 501c7de5349SHisping Lin return trusty_base_efuse_or_otp_operation(STORAGE_CMD_READ_ATTRIBUTE_HASH, 502c7de5349SHisping Lin false, buf, length); 5036ef445a4SHisping Lin } 5046ef445a4SHisping Lin 5056ef445a4SHisping Lin uint32_t trusty_write_attribute_hash(uint32_t *buf, uint32_t length) 5066ef445a4SHisping Lin { 507c7de5349SHisping Lin return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_ATTRIBUTE_HASH, 508c7de5349SHisping Lin true, buf, length); 50916539616SHisping Lin } 51016539616SHisping Lin 51116539616SHisping Lin uint32_t trusty_notify_optee_uboot_end(void) 51216539616SHisping Lin { 51316539616SHisping Lin TEEC_Result res; 514c7de5349SHisping Lin 515c7de5349SHisping Lin res = trusty_base_end_security_data(); 516c7de5349SHisping Lin res |= trusty_base_end_efuse_or_otp(); 51716539616SHisping Lin return res; 51816539616SHisping Lin } 5192cd27853SHisping Lin 5202cd27853SHisping Lin uint32_t trusty_read_vbootkey_hash(uint32_t *buf, uint32_t length) 5212cd27853SHisping Lin { 522c7de5349SHisping Lin return trusty_base_efuse_or_otp_operation(STORAGE_CMD_READ_VBOOTKEY_HASH, 523c7de5349SHisping Lin false, buf, length); 5242cd27853SHisping Lin } 525c7de5349SHisping Lin 5262cd27853SHisping Lin uint32_t trusty_write_vbootkey_hash(uint32_t *buf, uint32_t length) 5272cd27853SHisping Lin { 528c7de5349SHisping Lin return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_VBOOTKEY_HASH, 529c7de5349SHisping Lin true, buf, length); 5302cd27853SHisping Lin } 531095e2a82SHisping Lin 532468df3b2SHisping Lin uint32_t trusty_read_vbootkey_enable_flag(uint8_t *flag) 533468df3b2SHisping Lin { 534468df3b2SHisping Lin uint32_t bootflag; 535c7de5349SHisping Lin TEEC_Result TeecResult; 536468df3b2SHisping Lin 537c7de5349SHisping Lin TeecResult = trusty_base_efuse_or_otp_operation(STORAGE_CMD_READ_ENABLE_FLAG, 538c7de5349SHisping Lin false, &bootflag, 1); 539468df3b2SHisping Lin 540468df3b2SHisping Lin if (TeecResult == TEEC_SUCCESS) { 5410202ee8aSHisping Lin #if defined(CONFIG_ROCKCHIP_RK3288) 5420202ee8aSHisping Lin if (bootflag == 0x00000001) 5430202ee8aSHisping Lin *flag = 1; 5440202ee8aSHisping Lin #else 545468df3b2SHisping Lin if (bootflag == 0x000000FF) 546468df3b2SHisping Lin *flag = 1; 5470202ee8aSHisping Lin #endif 548468df3b2SHisping Lin } 549095e2a82SHisping Lin return TeecResult; 550095e2a82SHisping Lin } 5514aa61755SAndy Ye 552*1ef63c75SHisping Lin uint32_t trusty_write_ta_encryption_key(uint32_t *buf, uint32_t length) 553*1ef63c75SHisping Lin { 554*1ef63c75SHisping Lin return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_TA_ENCRYPTION_KEY, 555*1ef63c75SHisping Lin true, buf, length); 556*1ef63c75SHisping Lin } 557*1ef63c75SHisping Lin 5584aa61755SAndy Ye uint32_t trusty_attest_dh(uint8_t *dh, uint32_t *dh_size) 5594aa61755SAndy Ye { 5604aa61755SAndy Ye TEEC_Result TeecResult; 5614aa61755SAndy Ye TEEC_Context TeecContext; 5624aa61755SAndy Ye TEEC_Session TeecSession; 5634aa61755SAndy Ye uint32_t ErrorOrigin; 5644aa61755SAndy Ye TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6, 5654aa61755SAndy Ye { 0xa8, 0x69, 0x9c, 0xe6, 5664aa61755SAndy Ye 0x88, 0x6c, 0x5d, 0x5d 5674aa61755SAndy Ye } 5684aa61755SAndy Ye }; 5694aa61755SAndy Ye TEEC_UUID *TeecUuid = &tempuuid; 5704aa61755SAndy Ye TEEC_Operation TeecOperation = {0}; 5713251364cSHisping Lin struct blk_desc *dev_desc; 5723251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 5736651d4c0SJason Zhu if (!dev_desc) { 5746651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 5756651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 5766651d4c0SJason Zhu } 5774aa61755SAndy Ye 578f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 579f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 580f4e1db95SHisping Lin return TeecResult; 5814aa61755SAndy Ye 5824aa61755SAndy Ye TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 583f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 584f4e1db95SHisping Lin return TeecResult; 5854aa61755SAndy Ye 5863251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 5873251364cSHisping Lin TEEC_NONE, 5883251364cSHisping Lin TEEC_NONE, 5893251364cSHisping Lin TEEC_NONE); 5903251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 591b9a7e756SHisping Lin if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0) 592b9a7e756SHisping Lin TeecOperation.params[0].value.a = 1; 593b9a7e756SHisping Lin else 594b9a7e756SHisping Lin TeecOperation.params[0].value.a = 0; 595b9a7e756SHisping Lin 5963251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 5973251364cSHisping Lin TeecOperation.params[0].value.a = 0; 5983251364cSHisping Lin #endif 5993251364cSHisping Lin 6004aa61755SAndy Ye TeecResult = TEEC_OpenSession(&TeecContext, 6014aa61755SAndy Ye &TeecSession, 6024aa61755SAndy Ye TeecUuid, 6034aa61755SAndy Ye TEEC_LOGIN_PUBLIC, 6044aa61755SAndy Ye NULL, 6053251364cSHisping Lin &TeecOperation, 6064aa61755SAndy Ye &ErrorOrigin); 607f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 608f4e1db95SHisping Lin return TeecResult; 6094aa61755SAndy Ye 6104aa61755SAndy Ye TEEC_SharedMemory SharedMem0 = {0}; 6114aa61755SAndy Ye 6124aa61755SAndy Ye SharedMem0.size = *dh_size; 6134aa61755SAndy Ye SharedMem0.flags = 0; 6144aa61755SAndy Ye 6154aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 616f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 617f4e1db95SHisping Lin goto exit; 6184aa61755SAndy Ye 6194aa61755SAndy Ye TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 6204aa61755SAndy Ye TeecOperation.params[0].tmpref.size = SharedMem0.size; 6214aa61755SAndy Ye 6224aa61755SAndy Ye TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, 6234aa61755SAndy Ye TEEC_NONE, 6244aa61755SAndy Ye TEEC_NONE, 6254aa61755SAndy Ye TEEC_NONE); 6264aa61755SAndy Ye 6274aa61755SAndy Ye TeecResult = TEEC_InvokeCommand(&TeecSession, 6284aa61755SAndy Ye 143, 6294aa61755SAndy Ye &TeecOperation, 6304aa61755SAndy Ye &ErrorOrigin); 631f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 632f4e1db95SHisping Lin goto exit; 6334aa61755SAndy Ye 6344aa61755SAndy Ye *dh_size = TeecOperation.params[0].tmpref.size; 6354aa61755SAndy Ye memcpy(dh, SharedMem0.buffer, SharedMem0.size); 636f4e1db95SHisping Lin exit: 6374aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem0); 6384aa61755SAndy Ye TEEC_CloseSession(&TeecSession); 639f4e1db95SHisping Lin TEEC_FinalizeContext(&TeecContext); 6404aa61755SAndy Ye 6414aa61755SAndy Ye return TeecResult; 6424aa61755SAndy Ye } 6434aa61755SAndy Ye 6444aa61755SAndy Ye uint32_t trusty_attest_uuid(uint8_t *uuid, uint32_t *uuid_size) 6454aa61755SAndy Ye { 6464aa61755SAndy Ye TEEC_Result TeecResult; 6474aa61755SAndy Ye TEEC_Context TeecContext; 6484aa61755SAndy Ye TEEC_Session TeecSession; 6494aa61755SAndy Ye uint32_t ErrorOrigin; 6504aa61755SAndy Ye TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6, 6514aa61755SAndy Ye { 0xa8, 0x69, 0x9c, 0xe6, 6524aa61755SAndy Ye 0x88, 0x6c, 0x5d, 0x5d 6534aa61755SAndy Ye } 6544aa61755SAndy Ye }; 6554aa61755SAndy Ye TEEC_UUID *TeecUuid = &tempuuid; 6564aa61755SAndy Ye TEEC_Operation TeecOperation = {0}; 6573251364cSHisping Lin struct blk_desc *dev_desc; 6583251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 6596651d4c0SJason Zhu if (!dev_desc) { 6606651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 6616651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 6626651d4c0SJason Zhu } 6634aa61755SAndy Ye 664f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 665f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 666f4e1db95SHisping Lin return TeecResult; 6674aa61755SAndy Ye 6684aa61755SAndy Ye TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 669f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 670f4e1db95SHisping Lin return TeecResult; 6714aa61755SAndy Ye 6723251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 6733251364cSHisping Lin TEEC_NONE, 6743251364cSHisping Lin TEEC_NONE, 6753251364cSHisping Lin TEEC_NONE); 6763251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 677b9a7e756SHisping Lin if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0) 678b9a7e756SHisping Lin TeecOperation.params[0].value.a = 1; 679b9a7e756SHisping Lin else 680b9a7e756SHisping Lin TeecOperation.params[0].value.a = 0; 681b9a7e756SHisping Lin 6823251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 6833251364cSHisping Lin TeecOperation.params[0].value.a = 0; 6843251364cSHisping Lin #endif 6853251364cSHisping Lin 6864aa61755SAndy Ye TeecResult = TEEC_OpenSession(&TeecContext, 6874aa61755SAndy Ye &TeecSession, 6884aa61755SAndy Ye TeecUuid, 6894aa61755SAndy Ye TEEC_LOGIN_PUBLIC, 6904aa61755SAndy Ye NULL, 6913251364cSHisping Lin &TeecOperation, 6924aa61755SAndy Ye &ErrorOrigin); 693f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 694f4e1db95SHisping Lin return TeecResult; 6954aa61755SAndy Ye 6964aa61755SAndy Ye TEEC_SharedMemory SharedMem0 = {0}; 6974aa61755SAndy Ye 6984aa61755SAndy Ye SharedMem0.size = *uuid_size; 6994aa61755SAndy Ye SharedMem0.flags = 0; 7004aa61755SAndy Ye 7014aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 702f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 703f4e1db95SHisping Lin goto exit; 7044aa61755SAndy Ye 7054aa61755SAndy Ye TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 7064aa61755SAndy Ye TeecOperation.params[0].tmpref.size = SharedMem0.size; 7074aa61755SAndy Ye 7084aa61755SAndy Ye TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, 7094aa61755SAndy Ye TEEC_NONE, 7104aa61755SAndy Ye TEEC_NONE, 7114aa61755SAndy Ye TEEC_NONE); 7124aa61755SAndy Ye 7134aa61755SAndy Ye TeecResult = TEEC_InvokeCommand(&TeecSession, 7144aa61755SAndy Ye 144, 7154aa61755SAndy Ye &TeecOperation, 7164aa61755SAndy Ye &ErrorOrigin); 717f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 718f4e1db95SHisping Lin goto exit; 7194aa61755SAndy Ye 7204aa61755SAndy Ye *uuid_size = TeecOperation.params[0].tmpref.size; 7214aa61755SAndy Ye memcpy(uuid, SharedMem0.buffer, SharedMem0.size); 722f4e1db95SHisping Lin exit: 7234aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem0); 7244aa61755SAndy Ye TEEC_CloseSession(&TeecSession); 725f4e1db95SHisping Lin TEEC_FinalizeContext(&TeecContext); 7264aa61755SAndy Ye 7274aa61755SAndy Ye return TeecResult; 7284aa61755SAndy Ye } 7294aa61755SAndy Ye 7304aa61755SAndy Ye uint32_t trusty_attest_get_ca(uint8_t *operation_start, 7314aa61755SAndy Ye uint32_t *operation_size, 7324aa61755SAndy Ye uint8_t *out, 7334aa61755SAndy Ye uint32_t *out_len) 7344aa61755SAndy Ye { 7354aa61755SAndy Ye TEEC_Result TeecResult; 7364aa61755SAndy Ye TEEC_Context TeecContext; 7374aa61755SAndy Ye TEEC_Session TeecSession; 7384aa61755SAndy Ye uint32_t ErrorOrigin; 7394aa61755SAndy Ye 7404aa61755SAndy Ye TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6, 7414aa61755SAndy Ye { 0xa8, 0x69, 0x9c, 0xe6, 7424aa61755SAndy Ye 0x88, 0x6c, 0x5d, 0x5d 7434aa61755SAndy Ye } 7444aa61755SAndy Ye }; 7454aa61755SAndy Ye 7464aa61755SAndy Ye TEEC_UUID *TeecUuid = &tempuuid; 7474aa61755SAndy Ye TEEC_Operation TeecOperation = {0}; 7483251364cSHisping Lin struct blk_desc *dev_desc; 7493251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 7506651d4c0SJason Zhu if (!dev_desc) { 7516651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 7526651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 7536651d4c0SJason Zhu } 7544aa61755SAndy Ye 755f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 756f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 757f4e1db95SHisping Lin return TeecResult; 7584aa61755SAndy Ye 7594aa61755SAndy Ye TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 760f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 761f4e1db95SHisping Lin return TeecResult; 7624aa61755SAndy Ye 7633251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 7643251364cSHisping Lin TEEC_NONE, 7653251364cSHisping Lin TEEC_NONE, 7663251364cSHisping Lin TEEC_NONE); 7673251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 768b9a7e756SHisping Lin if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0) 769b9a7e756SHisping Lin TeecOperation.params[0].value.a = 1; 770b9a7e756SHisping Lin else 771b9a7e756SHisping Lin TeecOperation.params[0].value.a = 0; 772b9a7e756SHisping Lin 7733251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 7743251364cSHisping Lin TeecOperation.params[0].value.a = 0; 7753251364cSHisping Lin #endif 7763251364cSHisping Lin 7774aa61755SAndy Ye TeecResult = TEEC_OpenSession(&TeecContext, 7784aa61755SAndy Ye &TeecSession, 7794aa61755SAndy Ye TeecUuid, 7804aa61755SAndy Ye TEEC_LOGIN_PUBLIC, 7814aa61755SAndy Ye NULL, 7823251364cSHisping Lin &TeecOperation, 7834aa61755SAndy Ye &ErrorOrigin); 784f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 785f4e1db95SHisping Lin return TeecResult; 7864aa61755SAndy Ye 7874aa61755SAndy Ye TEEC_SharedMemory SharedMem0 = {0}; 7884aa61755SAndy Ye 7894aa61755SAndy Ye SharedMem0.size = *operation_size; 7904aa61755SAndy Ye SharedMem0.flags = 0; 7914aa61755SAndy Ye 7924aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 793f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 794f4e1db95SHisping Lin goto exit; 7954aa61755SAndy Ye 7964aa61755SAndy Ye memcpy(SharedMem0.buffer, operation_start, SharedMem0.size); 7974aa61755SAndy Ye 7984aa61755SAndy Ye TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 7994aa61755SAndy Ye TeecOperation.params[0].tmpref.size = SharedMem0.size; 8004aa61755SAndy Ye 8014aa61755SAndy Ye TEEC_SharedMemory SharedMem1 = {0}; 8024aa61755SAndy Ye 8034aa61755SAndy Ye SharedMem1.size = *out_len; 8044aa61755SAndy Ye SharedMem1.flags = 0; 8054aa61755SAndy Ye 8064aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 807f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 808f4e1db95SHisping Lin goto exit; 8094aa61755SAndy Ye 8104aa61755SAndy Ye TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 8114aa61755SAndy Ye TeecOperation.params[1].tmpref.size = SharedMem1.size; 8124aa61755SAndy Ye 8134aa61755SAndy Ye TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, 8144aa61755SAndy Ye TEEC_MEMREF_TEMP_INOUT, 8154aa61755SAndy Ye TEEC_NONE, 8164aa61755SAndy Ye TEEC_NONE); 8174aa61755SAndy Ye 8184aa61755SAndy Ye TeecResult = TEEC_InvokeCommand(&TeecSession, 8194aa61755SAndy Ye 145, 8204aa61755SAndy Ye &TeecOperation, 8214aa61755SAndy Ye &ErrorOrigin); 822f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 823f4e1db95SHisping Lin goto exit; 8244aa61755SAndy Ye 8254aa61755SAndy Ye *out_len = TeecOperation.params[1].tmpref.size; 8264aa61755SAndy Ye memcpy(out, SharedMem1.buffer, SharedMem1.size); 827f4e1db95SHisping Lin exit: 8284aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem0); 8294aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem1); 830f4e1db95SHisping Lin TEEC_CloseSession(&TeecSession); 831f4e1db95SHisping Lin TEEC_FinalizeContext(&TeecContext); 8324aa61755SAndy Ye 8334aa61755SAndy Ye return TeecResult; 8344aa61755SAndy Ye } 8354aa61755SAndy Ye 8364aa61755SAndy Ye uint32_t trusty_attest_set_ca(uint8_t *ca_response, uint32_t *ca_response_size) 8374aa61755SAndy Ye { 8384aa61755SAndy Ye TEEC_Result TeecResult; 8394aa61755SAndy Ye TEEC_Context TeecContext; 8404aa61755SAndy Ye TEEC_Session TeecSession; 8414aa61755SAndy Ye uint32_t ErrorOrigin; 8424aa61755SAndy Ye TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6, 8434aa61755SAndy Ye { 0xa8, 0x69, 0x9c, 0xe6, 8444aa61755SAndy Ye 0x88, 0x6c, 0x5d, 0x5d 8454aa61755SAndy Ye } 8464aa61755SAndy Ye }; 8474aa61755SAndy Ye TEEC_UUID *TeecUuid = &tempuuid; 8484aa61755SAndy Ye TEEC_Operation TeecOperation = {0}; 8493251364cSHisping Lin struct blk_desc *dev_desc; 8503251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 8516651d4c0SJason Zhu if (!dev_desc) { 8526651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 8536651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 8546651d4c0SJason Zhu } 855f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 856f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 857f4e1db95SHisping Lin return TeecResult; 8584aa61755SAndy Ye 8594aa61755SAndy Ye TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 860f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 861f4e1db95SHisping Lin return TeecResult; 8624aa61755SAndy Ye 8633251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 8643251364cSHisping Lin TEEC_NONE, 8653251364cSHisping Lin TEEC_NONE, 8663251364cSHisping Lin TEEC_NONE); 8673251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 868b9a7e756SHisping Lin if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0) 869b9a7e756SHisping Lin TeecOperation.params[0].value.a = 1; 870b9a7e756SHisping Lin else 871b9a7e756SHisping Lin TeecOperation.params[0].value.a = 0; 872b9a7e756SHisping Lin 8733251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 8743251364cSHisping Lin TeecOperation.params[0].value.a = 0; 8753251364cSHisping Lin #endif 8763251364cSHisping Lin 8774aa61755SAndy Ye TeecResult = TEEC_OpenSession(&TeecContext, 8784aa61755SAndy Ye &TeecSession, 8794aa61755SAndy Ye TeecUuid, 8804aa61755SAndy Ye TEEC_LOGIN_PUBLIC, 8814aa61755SAndy Ye NULL, 8823251364cSHisping Lin &TeecOperation, 8834aa61755SAndy Ye &ErrorOrigin); 884f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 885f4e1db95SHisping Lin return TeecResult; 8864aa61755SAndy Ye 8874aa61755SAndy Ye TEEC_SharedMemory SharedMem0 = {0}; 8884aa61755SAndy Ye 8894aa61755SAndy Ye SharedMem0.size = *ca_response_size; 8904aa61755SAndy Ye SharedMem0.flags = 0; 8914aa61755SAndy Ye 8924aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 893f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 894f4e1db95SHisping Lin goto exit; 8954aa61755SAndy Ye 8964aa61755SAndy Ye memcpy(SharedMem0.buffer, ca_response, SharedMem0.size); 8974aa61755SAndy Ye 8984aa61755SAndy Ye TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 8994aa61755SAndy Ye TeecOperation.params[0].tmpref.size = SharedMem0.size; 9004aa61755SAndy Ye 9014aa61755SAndy Ye TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, 9024aa61755SAndy Ye TEEC_NONE, 9034aa61755SAndy Ye TEEC_NONE, 9044aa61755SAndy Ye TEEC_NONE); 9054aa61755SAndy Ye 9064aa61755SAndy Ye TeecResult = TEEC_InvokeCommand(&TeecSession, 9074aa61755SAndy Ye 146, 9084aa61755SAndy Ye &TeecOperation, 9094aa61755SAndy Ye &ErrorOrigin); 910f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 911f4e1db95SHisping Lin goto exit; 912f4e1db95SHisping Lin exit: 9134aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem0); 9144aa61755SAndy Ye TEEC_CloseSession(&TeecSession); 915f4e1db95SHisping Lin TEEC_FinalizeContext(&TeecContext); 9164aa61755SAndy Ye 9174aa61755SAndy Ye return TeecResult; 9184aa61755SAndy Ye } 919