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 24fbf29bfbSHisping Lin #define STORAGE_CMD_CHECK_SECURITY_LEVEL_FLAG 10 25f39d4289SHisping Lin #define STORAGE_CMD_WRITE_OEM_HUK 11 26ae8ec5e1SHisping Lin 27ae8ec5e1SHisping Lin static uint8_t b2hs_add_base(uint8_t in) 28ae8ec5e1SHisping Lin { 29ae8ec5e1SHisping Lin if (in > 9) 30ae8ec5e1SHisping Lin return in + 55; 31ae8ec5e1SHisping Lin else 32ae8ec5e1SHisping Lin return in + 48; 33ae8ec5e1SHisping Lin } 34ae8ec5e1SHisping Lin 35c7de5349SHisping Lin static uint32_t b2hs(uint8_t *b, uint8_t *hs, uint32_t blen, uint32_t hslen) 36ae8ec5e1SHisping Lin { 37ae8ec5e1SHisping Lin uint32_t i = 0; 38ae8ec5e1SHisping Lin 39ae8ec5e1SHisping Lin if (blen * 2 + 1 > hslen) 40ae8ec5e1SHisping Lin return 0; 41ae8ec5e1SHisping Lin 42ae8ec5e1SHisping Lin for (; i < blen; i++) { 43ae8ec5e1SHisping Lin hs[i * 2 + 1] = b2hs_add_base(b[i] & 0xf); 44ae8ec5e1SHisping Lin hs[i * 2] = b2hs_add_base(b[i] >> 4); 45ae8ec5e1SHisping Lin } 46ae8ec5e1SHisping Lin hs[blen * 2] = 0; 47ae8ec5e1SHisping Lin 48ae8ec5e1SHisping Lin return blen * 2; 49ae8ec5e1SHisping Lin } 50ae8ec5e1SHisping Lin 51c7de5349SHisping Lin static uint32_t trusty_base_write_security_data(char *filename, 52c7de5349SHisping Lin uint32_t filename_size, 53c7de5349SHisping Lin uint8_t *data, 54c7de5349SHisping Lin uint32_t data_size) 55ae8ec5e1SHisping Lin { 56ae8ec5e1SHisping Lin TEEC_Result TeecResult; 57ae8ec5e1SHisping Lin TEEC_Context TeecContext; 58ae8ec5e1SHisping Lin TEEC_Session TeecSession; 59ae8ec5e1SHisping Lin uint32_t ErrorOrigin; 60ae8ec5e1SHisping Lin TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 61ae8ec5e1SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 62ae8ec5e1SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 63ae8ec5e1SHisping Lin TEEC_Operation TeecOperation = {0}; 643251364cSHisping Lin struct blk_desc *dev_desc; 653251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 666651d4c0SJason Zhu if (!dev_desc) { 676651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 686651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 696651d4c0SJason Zhu } 703251364cSHisping Lin 71f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 72f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 73f4e1db95SHisping Lin return TeecResult; 74ae8ec5e1SHisping Lin 75ae8ec5e1SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 76f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 77f4e1db95SHisping Lin return TeecResult; 78ae8ec5e1SHisping Lin 793251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 803251364cSHisping Lin TEEC_NONE, 813251364cSHisping Lin TEEC_NONE, 823251364cSHisping Lin TEEC_NONE); 833251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 84b9a7e756SHisping Lin if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0) 85b9a7e756SHisping Lin TeecOperation.params[0].value.a = 1; 86b9a7e756SHisping Lin else 87b9a7e756SHisping Lin TeecOperation.params[0].value.a = 0; 883251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 893251364cSHisping Lin TeecOperation.params[0].value.a = 0; 903251364cSHisping Lin #endif 913251364cSHisping Lin 92ae8ec5e1SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 93ae8ec5e1SHisping Lin &TeecSession, 94ae8ec5e1SHisping Lin TeecUuid, 95ae8ec5e1SHisping Lin TEEC_LOGIN_PUBLIC, 96ae8ec5e1SHisping Lin NULL, 973251364cSHisping Lin &TeecOperation, 98ae8ec5e1SHisping Lin &ErrorOrigin); 99f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 100f4e1db95SHisping Lin return TeecResult; 101ae8ec5e1SHisping Lin 102ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 103ae8ec5e1SHisping Lin 104c7de5349SHisping Lin SharedMem0.size = filename_size; 105ae8ec5e1SHisping Lin SharedMem0.flags = 0; 106ae8ec5e1SHisping Lin 107ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 108f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 109f4e1db95SHisping Lin goto exit; 110ae8ec5e1SHisping Lin 111c7de5349SHisping Lin memcpy(SharedMem0.buffer, filename, SharedMem0.size); 112ae8ec5e1SHisping Lin 113ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem1 = {0}; 114ae8ec5e1SHisping Lin 115c7de5349SHisping Lin SharedMem1.size = data_size; 116c7de5349SHisping Lin SharedMem1.flags = 0; 117c7de5349SHisping Lin 118c7de5349SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 119c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 120c7de5349SHisping Lin goto exit; 121c7de5349SHisping Lin 122c7de5349SHisping Lin memcpy(SharedMem1.buffer, data, SharedMem1.size); 123c7de5349SHisping Lin 124c7de5349SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 125c7de5349SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 126c7de5349SHisping Lin 127c7de5349SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 128c7de5349SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem1.size; 129c7de5349SHisping Lin 130c7de5349SHisping Lin 131c7de5349SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 132c7de5349SHisping Lin TEEC_MEMREF_TEMP_INOUT, 133c7de5349SHisping Lin TEEC_NONE, 134c7de5349SHisping Lin TEEC_NONE); 135c7de5349SHisping Lin 136c7de5349SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 137c7de5349SHisping Lin 1, 138c7de5349SHisping Lin &TeecOperation, 139c7de5349SHisping Lin &ErrorOrigin); 140c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 141c7de5349SHisping Lin goto exit; 142c7de5349SHisping Lin exit: 143c7de5349SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 144c7de5349SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem1); 145c7de5349SHisping Lin TEEC_CloseSession(&TeecSession); 146c7de5349SHisping Lin TEEC_FinalizeContext(&TeecContext); 147c7de5349SHisping Lin 148c7de5349SHisping Lin return TeecResult; 149c7de5349SHisping Lin } 150c7de5349SHisping Lin 151c7de5349SHisping Lin static uint32_t trusty_base_read_security_data(char *filename, 152c7de5349SHisping Lin uint32_t filename_size, 153c7de5349SHisping Lin uint8_t *data, 154c7de5349SHisping Lin uint32_t data_size) 155c7de5349SHisping Lin { 156c7de5349SHisping Lin TEEC_Result TeecResult; 157c7de5349SHisping Lin TEEC_Context TeecContext; 158c7de5349SHisping Lin TEEC_Session TeecSession; 159c7de5349SHisping Lin uint32_t ErrorOrigin; 160c7de5349SHisping Lin TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 161c7de5349SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 162c7de5349SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 163c7de5349SHisping Lin TEEC_Operation TeecOperation = {0}; 164c7de5349SHisping Lin 165c7de5349SHisping Lin struct blk_desc *dev_desc; 166c7de5349SHisping Lin dev_desc = rockchip_get_bootdev(); 167c7de5349SHisping Lin if (!dev_desc) { 168c7de5349SHisping Lin printf("%s: dev_desc is NULL!\n", __func__); 169c7de5349SHisping Lin return -TEEC_ERROR_GENERIC; 170c7de5349SHisping Lin } 171c7de5349SHisping Lin 172c7de5349SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 173c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 174c7de5349SHisping Lin return TeecResult; 175c7de5349SHisping Lin 176c7de5349SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 177c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 178c7de5349SHisping Lin return TeecResult; 179c7de5349SHisping Lin 180c7de5349SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 181c7de5349SHisping Lin TEEC_NONE, 182c7de5349SHisping Lin TEEC_NONE, 183c7de5349SHisping Lin TEEC_NONE); 184c7de5349SHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 185c7de5349SHisping Lin if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0) 186c7de5349SHisping Lin TeecOperation.params[0].value.a = 1; 187c7de5349SHisping Lin else 188c7de5349SHisping Lin TeecOperation.params[0].value.a = 0; 189c7de5349SHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 190c7de5349SHisping Lin TeecOperation.params[0].value.a = 0; 191c7de5349SHisping Lin #endif 192c7de5349SHisping Lin 193c7de5349SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 194c7de5349SHisping Lin &TeecSession, 195c7de5349SHisping Lin TeecUuid, 196c7de5349SHisping Lin TEEC_LOGIN_PUBLIC, 197c7de5349SHisping Lin NULL, 198c7de5349SHisping Lin &TeecOperation, 199c7de5349SHisping Lin &ErrorOrigin); 200c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 201c7de5349SHisping Lin return TeecResult; 202c7de5349SHisping Lin 203c7de5349SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 204c7de5349SHisping Lin 205c7de5349SHisping Lin SharedMem0.size = filename_size; 206c7de5349SHisping Lin SharedMem0.flags = 0; 207c7de5349SHisping Lin 208c7de5349SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 209c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 210c7de5349SHisping Lin goto exit; 211c7de5349SHisping Lin 212c7de5349SHisping Lin memcpy(SharedMem0.buffer, filename, SharedMem0.size); 213c7de5349SHisping Lin 214c7de5349SHisping Lin TEEC_SharedMemory SharedMem1 = {0}; 215c7de5349SHisping Lin 216c7de5349SHisping Lin SharedMem1.size = data_size; 217ae8ec5e1SHisping Lin SharedMem1.flags = 0; 218ae8ec5e1SHisping Lin 219ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 220f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 221f4e1db95SHisping Lin goto exit; 222ae8ec5e1SHisping Lin 223ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 224ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 225ae8ec5e1SHisping Lin 226ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 227ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem1.size; 228ae8ec5e1SHisping Lin 229ae8ec5e1SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 230ae8ec5e1SHisping Lin TEEC_MEMREF_TEMP_INOUT, 231ae8ec5e1SHisping Lin TEEC_NONE, 232ae8ec5e1SHisping Lin TEEC_NONE); 233ae8ec5e1SHisping Lin 234ae8ec5e1SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 235ae8ec5e1SHisping Lin 0, 236ae8ec5e1SHisping Lin &TeecOperation, 237ae8ec5e1SHisping Lin &ErrorOrigin); 23846b2a054SHisping Lin if (TeecResult == TEEC_SUCCESS) 239c7de5349SHisping Lin memcpy(data, SharedMem1.buffer, SharedMem1.size); 240f4e1db95SHisping Lin exit: 241ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 242ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem1); 243ae8ec5e1SHisping Lin TEEC_CloseSession(&TeecSession); 24446b2a054SHisping Lin TEEC_FinalizeContext(&TeecContext); 245ae8ec5e1SHisping Lin 246ae8ec5e1SHisping Lin return TeecResult; 247ae8ec5e1SHisping Lin } 248ae8ec5e1SHisping Lin 249c7de5349SHisping Lin static uint32_t trusty_base_end_security_data(void) 250c7de5349SHisping Lin { 251c7de5349SHisping Lin TEEC_Result TeecResult; 252c7de5349SHisping Lin TEEC_Context TeecContext; 253c7de5349SHisping Lin TEEC_Session TeecSession; 254c7de5349SHisping Lin uint32_t ErrorOrigin; 255c7de5349SHisping Lin TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 256c7de5349SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 257c7de5349SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 258c7de5349SHisping Lin TEEC_Operation TeecOperation = {0}; 259c7de5349SHisping Lin 260c7de5349SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 261c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 262c7de5349SHisping Lin return TeecResult; 263c7de5349SHisping Lin 264c7de5349SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 265c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 266c7de5349SHisping Lin return TeecResult; 267c7de5349SHisping Lin 268c7de5349SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 269c7de5349SHisping Lin &TeecSession, 270c7de5349SHisping Lin TeecUuid, 271c7de5349SHisping Lin TEEC_LOGIN_PUBLIC, 272c7de5349SHisping Lin NULL, 273c7de5349SHisping Lin NULL, 274c7de5349SHisping Lin &ErrorOrigin); 275c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 276c7de5349SHisping Lin return TeecResult; 277c7de5349SHisping Lin 278c7de5349SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE, 279c7de5349SHisping Lin TEEC_NONE, 280c7de5349SHisping Lin TEEC_NONE, 281c7de5349SHisping Lin TEEC_NONE); 282c7de5349SHisping Lin 283c7de5349SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 284c7de5349SHisping Lin 2, 285c7de5349SHisping Lin &TeecOperation, 286c7de5349SHisping Lin &ErrorOrigin); 287c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 288c7de5349SHisping Lin goto exit; 289c7de5349SHisping Lin exit: 290c7de5349SHisping Lin TEEC_CloseSession(&TeecSession); 291c7de5349SHisping Lin TEEC_FinalizeContext(&TeecContext); 292c7de5349SHisping Lin 293c7de5349SHisping Lin return TeecResult; 294c7de5349SHisping Lin } 295c7de5349SHisping Lin 296c7de5349SHisping Lin uint32_t trusty_read_rollback_index(uint32_t slot, uint64_t *value) 297c7de5349SHisping Lin { 298c7de5349SHisping Lin char hs[9]; 299c7de5349SHisping Lin 300c7de5349SHisping Lin b2hs((uint8_t *)&slot, (uint8_t *)hs, 4, 9); 301c7de5349SHisping Lin 302c7de5349SHisping Lin return trusty_base_read_security_data(hs, 8, (uint8_t *)value, 8); 303c7de5349SHisping Lin } 304c7de5349SHisping Lin 305ae8ec5e1SHisping Lin uint32_t trusty_write_rollback_index(uint32_t slot, uint64_t value) 306ae8ec5e1SHisping Lin { 307c7de5349SHisping Lin char hs[9]; 3083251364cSHisping Lin 309c7de5349SHisping Lin b2hs((uint8_t *)&slot, (uint8_t *)hs, 4, 9); 310ae8ec5e1SHisping Lin 311c7de5349SHisping Lin return trusty_base_write_security_data(hs, 8, (uint8_t *)&value, 8); 312ae8ec5e1SHisping Lin } 313ae8ec5e1SHisping Lin 314ae8ec5e1SHisping Lin uint32_t trusty_read_permanent_attributes(uint8_t *attributes, uint32_t size) 315ae8ec5e1SHisping Lin { 316c7de5349SHisping Lin return trusty_base_read_security_data("attributes", 317c7de5349SHisping Lin sizeof("attributes"), attributes, size); 318ae8ec5e1SHisping Lin } 319ae8ec5e1SHisping Lin 320ae8ec5e1SHisping Lin uint32_t trusty_write_permanent_attributes(uint8_t *attributes, uint32_t size) 321ae8ec5e1SHisping Lin { 322c7de5349SHisping Lin return trusty_base_write_security_data("attributes", 323c7de5349SHisping Lin sizeof("attributes"), attributes, size); 3246651d4c0SJason Zhu } 325ae8ec5e1SHisping Lin 326c7de5349SHisping Lin uint32_t trusty_read_permanent_attributes_flag(uint8_t *attributes) 327c7de5349SHisping Lin { 328c7de5349SHisping Lin return trusty_base_read_security_data("attributes_flag", 329c7de5349SHisping Lin sizeof("attributes_flag"), attributes, 1); 330c7de5349SHisping Lin } 331ae8ec5e1SHisping Lin 332c7de5349SHisping Lin uint32_t trusty_write_permanent_attributes_flag(uint8_t attributes) 333c7de5349SHisping Lin { 334c7de5349SHisping Lin return trusty_base_write_security_data("attributes_flag", 335c7de5349SHisping Lin sizeof("attributes_flag"), &attributes, 1); 336ae8ec5e1SHisping Lin } 337ae8ec5e1SHisping Lin 338564654ebSJason Zhu uint32_t trusty_read_permanent_attributes_cer(uint8_t *attributes, 339564654ebSJason Zhu uint32_t size) 340564654ebSJason Zhu { 341c7de5349SHisping Lin return trusty_base_read_security_data("rsacer", 342c7de5349SHisping Lin sizeof("rsacer"), attributes, size); 343564654ebSJason Zhu } 344564654ebSJason Zhu 345564654ebSJason Zhu uint32_t trusty_write_permanent_attributes_cer(uint8_t *attributes, 346564654ebSJason Zhu uint32_t size) 347564654ebSJason Zhu { 348c7de5349SHisping Lin return trusty_base_write_security_data("rsacer", 349c7de5349SHisping Lin sizeof("rsacer"), attributes, size); 350564654ebSJason Zhu } 351564654ebSJason Zhu 352ae8ec5e1SHisping Lin uint32_t trusty_read_lock_state(uint8_t *lock_state) 353ae8ec5e1SHisping Lin { 354c7de5349SHisping Lin return trusty_base_read_security_data("lock_state", 355c7de5349SHisping Lin sizeof("lock_state"), lock_state, 1); 356ae8ec5e1SHisping Lin } 357ae8ec5e1SHisping Lin 358ae8ec5e1SHisping Lin uint32_t trusty_write_lock_state(uint8_t lock_state) 359ae8ec5e1SHisping Lin { 360c7de5349SHisping Lin return trusty_base_write_security_data("lock_state", 361c7de5349SHisping Lin sizeof("lock_state"), &lock_state, 1); 362ae8ec5e1SHisping Lin } 363ae8ec5e1SHisping Lin 364ae8ec5e1SHisping Lin uint32_t trusty_read_flash_lock_state(uint8_t *flash_lock_state) 365ae8ec5e1SHisping Lin { 366c7de5349SHisping Lin return trusty_base_read_security_data("flash_lock_state", 367c7de5349SHisping Lin sizeof("flash_lock_state"), flash_lock_state, 1); 368c7de5349SHisping Lin } 369c7de5349SHisping Lin 370c7de5349SHisping Lin uint32_t trusty_write_flash_lock_state(uint8_t flash_lock_state) 371c7de5349SHisping Lin { 372c7de5349SHisping Lin return trusty_base_write_security_data("flash_lock_state", 373c7de5349SHisping Lin sizeof("flash_lock_state"), &flash_lock_state, 1); 374c7de5349SHisping Lin } 375c7de5349SHisping Lin 376c7de5349SHisping Lin static uint32_t trusty_base_end_efuse_or_otp(void) 377c7de5349SHisping Lin { 378ae8ec5e1SHisping Lin TEEC_Result TeecResult; 379ae8ec5e1SHisping Lin TEEC_Context TeecContext; 380ae8ec5e1SHisping Lin TEEC_Session TeecSession; 381ae8ec5e1SHisping Lin uint32_t ErrorOrigin; 382c7de5349SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 383c7de5349SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 384c7de5349SHisping Lin 385ae8ec5e1SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 386ae8ec5e1SHisping Lin TEEC_Operation TeecOperation = {0}; 387ae8ec5e1SHisping Lin 388f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 389f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 390f4e1db95SHisping Lin return TeecResult; 391ae8ec5e1SHisping Lin 392ae8ec5e1SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 393f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 394f4e1db95SHisping Lin return TeecResult; 395ae8ec5e1SHisping Lin 396ae8ec5e1SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 397ae8ec5e1SHisping Lin &TeecSession, 398ae8ec5e1SHisping Lin TeecUuid, 399ae8ec5e1SHisping Lin TEEC_LOGIN_PUBLIC, 400ae8ec5e1SHisping Lin NULL, 401c7de5349SHisping Lin NULL, 402ae8ec5e1SHisping Lin &ErrorOrigin); 403f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 404f4e1db95SHisping Lin return TeecResult; 405ae8ec5e1SHisping Lin 406c7de5349SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE, 407c7de5349SHisping Lin TEEC_NONE, 408ae8ec5e1SHisping Lin TEEC_NONE, 409ae8ec5e1SHisping Lin TEEC_NONE); 410ae8ec5e1SHisping Lin 411ae8ec5e1SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 412c7de5349SHisping Lin STORAGE_CMD_UBOOT_END_OTP, 413ae8ec5e1SHisping Lin &TeecOperation, 414ae8ec5e1SHisping Lin &ErrorOrigin); 415c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 416c7de5349SHisping Lin goto exit; 417f4e1db95SHisping Lin exit: 418ae8ec5e1SHisping Lin TEEC_CloseSession(&TeecSession); 41946b2a054SHisping Lin TEEC_FinalizeContext(&TeecContext); 420ae8ec5e1SHisping Lin 421ae8ec5e1SHisping Lin return TeecResult; 422ae8ec5e1SHisping Lin } 423ae8ec5e1SHisping Lin 424c7de5349SHisping Lin static uint32_t trusty_base_efuse_or_otp_operation(uint32_t cmd, 425c7de5349SHisping Lin uint8_t is_write, 426c7de5349SHisping Lin uint32_t *buf, 427c7de5349SHisping Lin uint32_t length) 428ae8ec5e1SHisping Lin { 429ae8ec5e1SHisping Lin TEEC_Result TeecResult; 430ae8ec5e1SHisping Lin TEEC_Context TeecContext; 431ae8ec5e1SHisping Lin TEEC_Session TeecSession; 432ae8ec5e1SHisping Lin uint32_t ErrorOrigin; 433c7de5349SHisping Lin 434c7de5349SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 435c7de5349SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 436ae8ec5e1SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 437ae8ec5e1SHisping Lin TEEC_Operation TeecOperation = {0}; 438ae8ec5e1SHisping Lin 439f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 440f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 441f4e1db95SHisping Lin return TeecResult; 442ae8ec5e1SHisping Lin 443ae8ec5e1SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 444f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 445f4e1db95SHisping Lin return TeecResult; 446ae8ec5e1SHisping Lin 447ae8ec5e1SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 448ae8ec5e1SHisping Lin &TeecSession, 449ae8ec5e1SHisping Lin TeecUuid, 450ae8ec5e1SHisping Lin TEEC_LOGIN_PUBLIC, 451ae8ec5e1SHisping Lin NULL, 452c7de5349SHisping Lin NULL, 453ae8ec5e1SHisping Lin &ErrorOrigin); 454f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 455f4e1db95SHisping Lin return TeecResult; 456ae8ec5e1SHisping Lin 457ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 458ae8ec5e1SHisping Lin 459c7de5349SHisping Lin SharedMem0.size = length * sizeof(uint32_t); 460ae8ec5e1SHisping Lin SharedMem0.flags = 0; 461ae8ec5e1SHisping Lin 462ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 463f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 464f4e1db95SHisping Lin goto exit; 465ae8ec5e1SHisping Lin 466ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 467ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 468ae8ec5e1SHisping Lin 469c7de5349SHisping Lin if (is_write) { 470c7de5349SHisping Lin memcpy(SharedMem0.buffer, buf, SharedMem0.size); 471ae8ec5e1SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 472c7de5349SHisping Lin TEEC_NONE, 473ae8ec5e1SHisping Lin TEEC_NONE, 474ae8ec5e1SHisping Lin TEEC_NONE); 475ae8ec5e1SHisping Lin 476c7de5349SHisping Lin } else { 477c7de5349SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT, 478c7de5349SHisping Lin TEEC_NONE, 479c7de5349SHisping Lin TEEC_NONE, 480c7de5349SHisping Lin TEEC_NONE); 481c7de5349SHisping Lin } 482c7de5349SHisping Lin 483ae8ec5e1SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 484c7de5349SHisping Lin cmd, 485ae8ec5e1SHisping Lin &TeecOperation, 486ae8ec5e1SHisping Lin &ErrorOrigin); 487f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 488f4e1db95SHisping Lin goto exit; 489c7de5349SHisping Lin 490c7de5349SHisping Lin if (!is_write) 491c7de5349SHisping Lin memcpy(buf, SharedMem0.buffer, SharedMem0.size); 492c7de5349SHisping Lin 493f4e1db95SHisping Lin exit: 494ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 495ae8ec5e1SHisping Lin TEEC_CloseSession(&TeecSession); 49646b2a054SHisping Lin TEEC_FinalizeContext(&TeecContext); 497ae8ec5e1SHisping Lin 498ae8ec5e1SHisping Lin return TeecResult; 499ae8ec5e1SHisping Lin } 500ae8ec5e1SHisping Lin 5016ef445a4SHisping Lin uint32_t trusty_read_attribute_hash(uint32_t *buf, uint32_t length) 5026ef445a4SHisping Lin { 503c7de5349SHisping Lin return trusty_base_efuse_or_otp_operation(STORAGE_CMD_READ_ATTRIBUTE_HASH, 504c7de5349SHisping Lin false, buf, length); 5056ef445a4SHisping Lin } 5066ef445a4SHisping Lin 5076ef445a4SHisping Lin uint32_t trusty_write_attribute_hash(uint32_t *buf, uint32_t length) 5086ef445a4SHisping Lin { 509c7de5349SHisping Lin return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_ATTRIBUTE_HASH, 510c7de5349SHisping Lin true, buf, length); 51116539616SHisping Lin } 51216539616SHisping Lin 51316539616SHisping Lin uint32_t trusty_notify_optee_uboot_end(void) 51416539616SHisping Lin { 51516539616SHisping Lin TEEC_Result res; 516c7de5349SHisping Lin 517c7de5349SHisping Lin res = trusty_base_end_security_data(); 518c7de5349SHisping Lin res |= trusty_base_end_efuse_or_otp(); 51916539616SHisping Lin return res; 52016539616SHisping Lin } 5212cd27853SHisping Lin 5222cd27853SHisping Lin uint32_t trusty_read_vbootkey_hash(uint32_t *buf, uint32_t length) 5232cd27853SHisping Lin { 524c7de5349SHisping Lin return trusty_base_efuse_or_otp_operation(STORAGE_CMD_READ_VBOOTKEY_HASH, 525c7de5349SHisping Lin false, buf, length); 5262cd27853SHisping Lin } 527c7de5349SHisping Lin 5282cd27853SHisping Lin uint32_t trusty_write_vbootkey_hash(uint32_t *buf, uint32_t length) 5292cd27853SHisping Lin { 530c7de5349SHisping Lin return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_VBOOTKEY_HASH, 531c7de5349SHisping Lin true, buf, length); 5322cd27853SHisping Lin } 533095e2a82SHisping Lin 534468df3b2SHisping Lin uint32_t trusty_read_vbootkey_enable_flag(uint8_t *flag) 535468df3b2SHisping Lin { 536468df3b2SHisping Lin uint32_t bootflag; 537c7de5349SHisping Lin TEEC_Result TeecResult; 538468df3b2SHisping Lin 539c7de5349SHisping Lin TeecResult = trusty_base_efuse_or_otp_operation(STORAGE_CMD_READ_ENABLE_FLAG, 540c7de5349SHisping Lin false, &bootflag, 1); 541468df3b2SHisping Lin 542468df3b2SHisping Lin if (TeecResult == TEEC_SUCCESS) { 5430202ee8aSHisping Lin #if defined(CONFIG_ROCKCHIP_RK3288) 5440202ee8aSHisping Lin if (bootflag == 0x00000001) 5450202ee8aSHisping Lin *flag = 1; 5460202ee8aSHisping Lin #else 547468df3b2SHisping Lin if (bootflag == 0x000000FF) 548468df3b2SHisping Lin *flag = 1; 5490202ee8aSHisping Lin #endif 550468df3b2SHisping Lin } 551095e2a82SHisping Lin return TeecResult; 552095e2a82SHisping Lin } 5534aa61755SAndy Ye 5541ef63c75SHisping Lin uint32_t trusty_write_ta_encryption_key(uint32_t *buf, uint32_t length) 5551ef63c75SHisping Lin { 5561ef63c75SHisping Lin return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_TA_ENCRYPTION_KEY, 5571ef63c75SHisping Lin true, buf, length); 5581ef63c75SHisping Lin } 5591ef63c75SHisping Lin 560fbf29bfbSHisping Lin uint32_t trusty_check_security_level_flag(uint8_t flag) 561fbf29bfbSHisping Lin { 562fbf29bfbSHisping Lin uint32_t levelflag; 563fbf29bfbSHisping Lin 564fbf29bfbSHisping Lin levelflag = flag; 565fbf29bfbSHisping Lin return trusty_base_efuse_or_otp_operation(STORAGE_CMD_CHECK_SECURITY_LEVEL_FLAG, 566fbf29bfbSHisping Lin true, &levelflag, 1); 567fbf29bfbSHisping Lin } 568fbf29bfbSHisping Lin 569f39d4289SHisping Lin uint32_t trusty_write_oem_huk(uint32_t *buf, uint32_t length) 570f39d4289SHisping Lin { 571f39d4289SHisping Lin return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_OEM_HUK, 572f39d4289SHisping Lin true, buf, length); 573f39d4289SHisping Lin } 574f39d4289SHisping Lin 575*7504da74SHisping Lin void trusty_select_security_level(void) 576*7504da74SHisping Lin { 577*7504da74SHisping Lin #if (CONFIG_OPTEE_SECURITY_LEVEL > 0) 578*7504da74SHisping Lin TEEC_Result TeecResult; 579*7504da74SHisping Lin 580*7504da74SHisping Lin TeecResult = trusty_check_security_level_flag(CONFIG_OPTEE_SECURITY_LEVEL); 581*7504da74SHisping Lin if (TeecResult == TEE_ERROR_CANCEL) { 582*7504da74SHisping Lin run_command("download", 0); 583*7504da74SHisping Lin return; 584*7504da74SHisping Lin } 585*7504da74SHisping Lin 586*7504da74SHisping Lin if (TeecResult == TEEC_SUCCESS) 587*7504da74SHisping Lin debug("optee select security level success!"); 588*7504da74SHisping Lin else 589*7504da74SHisping Lin panic("optee select security level fail!"); 590*7504da74SHisping Lin 591*7504da74SHisping Lin return; 592*7504da74SHisping Lin #endif 593*7504da74SHisping Lin } 594*7504da74SHisping Lin 5954aa61755SAndy Ye uint32_t trusty_attest_dh(uint8_t *dh, uint32_t *dh_size) 5964aa61755SAndy Ye { 5974aa61755SAndy Ye TEEC_Result TeecResult; 5984aa61755SAndy Ye TEEC_Context TeecContext; 5994aa61755SAndy Ye TEEC_Session TeecSession; 6004aa61755SAndy Ye uint32_t ErrorOrigin; 6014aa61755SAndy Ye TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6, 6024aa61755SAndy Ye { 0xa8, 0x69, 0x9c, 0xe6, 6034aa61755SAndy Ye 0x88, 0x6c, 0x5d, 0x5d 6044aa61755SAndy Ye } 6054aa61755SAndy Ye }; 6064aa61755SAndy Ye TEEC_UUID *TeecUuid = &tempuuid; 6074aa61755SAndy Ye TEEC_Operation TeecOperation = {0}; 6083251364cSHisping Lin struct blk_desc *dev_desc; 6093251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 6106651d4c0SJason Zhu if (!dev_desc) { 6116651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 6126651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 6136651d4c0SJason Zhu } 6144aa61755SAndy Ye 615f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 616f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 617f4e1db95SHisping Lin return TeecResult; 6184aa61755SAndy Ye 6194aa61755SAndy Ye TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 620f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 621f4e1db95SHisping Lin return TeecResult; 6224aa61755SAndy Ye 6233251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 6243251364cSHisping Lin TEEC_NONE, 6253251364cSHisping Lin TEEC_NONE, 6263251364cSHisping Lin TEEC_NONE); 6273251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 628b9a7e756SHisping Lin if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0) 629b9a7e756SHisping Lin TeecOperation.params[0].value.a = 1; 630b9a7e756SHisping Lin else 631b9a7e756SHisping Lin TeecOperation.params[0].value.a = 0; 632b9a7e756SHisping Lin 6333251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 6343251364cSHisping Lin TeecOperation.params[0].value.a = 0; 6353251364cSHisping Lin #endif 6363251364cSHisping Lin 6374aa61755SAndy Ye TeecResult = TEEC_OpenSession(&TeecContext, 6384aa61755SAndy Ye &TeecSession, 6394aa61755SAndy Ye TeecUuid, 6404aa61755SAndy Ye TEEC_LOGIN_PUBLIC, 6414aa61755SAndy Ye NULL, 6423251364cSHisping Lin &TeecOperation, 6434aa61755SAndy Ye &ErrorOrigin); 644f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 645f4e1db95SHisping Lin return TeecResult; 6464aa61755SAndy Ye 6474aa61755SAndy Ye TEEC_SharedMemory SharedMem0 = {0}; 6484aa61755SAndy Ye 6494aa61755SAndy Ye SharedMem0.size = *dh_size; 6504aa61755SAndy Ye SharedMem0.flags = 0; 6514aa61755SAndy Ye 6524aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 653f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 654f4e1db95SHisping Lin goto exit; 6554aa61755SAndy Ye 6564aa61755SAndy Ye TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 6574aa61755SAndy Ye TeecOperation.params[0].tmpref.size = SharedMem0.size; 6584aa61755SAndy Ye 6594aa61755SAndy Ye TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, 6604aa61755SAndy Ye TEEC_NONE, 6614aa61755SAndy Ye TEEC_NONE, 6624aa61755SAndy Ye TEEC_NONE); 6634aa61755SAndy Ye 6644aa61755SAndy Ye TeecResult = TEEC_InvokeCommand(&TeecSession, 6654aa61755SAndy Ye 143, 6664aa61755SAndy Ye &TeecOperation, 6674aa61755SAndy Ye &ErrorOrigin); 668f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 669f4e1db95SHisping Lin goto exit; 6704aa61755SAndy Ye 6714aa61755SAndy Ye *dh_size = TeecOperation.params[0].tmpref.size; 6724aa61755SAndy Ye memcpy(dh, SharedMem0.buffer, SharedMem0.size); 673f4e1db95SHisping Lin exit: 6744aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem0); 6754aa61755SAndy Ye TEEC_CloseSession(&TeecSession); 676f4e1db95SHisping Lin TEEC_FinalizeContext(&TeecContext); 6774aa61755SAndy Ye 6784aa61755SAndy Ye return TeecResult; 6794aa61755SAndy Ye } 6804aa61755SAndy Ye 6814aa61755SAndy Ye uint32_t trusty_attest_uuid(uint8_t *uuid, uint32_t *uuid_size) 6824aa61755SAndy Ye { 6834aa61755SAndy Ye TEEC_Result TeecResult; 6844aa61755SAndy Ye TEEC_Context TeecContext; 6854aa61755SAndy Ye TEEC_Session TeecSession; 6864aa61755SAndy Ye uint32_t ErrorOrigin; 6874aa61755SAndy Ye TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6, 6884aa61755SAndy Ye { 0xa8, 0x69, 0x9c, 0xe6, 6894aa61755SAndy Ye 0x88, 0x6c, 0x5d, 0x5d 6904aa61755SAndy Ye } 6914aa61755SAndy Ye }; 6924aa61755SAndy Ye TEEC_UUID *TeecUuid = &tempuuid; 6934aa61755SAndy Ye TEEC_Operation TeecOperation = {0}; 6943251364cSHisping Lin struct blk_desc *dev_desc; 6953251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 6966651d4c0SJason Zhu if (!dev_desc) { 6976651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 6986651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 6996651d4c0SJason Zhu } 7004aa61755SAndy Ye 701f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 702f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 703f4e1db95SHisping Lin return TeecResult; 7044aa61755SAndy Ye 7054aa61755SAndy Ye TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 706f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 707f4e1db95SHisping Lin return TeecResult; 7084aa61755SAndy Ye 7093251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 7103251364cSHisping Lin TEEC_NONE, 7113251364cSHisping Lin TEEC_NONE, 7123251364cSHisping Lin TEEC_NONE); 7133251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 714b9a7e756SHisping Lin if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0) 715b9a7e756SHisping Lin TeecOperation.params[0].value.a = 1; 716b9a7e756SHisping Lin else 717b9a7e756SHisping Lin TeecOperation.params[0].value.a = 0; 718b9a7e756SHisping Lin 7193251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 7203251364cSHisping Lin TeecOperation.params[0].value.a = 0; 7213251364cSHisping Lin #endif 7223251364cSHisping Lin 7234aa61755SAndy Ye TeecResult = TEEC_OpenSession(&TeecContext, 7244aa61755SAndy Ye &TeecSession, 7254aa61755SAndy Ye TeecUuid, 7264aa61755SAndy Ye TEEC_LOGIN_PUBLIC, 7274aa61755SAndy Ye NULL, 7283251364cSHisping Lin &TeecOperation, 7294aa61755SAndy Ye &ErrorOrigin); 730f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 731f4e1db95SHisping Lin return TeecResult; 7324aa61755SAndy Ye 7334aa61755SAndy Ye TEEC_SharedMemory SharedMem0 = {0}; 7344aa61755SAndy Ye 7354aa61755SAndy Ye SharedMem0.size = *uuid_size; 7364aa61755SAndy Ye SharedMem0.flags = 0; 7374aa61755SAndy Ye 7384aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 739f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 740f4e1db95SHisping Lin goto exit; 7414aa61755SAndy Ye 7424aa61755SAndy Ye TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 7434aa61755SAndy Ye TeecOperation.params[0].tmpref.size = SharedMem0.size; 7444aa61755SAndy Ye 7454aa61755SAndy Ye TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, 7464aa61755SAndy Ye TEEC_NONE, 7474aa61755SAndy Ye TEEC_NONE, 7484aa61755SAndy Ye TEEC_NONE); 7494aa61755SAndy Ye 7504aa61755SAndy Ye TeecResult = TEEC_InvokeCommand(&TeecSession, 7514aa61755SAndy Ye 144, 7524aa61755SAndy Ye &TeecOperation, 7534aa61755SAndy Ye &ErrorOrigin); 754f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 755f4e1db95SHisping Lin goto exit; 7564aa61755SAndy Ye 7574aa61755SAndy Ye *uuid_size = TeecOperation.params[0].tmpref.size; 7584aa61755SAndy Ye memcpy(uuid, SharedMem0.buffer, SharedMem0.size); 759f4e1db95SHisping Lin exit: 7604aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem0); 7614aa61755SAndy Ye TEEC_CloseSession(&TeecSession); 762f4e1db95SHisping Lin TEEC_FinalizeContext(&TeecContext); 7634aa61755SAndy Ye 7644aa61755SAndy Ye return TeecResult; 7654aa61755SAndy Ye } 7664aa61755SAndy Ye 7674aa61755SAndy Ye uint32_t trusty_attest_get_ca(uint8_t *operation_start, 7684aa61755SAndy Ye uint32_t *operation_size, 7694aa61755SAndy Ye uint8_t *out, 7704aa61755SAndy Ye uint32_t *out_len) 7714aa61755SAndy Ye { 7724aa61755SAndy Ye TEEC_Result TeecResult; 7734aa61755SAndy Ye TEEC_Context TeecContext; 7744aa61755SAndy Ye TEEC_Session TeecSession; 7754aa61755SAndy Ye uint32_t ErrorOrigin; 7764aa61755SAndy Ye 7774aa61755SAndy Ye TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6, 7784aa61755SAndy Ye { 0xa8, 0x69, 0x9c, 0xe6, 7794aa61755SAndy Ye 0x88, 0x6c, 0x5d, 0x5d 7804aa61755SAndy Ye } 7814aa61755SAndy Ye }; 7824aa61755SAndy Ye 7834aa61755SAndy Ye TEEC_UUID *TeecUuid = &tempuuid; 7844aa61755SAndy Ye TEEC_Operation TeecOperation = {0}; 7853251364cSHisping Lin struct blk_desc *dev_desc; 7863251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 7876651d4c0SJason Zhu if (!dev_desc) { 7886651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 7896651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 7906651d4c0SJason Zhu } 7914aa61755SAndy Ye 792f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 793f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 794f4e1db95SHisping Lin return TeecResult; 7954aa61755SAndy Ye 7964aa61755SAndy Ye TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 797f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 798f4e1db95SHisping Lin return TeecResult; 7994aa61755SAndy Ye 8003251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 8013251364cSHisping Lin TEEC_NONE, 8023251364cSHisping Lin TEEC_NONE, 8033251364cSHisping Lin TEEC_NONE); 8043251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 805b9a7e756SHisping Lin if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0) 806b9a7e756SHisping Lin TeecOperation.params[0].value.a = 1; 807b9a7e756SHisping Lin else 808b9a7e756SHisping Lin TeecOperation.params[0].value.a = 0; 809b9a7e756SHisping Lin 8103251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 8113251364cSHisping Lin TeecOperation.params[0].value.a = 0; 8123251364cSHisping Lin #endif 8133251364cSHisping Lin 8144aa61755SAndy Ye TeecResult = TEEC_OpenSession(&TeecContext, 8154aa61755SAndy Ye &TeecSession, 8164aa61755SAndy Ye TeecUuid, 8174aa61755SAndy Ye TEEC_LOGIN_PUBLIC, 8184aa61755SAndy Ye NULL, 8193251364cSHisping Lin &TeecOperation, 8204aa61755SAndy Ye &ErrorOrigin); 821f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 822f4e1db95SHisping Lin return TeecResult; 8234aa61755SAndy Ye 8244aa61755SAndy Ye TEEC_SharedMemory SharedMem0 = {0}; 8254aa61755SAndy Ye 8264aa61755SAndy Ye SharedMem0.size = *operation_size; 8274aa61755SAndy Ye SharedMem0.flags = 0; 8284aa61755SAndy Ye 8294aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 830f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 831f4e1db95SHisping Lin goto exit; 8324aa61755SAndy Ye 8334aa61755SAndy Ye memcpy(SharedMem0.buffer, operation_start, SharedMem0.size); 8344aa61755SAndy Ye 8354aa61755SAndy Ye TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 8364aa61755SAndy Ye TeecOperation.params[0].tmpref.size = SharedMem0.size; 8374aa61755SAndy Ye 8384aa61755SAndy Ye TEEC_SharedMemory SharedMem1 = {0}; 8394aa61755SAndy Ye 8404aa61755SAndy Ye SharedMem1.size = *out_len; 8414aa61755SAndy Ye SharedMem1.flags = 0; 8424aa61755SAndy Ye 8434aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 844f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 845f4e1db95SHisping Lin goto exit; 8464aa61755SAndy Ye 8474aa61755SAndy Ye TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 8484aa61755SAndy Ye TeecOperation.params[1].tmpref.size = SharedMem1.size; 8494aa61755SAndy Ye 8504aa61755SAndy Ye TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, 8514aa61755SAndy Ye TEEC_MEMREF_TEMP_INOUT, 8524aa61755SAndy Ye TEEC_NONE, 8534aa61755SAndy Ye TEEC_NONE); 8544aa61755SAndy Ye 8554aa61755SAndy Ye TeecResult = TEEC_InvokeCommand(&TeecSession, 8564aa61755SAndy Ye 145, 8574aa61755SAndy Ye &TeecOperation, 8584aa61755SAndy Ye &ErrorOrigin); 859f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 860f4e1db95SHisping Lin goto exit; 8614aa61755SAndy Ye 8624aa61755SAndy Ye *out_len = TeecOperation.params[1].tmpref.size; 8634aa61755SAndy Ye memcpy(out, SharedMem1.buffer, SharedMem1.size); 864f4e1db95SHisping Lin exit: 8654aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem0); 8664aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem1); 867f4e1db95SHisping Lin TEEC_CloseSession(&TeecSession); 868f4e1db95SHisping Lin TEEC_FinalizeContext(&TeecContext); 8694aa61755SAndy Ye 8704aa61755SAndy Ye return TeecResult; 8714aa61755SAndy Ye } 8724aa61755SAndy Ye 8734aa61755SAndy Ye uint32_t trusty_attest_set_ca(uint8_t *ca_response, uint32_t *ca_response_size) 8744aa61755SAndy Ye { 8754aa61755SAndy Ye TEEC_Result TeecResult; 8764aa61755SAndy Ye TEEC_Context TeecContext; 8774aa61755SAndy Ye TEEC_Session TeecSession; 8784aa61755SAndy Ye uint32_t ErrorOrigin; 8794aa61755SAndy Ye TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6, 8804aa61755SAndy Ye { 0xa8, 0x69, 0x9c, 0xe6, 8814aa61755SAndy Ye 0x88, 0x6c, 0x5d, 0x5d 8824aa61755SAndy Ye } 8834aa61755SAndy Ye }; 8844aa61755SAndy Ye TEEC_UUID *TeecUuid = &tempuuid; 8854aa61755SAndy Ye TEEC_Operation TeecOperation = {0}; 8863251364cSHisping Lin struct blk_desc *dev_desc; 8873251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 8886651d4c0SJason Zhu if (!dev_desc) { 8896651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 8906651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 8916651d4c0SJason Zhu } 892f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 893f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 894f4e1db95SHisping Lin return TeecResult; 8954aa61755SAndy Ye 8964aa61755SAndy Ye TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 897f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 898f4e1db95SHisping Lin return TeecResult; 8994aa61755SAndy Ye 9003251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 9013251364cSHisping Lin TEEC_NONE, 9023251364cSHisping Lin TEEC_NONE, 9033251364cSHisping Lin TEEC_NONE); 9043251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 905b9a7e756SHisping Lin if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0) 906b9a7e756SHisping Lin TeecOperation.params[0].value.a = 1; 907b9a7e756SHisping Lin else 908b9a7e756SHisping Lin TeecOperation.params[0].value.a = 0; 909b9a7e756SHisping Lin 9103251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 9113251364cSHisping Lin TeecOperation.params[0].value.a = 0; 9123251364cSHisping Lin #endif 9133251364cSHisping Lin 9144aa61755SAndy Ye TeecResult = TEEC_OpenSession(&TeecContext, 9154aa61755SAndy Ye &TeecSession, 9164aa61755SAndy Ye TeecUuid, 9174aa61755SAndy Ye TEEC_LOGIN_PUBLIC, 9184aa61755SAndy Ye NULL, 9193251364cSHisping Lin &TeecOperation, 9204aa61755SAndy Ye &ErrorOrigin); 921f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 922f4e1db95SHisping Lin return TeecResult; 9234aa61755SAndy Ye 9244aa61755SAndy Ye TEEC_SharedMemory SharedMem0 = {0}; 9254aa61755SAndy Ye 9264aa61755SAndy Ye SharedMem0.size = *ca_response_size; 9274aa61755SAndy Ye SharedMem0.flags = 0; 9284aa61755SAndy Ye 9294aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 930f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 931f4e1db95SHisping Lin goto exit; 9324aa61755SAndy Ye 9334aa61755SAndy Ye memcpy(SharedMem0.buffer, ca_response, SharedMem0.size); 9344aa61755SAndy Ye 9354aa61755SAndy Ye TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 9364aa61755SAndy Ye TeecOperation.params[0].tmpref.size = SharedMem0.size; 9374aa61755SAndy Ye 9384aa61755SAndy Ye TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, 9394aa61755SAndy Ye TEEC_NONE, 9404aa61755SAndy Ye TEEC_NONE, 9414aa61755SAndy Ye TEEC_NONE); 9424aa61755SAndy Ye 9434aa61755SAndy Ye TeecResult = TEEC_InvokeCommand(&TeecSession, 9444aa61755SAndy Ye 146, 9454aa61755SAndy Ye &TeecOperation, 9464aa61755SAndy Ye &ErrorOrigin); 947f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 948f4e1db95SHisping Lin goto exit; 949f4e1db95SHisping Lin exit: 9504aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem0); 9514aa61755SAndy Ye TEEC_CloseSession(&TeecSession); 952f4e1db95SHisping Lin TEEC_FinalizeContext(&TeecContext); 9534aa61755SAndy Ye 9544aa61755SAndy Ye return TeecResult; 9554aa61755SAndy Ye } 956