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 25*f39d4289SHisping 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 569*f39d4289SHisping Lin uint32_t trusty_write_oem_huk(uint32_t *buf, uint32_t length) 570*f39d4289SHisping Lin { 571*f39d4289SHisping Lin return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_OEM_HUK, 572*f39d4289SHisping Lin true, buf, length); 573*f39d4289SHisping Lin } 574*f39d4289SHisping Lin 5754aa61755SAndy Ye uint32_t trusty_attest_dh(uint8_t *dh, uint32_t *dh_size) 5764aa61755SAndy Ye { 5774aa61755SAndy Ye TEEC_Result TeecResult; 5784aa61755SAndy Ye TEEC_Context TeecContext; 5794aa61755SAndy Ye TEEC_Session TeecSession; 5804aa61755SAndy Ye uint32_t ErrorOrigin; 5814aa61755SAndy Ye TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6, 5824aa61755SAndy Ye { 0xa8, 0x69, 0x9c, 0xe6, 5834aa61755SAndy Ye 0x88, 0x6c, 0x5d, 0x5d 5844aa61755SAndy Ye } 5854aa61755SAndy Ye }; 5864aa61755SAndy Ye TEEC_UUID *TeecUuid = &tempuuid; 5874aa61755SAndy Ye TEEC_Operation TeecOperation = {0}; 5883251364cSHisping Lin struct blk_desc *dev_desc; 5893251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 5906651d4c0SJason Zhu if (!dev_desc) { 5916651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 5926651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 5936651d4c0SJason Zhu } 5944aa61755SAndy Ye 595f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 596f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 597f4e1db95SHisping Lin return TeecResult; 5984aa61755SAndy Ye 5994aa61755SAndy Ye TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 600f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 601f4e1db95SHisping Lin return TeecResult; 6024aa61755SAndy Ye 6033251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 6043251364cSHisping Lin TEEC_NONE, 6053251364cSHisping Lin TEEC_NONE, 6063251364cSHisping Lin TEEC_NONE); 6073251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 608b9a7e756SHisping Lin if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0) 609b9a7e756SHisping Lin TeecOperation.params[0].value.a = 1; 610b9a7e756SHisping Lin else 611b9a7e756SHisping Lin TeecOperation.params[0].value.a = 0; 612b9a7e756SHisping Lin 6133251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 6143251364cSHisping Lin TeecOperation.params[0].value.a = 0; 6153251364cSHisping Lin #endif 6163251364cSHisping Lin 6174aa61755SAndy Ye TeecResult = TEEC_OpenSession(&TeecContext, 6184aa61755SAndy Ye &TeecSession, 6194aa61755SAndy Ye TeecUuid, 6204aa61755SAndy Ye TEEC_LOGIN_PUBLIC, 6214aa61755SAndy Ye NULL, 6223251364cSHisping Lin &TeecOperation, 6234aa61755SAndy Ye &ErrorOrigin); 624f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 625f4e1db95SHisping Lin return TeecResult; 6264aa61755SAndy Ye 6274aa61755SAndy Ye TEEC_SharedMemory SharedMem0 = {0}; 6284aa61755SAndy Ye 6294aa61755SAndy Ye SharedMem0.size = *dh_size; 6304aa61755SAndy Ye SharedMem0.flags = 0; 6314aa61755SAndy Ye 6324aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 633f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 634f4e1db95SHisping Lin goto exit; 6354aa61755SAndy Ye 6364aa61755SAndy Ye TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 6374aa61755SAndy Ye TeecOperation.params[0].tmpref.size = SharedMem0.size; 6384aa61755SAndy Ye 6394aa61755SAndy Ye TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, 6404aa61755SAndy Ye TEEC_NONE, 6414aa61755SAndy Ye TEEC_NONE, 6424aa61755SAndy Ye TEEC_NONE); 6434aa61755SAndy Ye 6444aa61755SAndy Ye TeecResult = TEEC_InvokeCommand(&TeecSession, 6454aa61755SAndy Ye 143, 6464aa61755SAndy Ye &TeecOperation, 6474aa61755SAndy Ye &ErrorOrigin); 648f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 649f4e1db95SHisping Lin goto exit; 6504aa61755SAndy Ye 6514aa61755SAndy Ye *dh_size = TeecOperation.params[0].tmpref.size; 6524aa61755SAndy Ye memcpy(dh, SharedMem0.buffer, SharedMem0.size); 653f4e1db95SHisping Lin exit: 6544aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem0); 6554aa61755SAndy Ye TEEC_CloseSession(&TeecSession); 656f4e1db95SHisping Lin TEEC_FinalizeContext(&TeecContext); 6574aa61755SAndy Ye 6584aa61755SAndy Ye return TeecResult; 6594aa61755SAndy Ye } 6604aa61755SAndy Ye 6614aa61755SAndy Ye uint32_t trusty_attest_uuid(uint8_t *uuid, uint32_t *uuid_size) 6624aa61755SAndy Ye { 6634aa61755SAndy Ye TEEC_Result TeecResult; 6644aa61755SAndy Ye TEEC_Context TeecContext; 6654aa61755SAndy Ye TEEC_Session TeecSession; 6664aa61755SAndy Ye uint32_t ErrorOrigin; 6674aa61755SAndy Ye TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6, 6684aa61755SAndy Ye { 0xa8, 0x69, 0x9c, 0xe6, 6694aa61755SAndy Ye 0x88, 0x6c, 0x5d, 0x5d 6704aa61755SAndy Ye } 6714aa61755SAndy Ye }; 6724aa61755SAndy Ye TEEC_UUID *TeecUuid = &tempuuid; 6734aa61755SAndy Ye TEEC_Operation TeecOperation = {0}; 6743251364cSHisping Lin struct blk_desc *dev_desc; 6753251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 6766651d4c0SJason Zhu if (!dev_desc) { 6776651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 6786651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 6796651d4c0SJason Zhu } 6804aa61755SAndy Ye 681f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 682f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 683f4e1db95SHisping Lin return TeecResult; 6844aa61755SAndy Ye 6854aa61755SAndy Ye TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 686f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 687f4e1db95SHisping Lin return TeecResult; 6884aa61755SAndy Ye 6893251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 6903251364cSHisping Lin TEEC_NONE, 6913251364cSHisping Lin TEEC_NONE, 6923251364cSHisping Lin TEEC_NONE); 6933251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 694b9a7e756SHisping Lin if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0) 695b9a7e756SHisping Lin TeecOperation.params[0].value.a = 1; 696b9a7e756SHisping Lin else 697b9a7e756SHisping Lin TeecOperation.params[0].value.a = 0; 698b9a7e756SHisping Lin 6993251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 7003251364cSHisping Lin TeecOperation.params[0].value.a = 0; 7013251364cSHisping Lin #endif 7023251364cSHisping Lin 7034aa61755SAndy Ye TeecResult = TEEC_OpenSession(&TeecContext, 7044aa61755SAndy Ye &TeecSession, 7054aa61755SAndy Ye TeecUuid, 7064aa61755SAndy Ye TEEC_LOGIN_PUBLIC, 7074aa61755SAndy Ye NULL, 7083251364cSHisping Lin &TeecOperation, 7094aa61755SAndy Ye &ErrorOrigin); 710f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 711f4e1db95SHisping Lin return TeecResult; 7124aa61755SAndy Ye 7134aa61755SAndy Ye TEEC_SharedMemory SharedMem0 = {0}; 7144aa61755SAndy Ye 7154aa61755SAndy Ye SharedMem0.size = *uuid_size; 7164aa61755SAndy Ye SharedMem0.flags = 0; 7174aa61755SAndy Ye 7184aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 719f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 720f4e1db95SHisping Lin goto exit; 7214aa61755SAndy Ye 7224aa61755SAndy Ye TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 7234aa61755SAndy Ye TeecOperation.params[0].tmpref.size = SharedMem0.size; 7244aa61755SAndy Ye 7254aa61755SAndy Ye TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, 7264aa61755SAndy Ye TEEC_NONE, 7274aa61755SAndy Ye TEEC_NONE, 7284aa61755SAndy Ye TEEC_NONE); 7294aa61755SAndy Ye 7304aa61755SAndy Ye TeecResult = TEEC_InvokeCommand(&TeecSession, 7314aa61755SAndy Ye 144, 7324aa61755SAndy Ye &TeecOperation, 7334aa61755SAndy Ye &ErrorOrigin); 734f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 735f4e1db95SHisping Lin goto exit; 7364aa61755SAndy Ye 7374aa61755SAndy Ye *uuid_size = TeecOperation.params[0].tmpref.size; 7384aa61755SAndy Ye memcpy(uuid, SharedMem0.buffer, SharedMem0.size); 739f4e1db95SHisping Lin exit: 7404aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem0); 7414aa61755SAndy Ye TEEC_CloseSession(&TeecSession); 742f4e1db95SHisping Lin TEEC_FinalizeContext(&TeecContext); 7434aa61755SAndy Ye 7444aa61755SAndy Ye return TeecResult; 7454aa61755SAndy Ye } 7464aa61755SAndy Ye 7474aa61755SAndy Ye uint32_t trusty_attest_get_ca(uint8_t *operation_start, 7484aa61755SAndy Ye uint32_t *operation_size, 7494aa61755SAndy Ye uint8_t *out, 7504aa61755SAndy Ye uint32_t *out_len) 7514aa61755SAndy Ye { 7524aa61755SAndy Ye TEEC_Result TeecResult; 7534aa61755SAndy Ye TEEC_Context TeecContext; 7544aa61755SAndy Ye TEEC_Session TeecSession; 7554aa61755SAndy Ye uint32_t ErrorOrigin; 7564aa61755SAndy Ye 7574aa61755SAndy Ye TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6, 7584aa61755SAndy Ye { 0xa8, 0x69, 0x9c, 0xe6, 7594aa61755SAndy Ye 0x88, 0x6c, 0x5d, 0x5d 7604aa61755SAndy Ye } 7614aa61755SAndy Ye }; 7624aa61755SAndy Ye 7634aa61755SAndy Ye TEEC_UUID *TeecUuid = &tempuuid; 7644aa61755SAndy Ye TEEC_Operation TeecOperation = {0}; 7653251364cSHisping Lin struct blk_desc *dev_desc; 7663251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 7676651d4c0SJason Zhu if (!dev_desc) { 7686651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 7696651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 7706651d4c0SJason Zhu } 7714aa61755SAndy Ye 772f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 773f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 774f4e1db95SHisping Lin return TeecResult; 7754aa61755SAndy Ye 7764aa61755SAndy Ye TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 777f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 778f4e1db95SHisping Lin return TeecResult; 7794aa61755SAndy Ye 7803251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 7813251364cSHisping Lin TEEC_NONE, 7823251364cSHisping Lin TEEC_NONE, 7833251364cSHisping Lin TEEC_NONE); 7843251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 785b9a7e756SHisping Lin if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0) 786b9a7e756SHisping Lin TeecOperation.params[0].value.a = 1; 787b9a7e756SHisping Lin else 788b9a7e756SHisping Lin TeecOperation.params[0].value.a = 0; 789b9a7e756SHisping Lin 7903251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 7913251364cSHisping Lin TeecOperation.params[0].value.a = 0; 7923251364cSHisping Lin #endif 7933251364cSHisping Lin 7944aa61755SAndy Ye TeecResult = TEEC_OpenSession(&TeecContext, 7954aa61755SAndy Ye &TeecSession, 7964aa61755SAndy Ye TeecUuid, 7974aa61755SAndy Ye TEEC_LOGIN_PUBLIC, 7984aa61755SAndy Ye NULL, 7993251364cSHisping Lin &TeecOperation, 8004aa61755SAndy Ye &ErrorOrigin); 801f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 802f4e1db95SHisping Lin return TeecResult; 8034aa61755SAndy Ye 8044aa61755SAndy Ye TEEC_SharedMemory SharedMem0 = {0}; 8054aa61755SAndy Ye 8064aa61755SAndy Ye SharedMem0.size = *operation_size; 8074aa61755SAndy Ye SharedMem0.flags = 0; 8084aa61755SAndy Ye 8094aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 810f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 811f4e1db95SHisping Lin goto exit; 8124aa61755SAndy Ye 8134aa61755SAndy Ye memcpy(SharedMem0.buffer, operation_start, SharedMem0.size); 8144aa61755SAndy Ye 8154aa61755SAndy Ye TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 8164aa61755SAndy Ye TeecOperation.params[0].tmpref.size = SharedMem0.size; 8174aa61755SAndy Ye 8184aa61755SAndy Ye TEEC_SharedMemory SharedMem1 = {0}; 8194aa61755SAndy Ye 8204aa61755SAndy Ye SharedMem1.size = *out_len; 8214aa61755SAndy Ye SharedMem1.flags = 0; 8224aa61755SAndy Ye 8234aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 824f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 825f4e1db95SHisping Lin goto exit; 8264aa61755SAndy Ye 8274aa61755SAndy Ye TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 8284aa61755SAndy Ye TeecOperation.params[1].tmpref.size = SharedMem1.size; 8294aa61755SAndy Ye 8304aa61755SAndy Ye TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, 8314aa61755SAndy Ye TEEC_MEMREF_TEMP_INOUT, 8324aa61755SAndy Ye TEEC_NONE, 8334aa61755SAndy Ye TEEC_NONE); 8344aa61755SAndy Ye 8354aa61755SAndy Ye TeecResult = TEEC_InvokeCommand(&TeecSession, 8364aa61755SAndy Ye 145, 8374aa61755SAndy Ye &TeecOperation, 8384aa61755SAndy Ye &ErrorOrigin); 839f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 840f4e1db95SHisping Lin goto exit; 8414aa61755SAndy Ye 8424aa61755SAndy Ye *out_len = TeecOperation.params[1].tmpref.size; 8434aa61755SAndy Ye memcpy(out, SharedMem1.buffer, SharedMem1.size); 844f4e1db95SHisping Lin exit: 8454aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem0); 8464aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem1); 847f4e1db95SHisping Lin TEEC_CloseSession(&TeecSession); 848f4e1db95SHisping Lin TEEC_FinalizeContext(&TeecContext); 8494aa61755SAndy Ye 8504aa61755SAndy Ye return TeecResult; 8514aa61755SAndy Ye } 8524aa61755SAndy Ye 8534aa61755SAndy Ye uint32_t trusty_attest_set_ca(uint8_t *ca_response, uint32_t *ca_response_size) 8544aa61755SAndy Ye { 8554aa61755SAndy Ye TEEC_Result TeecResult; 8564aa61755SAndy Ye TEEC_Context TeecContext; 8574aa61755SAndy Ye TEEC_Session TeecSession; 8584aa61755SAndy Ye uint32_t ErrorOrigin; 8594aa61755SAndy Ye TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6, 8604aa61755SAndy Ye { 0xa8, 0x69, 0x9c, 0xe6, 8614aa61755SAndy Ye 0x88, 0x6c, 0x5d, 0x5d 8624aa61755SAndy Ye } 8634aa61755SAndy Ye }; 8644aa61755SAndy Ye TEEC_UUID *TeecUuid = &tempuuid; 8654aa61755SAndy Ye TEEC_Operation TeecOperation = {0}; 8663251364cSHisping Lin struct blk_desc *dev_desc; 8673251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 8686651d4c0SJason Zhu if (!dev_desc) { 8696651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 8706651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 8716651d4c0SJason Zhu } 872f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 873f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 874f4e1db95SHisping Lin return TeecResult; 8754aa61755SAndy Ye 8764aa61755SAndy Ye TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 877f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 878f4e1db95SHisping Lin return TeecResult; 8794aa61755SAndy Ye 8803251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 8813251364cSHisping Lin TEEC_NONE, 8823251364cSHisping Lin TEEC_NONE, 8833251364cSHisping Lin TEEC_NONE); 8843251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 885b9a7e756SHisping Lin if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0) 886b9a7e756SHisping Lin TeecOperation.params[0].value.a = 1; 887b9a7e756SHisping Lin else 888b9a7e756SHisping Lin TeecOperation.params[0].value.a = 0; 889b9a7e756SHisping Lin 8903251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 8913251364cSHisping Lin TeecOperation.params[0].value.a = 0; 8923251364cSHisping Lin #endif 8933251364cSHisping Lin 8944aa61755SAndy Ye TeecResult = TEEC_OpenSession(&TeecContext, 8954aa61755SAndy Ye &TeecSession, 8964aa61755SAndy Ye TeecUuid, 8974aa61755SAndy Ye TEEC_LOGIN_PUBLIC, 8984aa61755SAndy Ye NULL, 8993251364cSHisping Lin &TeecOperation, 9004aa61755SAndy Ye &ErrorOrigin); 901f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 902f4e1db95SHisping Lin return TeecResult; 9034aa61755SAndy Ye 9044aa61755SAndy Ye TEEC_SharedMemory SharedMem0 = {0}; 9054aa61755SAndy Ye 9064aa61755SAndy Ye SharedMem0.size = *ca_response_size; 9074aa61755SAndy Ye SharedMem0.flags = 0; 9084aa61755SAndy Ye 9094aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 910f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 911f4e1db95SHisping Lin goto exit; 9124aa61755SAndy Ye 9134aa61755SAndy Ye memcpy(SharedMem0.buffer, ca_response, SharedMem0.size); 9144aa61755SAndy Ye 9154aa61755SAndy Ye TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 9164aa61755SAndy Ye TeecOperation.params[0].tmpref.size = SharedMem0.size; 9174aa61755SAndy Ye 9184aa61755SAndy Ye TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, 9194aa61755SAndy Ye TEEC_NONE, 9204aa61755SAndy Ye TEEC_NONE, 9214aa61755SAndy Ye TEEC_NONE); 9224aa61755SAndy Ye 9234aa61755SAndy Ye TeecResult = TEEC_InvokeCommand(&TeecSession, 9244aa61755SAndy Ye 146, 9254aa61755SAndy Ye &TeecOperation, 9264aa61755SAndy Ye &ErrorOrigin); 927f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 928f4e1db95SHisping Lin goto exit; 929f4e1db95SHisping Lin exit: 9304aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem0); 9314aa61755SAndy Ye TEEC_CloseSession(&TeecSession); 932f4e1db95SHisping Lin TEEC_FinalizeContext(&TeecContext); 9334aa61755SAndy Ye 9344aa61755SAndy Ye return TeecResult; 9354aa61755SAndy Ye } 936