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) 17*c7de5349SHisping Lin #define STORAGE_CMD_READ_ATTRIBUTE_HASH 0 18*c7de5349SHisping Lin #define STORAGE_CMD_WRITE_ATTRIBUTE_HASH 1 19*c7de5349SHisping Lin #define STORAGE_CMD_UBOOT_END_OTP 2 20*c7de5349SHisping Lin #define STORAGE_CMD_READ_VBOOTKEY_HASH 3 21*c7de5349SHisping Lin #define STORAGE_CMD_WRITE_VBOOTKEY_HASH 4 22*c7de5349SHisping Lin #define STORAGE_CMD_READ_ENABLE_FLAG 5 23ae8ec5e1SHisping Lin 24ae8ec5e1SHisping Lin static uint8_t b2hs_add_base(uint8_t in) 25ae8ec5e1SHisping Lin { 26ae8ec5e1SHisping Lin if (in > 9) 27ae8ec5e1SHisping Lin return in + 55; 28ae8ec5e1SHisping Lin else 29ae8ec5e1SHisping Lin return in + 48; 30ae8ec5e1SHisping Lin } 31ae8ec5e1SHisping Lin 32*c7de5349SHisping Lin static uint32_t b2hs(uint8_t *b, uint8_t *hs, uint32_t blen, uint32_t hslen) 33ae8ec5e1SHisping Lin { 34ae8ec5e1SHisping Lin uint32_t i = 0; 35ae8ec5e1SHisping Lin 36ae8ec5e1SHisping Lin if (blen * 2 + 1 > hslen) 37ae8ec5e1SHisping Lin return 0; 38ae8ec5e1SHisping Lin 39ae8ec5e1SHisping Lin for (; i < blen; i++) { 40ae8ec5e1SHisping Lin hs[i * 2 + 1] = b2hs_add_base(b[i] & 0xf); 41ae8ec5e1SHisping Lin hs[i * 2] = b2hs_add_base(b[i] >> 4); 42ae8ec5e1SHisping Lin } 43ae8ec5e1SHisping Lin hs[blen * 2] = 0; 44ae8ec5e1SHisping Lin 45ae8ec5e1SHisping Lin return blen * 2; 46ae8ec5e1SHisping Lin } 47ae8ec5e1SHisping Lin 48*c7de5349SHisping Lin static uint32_t trusty_base_write_security_data(char *filename, 49*c7de5349SHisping Lin uint32_t filename_size, 50*c7de5349SHisping Lin uint8_t *data, 51*c7de5349SHisping Lin uint32_t data_size) 52ae8ec5e1SHisping Lin { 53ae8ec5e1SHisping Lin TEEC_Result TeecResult; 54ae8ec5e1SHisping Lin TEEC_Context TeecContext; 55ae8ec5e1SHisping Lin TEEC_Session TeecSession; 56ae8ec5e1SHisping Lin uint32_t ErrorOrigin; 57ae8ec5e1SHisping Lin TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 58ae8ec5e1SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 59ae8ec5e1SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 60ae8ec5e1SHisping Lin TEEC_Operation TeecOperation = {0}; 613251364cSHisping Lin struct blk_desc *dev_desc; 623251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 636651d4c0SJason Zhu if (!dev_desc) { 646651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 656651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 666651d4c0SJason Zhu } 673251364cSHisping Lin 68f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 69f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 70f4e1db95SHisping Lin return TeecResult; 71ae8ec5e1SHisping Lin 72ae8ec5e1SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 73f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 74f4e1db95SHisping Lin return TeecResult; 75ae8ec5e1SHisping Lin 763251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 773251364cSHisping Lin TEEC_NONE, 783251364cSHisping Lin TEEC_NONE, 793251364cSHisping Lin TEEC_NONE); 803251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 81b9a7e756SHisping Lin if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0) 82b9a7e756SHisping Lin TeecOperation.params[0].value.a = 1; 83b9a7e756SHisping Lin else 84b9a7e756SHisping Lin TeecOperation.params[0].value.a = 0; 853251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 863251364cSHisping Lin TeecOperation.params[0].value.a = 0; 873251364cSHisping Lin #endif 883251364cSHisping Lin 89ae8ec5e1SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 90ae8ec5e1SHisping Lin &TeecSession, 91ae8ec5e1SHisping Lin TeecUuid, 92ae8ec5e1SHisping Lin TEEC_LOGIN_PUBLIC, 93ae8ec5e1SHisping Lin NULL, 943251364cSHisping Lin &TeecOperation, 95ae8ec5e1SHisping Lin &ErrorOrigin); 96f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 97f4e1db95SHisping Lin return TeecResult; 98ae8ec5e1SHisping Lin 99ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 100ae8ec5e1SHisping Lin 101*c7de5349SHisping Lin SharedMem0.size = filename_size; 102ae8ec5e1SHisping Lin SharedMem0.flags = 0; 103ae8ec5e1SHisping Lin 104ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 105f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 106f4e1db95SHisping Lin goto exit; 107ae8ec5e1SHisping Lin 108*c7de5349SHisping Lin memcpy(SharedMem0.buffer, filename, SharedMem0.size); 109ae8ec5e1SHisping Lin 110ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem1 = {0}; 111ae8ec5e1SHisping Lin 112*c7de5349SHisping Lin SharedMem1.size = data_size; 113*c7de5349SHisping Lin SharedMem1.flags = 0; 114*c7de5349SHisping Lin 115*c7de5349SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 116*c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 117*c7de5349SHisping Lin goto exit; 118*c7de5349SHisping Lin 119*c7de5349SHisping Lin memcpy(SharedMem1.buffer, data, SharedMem1.size); 120*c7de5349SHisping Lin 121*c7de5349SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 122*c7de5349SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 123*c7de5349SHisping Lin 124*c7de5349SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 125*c7de5349SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem1.size; 126*c7de5349SHisping Lin 127*c7de5349SHisping Lin 128*c7de5349SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 129*c7de5349SHisping Lin TEEC_MEMREF_TEMP_INOUT, 130*c7de5349SHisping Lin TEEC_NONE, 131*c7de5349SHisping Lin TEEC_NONE); 132*c7de5349SHisping Lin 133*c7de5349SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 134*c7de5349SHisping Lin 1, 135*c7de5349SHisping Lin &TeecOperation, 136*c7de5349SHisping Lin &ErrorOrigin); 137*c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 138*c7de5349SHisping Lin goto exit; 139*c7de5349SHisping Lin exit: 140*c7de5349SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 141*c7de5349SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem1); 142*c7de5349SHisping Lin TEEC_CloseSession(&TeecSession); 143*c7de5349SHisping Lin TEEC_FinalizeContext(&TeecContext); 144*c7de5349SHisping Lin 145*c7de5349SHisping Lin return TeecResult; 146*c7de5349SHisping Lin } 147*c7de5349SHisping Lin 148*c7de5349SHisping Lin static uint32_t trusty_base_read_security_data(char *filename, 149*c7de5349SHisping Lin uint32_t filename_size, 150*c7de5349SHisping Lin uint8_t *data, 151*c7de5349SHisping Lin uint32_t data_size) 152*c7de5349SHisping Lin { 153*c7de5349SHisping Lin TEEC_Result TeecResult; 154*c7de5349SHisping Lin TEEC_Context TeecContext; 155*c7de5349SHisping Lin TEEC_Session TeecSession; 156*c7de5349SHisping Lin uint32_t ErrorOrigin; 157*c7de5349SHisping Lin TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 158*c7de5349SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 159*c7de5349SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 160*c7de5349SHisping Lin TEEC_Operation TeecOperation = {0}; 161*c7de5349SHisping Lin 162*c7de5349SHisping Lin struct blk_desc *dev_desc; 163*c7de5349SHisping Lin dev_desc = rockchip_get_bootdev(); 164*c7de5349SHisping Lin if (!dev_desc) { 165*c7de5349SHisping Lin printf("%s: dev_desc is NULL!\n", __func__); 166*c7de5349SHisping Lin return -TEEC_ERROR_GENERIC; 167*c7de5349SHisping Lin } 168*c7de5349SHisping Lin 169*c7de5349SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 170*c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 171*c7de5349SHisping Lin return TeecResult; 172*c7de5349SHisping Lin 173*c7de5349SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 174*c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 175*c7de5349SHisping Lin return TeecResult; 176*c7de5349SHisping Lin 177*c7de5349SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 178*c7de5349SHisping Lin TEEC_NONE, 179*c7de5349SHisping Lin TEEC_NONE, 180*c7de5349SHisping Lin TEEC_NONE); 181*c7de5349SHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 182*c7de5349SHisping Lin if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0) 183*c7de5349SHisping Lin TeecOperation.params[0].value.a = 1; 184*c7de5349SHisping Lin else 185*c7de5349SHisping Lin TeecOperation.params[0].value.a = 0; 186*c7de5349SHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 187*c7de5349SHisping Lin TeecOperation.params[0].value.a = 0; 188*c7de5349SHisping Lin #endif 189*c7de5349SHisping Lin 190*c7de5349SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 191*c7de5349SHisping Lin &TeecSession, 192*c7de5349SHisping Lin TeecUuid, 193*c7de5349SHisping Lin TEEC_LOGIN_PUBLIC, 194*c7de5349SHisping Lin NULL, 195*c7de5349SHisping Lin &TeecOperation, 196*c7de5349SHisping Lin &ErrorOrigin); 197*c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 198*c7de5349SHisping Lin return TeecResult; 199*c7de5349SHisping Lin 200*c7de5349SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 201*c7de5349SHisping Lin 202*c7de5349SHisping Lin SharedMem0.size = filename_size; 203*c7de5349SHisping Lin SharedMem0.flags = 0; 204*c7de5349SHisping Lin 205*c7de5349SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 206*c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 207*c7de5349SHisping Lin goto exit; 208*c7de5349SHisping Lin 209*c7de5349SHisping Lin memcpy(SharedMem0.buffer, filename, SharedMem0.size); 210*c7de5349SHisping Lin 211*c7de5349SHisping Lin TEEC_SharedMemory SharedMem1 = {0}; 212*c7de5349SHisping Lin 213*c7de5349SHisping Lin SharedMem1.size = data_size; 214ae8ec5e1SHisping Lin SharedMem1.flags = 0; 215ae8ec5e1SHisping Lin 216ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 217f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 218f4e1db95SHisping Lin goto exit; 219ae8ec5e1SHisping Lin 220ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 221ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 222ae8ec5e1SHisping Lin 223ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 224ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem1.size; 225ae8ec5e1SHisping Lin 226ae8ec5e1SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 227ae8ec5e1SHisping Lin TEEC_MEMREF_TEMP_INOUT, 228ae8ec5e1SHisping Lin TEEC_NONE, 229ae8ec5e1SHisping Lin TEEC_NONE); 230ae8ec5e1SHisping Lin 231ae8ec5e1SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 232ae8ec5e1SHisping Lin 0, 233ae8ec5e1SHisping Lin &TeecOperation, 234ae8ec5e1SHisping Lin &ErrorOrigin); 23546b2a054SHisping Lin if (TeecResult == TEEC_SUCCESS) 236*c7de5349SHisping Lin memcpy(data, SharedMem1.buffer, SharedMem1.size); 237f4e1db95SHisping Lin exit: 238ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 239ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem1); 240ae8ec5e1SHisping Lin TEEC_CloseSession(&TeecSession); 24146b2a054SHisping Lin TEEC_FinalizeContext(&TeecContext); 242ae8ec5e1SHisping Lin 243ae8ec5e1SHisping Lin return TeecResult; 244ae8ec5e1SHisping Lin } 245ae8ec5e1SHisping Lin 246*c7de5349SHisping Lin static uint32_t trusty_base_end_security_data(void) 247*c7de5349SHisping Lin { 248*c7de5349SHisping Lin TEEC_Result TeecResult; 249*c7de5349SHisping Lin TEEC_Context TeecContext; 250*c7de5349SHisping Lin TEEC_Session TeecSession; 251*c7de5349SHisping Lin uint32_t ErrorOrigin; 252*c7de5349SHisping Lin TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 253*c7de5349SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 254*c7de5349SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 255*c7de5349SHisping Lin TEEC_Operation TeecOperation = {0}; 256*c7de5349SHisping Lin 257*c7de5349SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 258*c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 259*c7de5349SHisping Lin return TeecResult; 260*c7de5349SHisping Lin 261*c7de5349SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 262*c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 263*c7de5349SHisping Lin return TeecResult; 264*c7de5349SHisping Lin 265*c7de5349SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 266*c7de5349SHisping Lin &TeecSession, 267*c7de5349SHisping Lin TeecUuid, 268*c7de5349SHisping Lin TEEC_LOGIN_PUBLIC, 269*c7de5349SHisping Lin NULL, 270*c7de5349SHisping Lin NULL, 271*c7de5349SHisping Lin &ErrorOrigin); 272*c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 273*c7de5349SHisping Lin return TeecResult; 274*c7de5349SHisping Lin 275*c7de5349SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE, 276*c7de5349SHisping Lin TEEC_NONE, 277*c7de5349SHisping Lin TEEC_NONE, 278*c7de5349SHisping Lin TEEC_NONE); 279*c7de5349SHisping Lin 280*c7de5349SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 281*c7de5349SHisping Lin 2, 282*c7de5349SHisping Lin &TeecOperation, 283*c7de5349SHisping Lin &ErrorOrigin); 284*c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 285*c7de5349SHisping Lin goto exit; 286*c7de5349SHisping Lin exit: 287*c7de5349SHisping Lin TEEC_CloseSession(&TeecSession); 288*c7de5349SHisping Lin TEEC_FinalizeContext(&TeecContext); 289*c7de5349SHisping Lin 290*c7de5349SHisping Lin return TeecResult; 291*c7de5349SHisping Lin } 292*c7de5349SHisping Lin 293*c7de5349SHisping Lin uint32_t trusty_read_rollback_index(uint32_t slot, uint64_t *value) 294*c7de5349SHisping Lin { 295*c7de5349SHisping Lin char hs[9]; 296*c7de5349SHisping Lin 297*c7de5349SHisping Lin b2hs((uint8_t *)&slot, (uint8_t *)hs, 4, 9); 298*c7de5349SHisping Lin 299*c7de5349SHisping Lin return trusty_base_read_security_data(hs, 8, (uint8_t *)value, 8); 300*c7de5349SHisping Lin } 301*c7de5349SHisping Lin 302ae8ec5e1SHisping Lin uint32_t trusty_write_rollback_index(uint32_t slot, uint64_t value) 303ae8ec5e1SHisping Lin { 304*c7de5349SHisping Lin char hs[9]; 3053251364cSHisping Lin 306*c7de5349SHisping Lin b2hs((uint8_t *)&slot, (uint8_t *)hs, 4, 9); 307ae8ec5e1SHisping Lin 308*c7de5349SHisping Lin return trusty_base_write_security_data(hs, 8, (uint8_t *)&value, 8); 309ae8ec5e1SHisping Lin } 310ae8ec5e1SHisping Lin 311ae8ec5e1SHisping Lin uint32_t trusty_read_permanent_attributes(uint8_t *attributes, uint32_t size) 312ae8ec5e1SHisping Lin { 313*c7de5349SHisping Lin return trusty_base_read_security_data("attributes", 314*c7de5349SHisping Lin sizeof("attributes"), attributes, size); 315ae8ec5e1SHisping Lin } 316ae8ec5e1SHisping Lin 317ae8ec5e1SHisping Lin uint32_t trusty_write_permanent_attributes(uint8_t *attributes, uint32_t size) 318ae8ec5e1SHisping Lin { 319*c7de5349SHisping Lin return trusty_base_write_security_data("attributes", 320*c7de5349SHisping Lin sizeof("attributes"), attributes, size); 3216651d4c0SJason Zhu } 322ae8ec5e1SHisping Lin 323*c7de5349SHisping Lin uint32_t trusty_read_permanent_attributes_flag(uint8_t *attributes) 324*c7de5349SHisping Lin { 325*c7de5349SHisping Lin return trusty_base_read_security_data("attributes_flag", 326*c7de5349SHisping Lin sizeof("attributes_flag"), attributes, 1); 327*c7de5349SHisping Lin } 328ae8ec5e1SHisping Lin 329*c7de5349SHisping Lin uint32_t trusty_write_permanent_attributes_flag(uint8_t attributes) 330*c7de5349SHisping Lin { 331*c7de5349SHisping Lin return trusty_base_write_security_data("attributes_flag", 332*c7de5349SHisping Lin sizeof("attributes_flag"), &attributes, 1); 333ae8ec5e1SHisping Lin } 334ae8ec5e1SHisping Lin 335564654ebSJason Zhu uint32_t trusty_read_permanent_attributes_cer(uint8_t *attributes, 336564654ebSJason Zhu uint32_t size) 337564654ebSJason Zhu { 338*c7de5349SHisping Lin return trusty_base_read_security_data("rsacer", 339*c7de5349SHisping Lin sizeof("rsacer"), attributes, size); 340564654ebSJason Zhu } 341564654ebSJason Zhu 342564654ebSJason Zhu uint32_t trusty_write_permanent_attributes_cer(uint8_t *attributes, 343564654ebSJason Zhu uint32_t size) 344564654ebSJason Zhu { 345*c7de5349SHisping Lin return trusty_base_write_security_data("rsacer", 346*c7de5349SHisping Lin sizeof("rsacer"), attributes, size); 347564654ebSJason Zhu } 348564654ebSJason Zhu 349ae8ec5e1SHisping Lin uint32_t trusty_read_lock_state(uint8_t *lock_state) 350ae8ec5e1SHisping Lin { 351*c7de5349SHisping Lin return trusty_base_read_security_data("lock_state", 352*c7de5349SHisping Lin sizeof("lock_state"), lock_state, 1); 353ae8ec5e1SHisping Lin } 354ae8ec5e1SHisping Lin 355ae8ec5e1SHisping Lin uint32_t trusty_write_lock_state(uint8_t lock_state) 356ae8ec5e1SHisping Lin { 357*c7de5349SHisping Lin return trusty_base_write_security_data("lock_state", 358*c7de5349SHisping Lin sizeof("lock_state"), &lock_state, 1); 359ae8ec5e1SHisping Lin } 360ae8ec5e1SHisping Lin 361ae8ec5e1SHisping Lin uint32_t trusty_read_flash_lock_state(uint8_t *flash_lock_state) 362ae8ec5e1SHisping Lin { 363*c7de5349SHisping Lin return trusty_base_read_security_data("flash_lock_state", 364*c7de5349SHisping Lin sizeof("flash_lock_state"), flash_lock_state, 1); 365*c7de5349SHisping Lin } 366*c7de5349SHisping Lin 367*c7de5349SHisping Lin uint32_t trusty_write_flash_lock_state(uint8_t flash_lock_state) 368*c7de5349SHisping Lin { 369*c7de5349SHisping Lin return trusty_base_write_security_data("flash_lock_state", 370*c7de5349SHisping Lin sizeof("flash_lock_state"), &flash_lock_state, 1); 371*c7de5349SHisping Lin } 372*c7de5349SHisping Lin 373*c7de5349SHisping Lin static uint32_t trusty_base_end_efuse_or_otp(void) 374*c7de5349SHisping Lin { 375ae8ec5e1SHisping Lin TEEC_Result TeecResult; 376ae8ec5e1SHisping Lin TEEC_Context TeecContext; 377ae8ec5e1SHisping Lin TEEC_Session TeecSession; 378ae8ec5e1SHisping Lin uint32_t ErrorOrigin; 379*c7de5349SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 380*c7de5349SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 381*c7de5349SHisping Lin 382ae8ec5e1SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 383ae8ec5e1SHisping Lin TEEC_Operation TeecOperation = {0}; 384ae8ec5e1SHisping Lin 385f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 386f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 387f4e1db95SHisping Lin return TeecResult; 388ae8ec5e1SHisping Lin 389ae8ec5e1SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 390f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 391f4e1db95SHisping Lin return TeecResult; 392ae8ec5e1SHisping Lin 393ae8ec5e1SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 394ae8ec5e1SHisping Lin &TeecSession, 395ae8ec5e1SHisping Lin TeecUuid, 396ae8ec5e1SHisping Lin TEEC_LOGIN_PUBLIC, 397ae8ec5e1SHisping Lin NULL, 398*c7de5349SHisping Lin NULL, 399ae8ec5e1SHisping Lin &ErrorOrigin); 400f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 401f4e1db95SHisping Lin return TeecResult; 402ae8ec5e1SHisping Lin 403*c7de5349SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE, 404*c7de5349SHisping Lin TEEC_NONE, 405ae8ec5e1SHisping Lin TEEC_NONE, 406ae8ec5e1SHisping Lin TEEC_NONE); 407ae8ec5e1SHisping Lin 408ae8ec5e1SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 409*c7de5349SHisping Lin STORAGE_CMD_UBOOT_END_OTP, 410ae8ec5e1SHisping Lin &TeecOperation, 411ae8ec5e1SHisping Lin &ErrorOrigin); 412*c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 413*c7de5349SHisping Lin goto exit; 414f4e1db95SHisping Lin exit: 415ae8ec5e1SHisping Lin TEEC_CloseSession(&TeecSession); 41646b2a054SHisping Lin TEEC_FinalizeContext(&TeecContext); 417ae8ec5e1SHisping Lin 418ae8ec5e1SHisping Lin return TeecResult; 419ae8ec5e1SHisping Lin } 420ae8ec5e1SHisping Lin 421*c7de5349SHisping Lin static uint32_t trusty_base_efuse_or_otp_operation(uint32_t cmd, 422*c7de5349SHisping Lin uint8_t is_write, 423*c7de5349SHisping Lin uint32_t *buf, 424*c7de5349SHisping Lin uint32_t length) 425ae8ec5e1SHisping Lin { 426ae8ec5e1SHisping Lin TEEC_Result TeecResult; 427ae8ec5e1SHisping Lin TEEC_Context TeecContext; 428ae8ec5e1SHisping Lin TEEC_Session TeecSession; 429ae8ec5e1SHisping Lin uint32_t ErrorOrigin; 430*c7de5349SHisping Lin 431*c7de5349SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 432*c7de5349SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 433ae8ec5e1SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 434ae8ec5e1SHisping Lin TEEC_Operation TeecOperation = {0}; 435ae8ec5e1SHisping Lin 436f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 437f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 438f4e1db95SHisping Lin return TeecResult; 439ae8ec5e1SHisping Lin 440ae8ec5e1SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 441f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 442f4e1db95SHisping Lin return TeecResult; 443ae8ec5e1SHisping Lin 444ae8ec5e1SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 445ae8ec5e1SHisping Lin &TeecSession, 446ae8ec5e1SHisping Lin TeecUuid, 447ae8ec5e1SHisping Lin TEEC_LOGIN_PUBLIC, 448ae8ec5e1SHisping Lin NULL, 449*c7de5349SHisping Lin NULL, 450ae8ec5e1SHisping Lin &ErrorOrigin); 451f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 452f4e1db95SHisping Lin return TeecResult; 453ae8ec5e1SHisping Lin 454ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 455ae8ec5e1SHisping Lin 456*c7de5349SHisping Lin SharedMem0.size = length * sizeof(uint32_t); 457ae8ec5e1SHisping Lin SharedMem0.flags = 0; 458ae8ec5e1SHisping Lin 459ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 460f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 461f4e1db95SHisping Lin goto exit; 462ae8ec5e1SHisping Lin 463ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 464ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 465ae8ec5e1SHisping Lin 466*c7de5349SHisping Lin if (is_write) { 467*c7de5349SHisping Lin memcpy(SharedMem0.buffer, buf, SharedMem0.size); 468ae8ec5e1SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 469*c7de5349SHisping Lin TEEC_NONE, 470ae8ec5e1SHisping Lin TEEC_NONE, 471ae8ec5e1SHisping Lin TEEC_NONE); 472ae8ec5e1SHisping Lin 473*c7de5349SHisping Lin } else { 474*c7de5349SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT, 475*c7de5349SHisping Lin TEEC_NONE, 476*c7de5349SHisping Lin TEEC_NONE, 477*c7de5349SHisping Lin TEEC_NONE); 478*c7de5349SHisping Lin } 479*c7de5349SHisping Lin 480ae8ec5e1SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 481*c7de5349SHisping Lin cmd, 482ae8ec5e1SHisping Lin &TeecOperation, 483ae8ec5e1SHisping Lin &ErrorOrigin); 484f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 485f4e1db95SHisping Lin goto exit; 486*c7de5349SHisping Lin 487*c7de5349SHisping Lin if (!is_write) 488*c7de5349SHisping Lin memcpy(buf, SharedMem0.buffer, SharedMem0.size); 489*c7de5349SHisping Lin 490f4e1db95SHisping Lin exit: 491ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 492ae8ec5e1SHisping Lin TEEC_CloseSession(&TeecSession); 49346b2a054SHisping Lin TEEC_FinalizeContext(&TeecContext); 494ae8ec5e1SHisping Lin 495ae8ec5e1SHisping Lin return TeecResult; 496ae8ec5e1SHisping Lin } 497ae8ec5e1SHisping Lin 4986ef445a4SHisping Lin uint32_t trusty_read_attribute_hash(uint32_t *buf, uint32_t length) 4996ef445a4SHisping Lin { 500*c7de5349SHisping Lin return trusty_base_efuse_or_otp_operation(STORAGE_CMD_READ_ATTRIBUTE_HASH, 501*c7de5349SHisping Lin false, buf, length); 5026ef445a4SHisping Lin } 5036ef445a4SHisping Lin 5046ef445a4SHisping Lin uint32_t trusty_write_attribute_hash(uint32_t *buf, uint32_t length) 5056ef445a4SHisping Lin { 506*c7de5349SHisping Lin return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_ATTRIBUTE_HASH, 507*c7de5349SHisping Lin true, buf, length); 50816539616SHisping Lin } 50916539616SHisping Lin 51016539616SHisping Lin uint32_t trusty_notify_optee_uboot_end(void) 51116539616SHisping Lin { 51216539616SHisping Lin TEEC_Result res; 513*c7de5349SHisping Lin 514*c7de5349SHisping Lin res = trusty_base_end_security_data(); 515*c7de5349SHisping Lin res |= trusty_base_end_efuse_or_otp(); 51616539616SHisping Lin return res; 51716539616SHisping Lin } 5182cd27853SHisping Lin 5192cd27853SHisping Lin uint32_t trusty_read_vbootkey_hash(uint32_t *buf, uint32_t length) 5202cd27853SHisping Lin { 521*c7de5349SHisping Lin return trusty_base_efuse_or_otp_operation(STORAGE_CMD_READ_VBOOTKEY_HASH, 522*c7de5349SHisping Lin false, buf, length); 5232cd27853SHisping Lin } 524*c7de5349SHisping Lin 5252cd27853SHisping Lin uint32_t trusty_write_vbootkey_hash(uint32_t *buf, uint32_t length) 5262cd27853SHisping Lin { 527*c7de5349SHisping Lin return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_VBOOTKEY_HASH, 528*c7de5349SHisping Lin true, buf, length); 5292cd27853SHisping Lin } 530095e2a82SHisping Lin 531468df3b2SHisping Lin uint32_t trusty_read_vbootkey_enable_flag(uint8_t *flag) 532468df3b2SHisping Lin { 533468df3b2SHisping Lin uint32_t bootflag; 534*c7de5349SHisping Lin TEEC_Result TeecResult; 535468df3b2SHisping Lin 536*c7de5349SHisping Lin TeecResult = trusty_base_efuse_or_otp_operation(STORAGE_CMD_READ_ENABLE_FLAG, 537*c7de5349SHisping Lin false, &bootflag, 1); 538468df3b2SHisping Lin 539468df3b2SHisping Lin if (TeecResult == TEEC_SUCCESS) { 5400202ee8aSHisping Lin #if defined(CONFIG_ROCKCHIP_RK3288) 5410202ee8aSHisping Lin if (bootflag == 0x00000001) 5420202ee8aSHisping Lin *flag = 1; 5430202ee8aSHisping Lin #else 544468df3b2SHisping Lin if (bootflag == 0x000000FF) 545468df3b2SHisping Lin *flag = 1; 5460202ee8aSHisping Lin #endif 547468df3b2SHisping Lin } 548095e2a82SHisping Lin return TeecResult; 549095e2a82SHisping Lin } 5504aa61755SAndy Ye 5514aa61755SAndy Ye uint32_t trusty_attest_dh(uint8_t *dh, uint32_t *dh_size) 5524aa61755SAndy Ye { 5534aa61755SAndy Ye TEEC_Result TeecResult; 5544aa61755SAndy Ye TEEC_Context TeecContext; 5554aa61755SAndy Ye TEEC_Session TeecSession; 5564aa61755SAndy Ye uint32_t ErrorOrigin; 5574aa61755SAndy Ye TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6, 5584aa61755SAndy Ye { 0xa8, 0x69, 0x9c, 0xe6, 5594aa61755SAndy Ye 0x88, 0x6c, 0x5d, 0x5d 5604aa61755SAndy Ye } 5614aa61755SAndy Ye }; 5624aa61755SAndy Ye TEEC_UUID *TeecUuid = &tempuuid; 5634aa61755SAndy Ye TEEC_Operation TeecOperation = {0}; 5643251364cSHisping Lin struct blk_desc *dev_desc; 5653251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 5666651d4c0SJason Zhu if (!dev_desc) { 5676651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 5686651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 5696651d4c0SJason Zhu } 5704aa61755SAndy Ye 571f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 572f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 573f4e1db95SHisping Lin return TeecResult; 5744aa61755SAndy Ye 5754aa61755SAndy Ye TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 576f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 577f4e1db95SHisping Lin return TeecResult; 5784aa61755SAndy Ye 5793251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 5803251364cSHisping Lin TEEC_NONE, 5813251364cSHisping Lin TEEC_NONE, 5823251364cSHisping Lin TEEC_NONE); 5833251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 584b9a7e756SHisping Lin if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0) 585b9a7e756SHisping Lin TeecOperation.params[0].value.a = 1; 586b9a7e756SHisping Lin else 587b9a7e756SHisping Lin TeecOperation.params[0].value.a = 0; 588b9a7e756SHisping Lin 5893251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 5903251364cSHisping Lin TeecOperation.params[0].value.a = 0; 5913251364cSHisping Lin #endif 5923251364cSHisping Lin 5934aa61755SAndy Ye TeecResult = TEEC_OpenSession(&TeecContext, 5944aa61755SAndy Ye &TeecSession, 5954aa61755SAndy Ye TeecUuid, 5964aa61755SAndy Ye TEEC_LOGIN_PUBLIC, 5974aa61755SAndy Ye NULL, 5983251364cSHisping Lin &TeecOperation, 5994aa61755SAndy Ye &ErrorOrigin); 600f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 601f4e1db95SHisping Lin return TeecResult; 6024aa61755SAndy Ye 6034aa61755SAndy Ye TEEC_SharedMemory SharedMem0 = {0}; 6044aa61755SAndy Ye 6054aa61755SAndy Ye SharedMem0.size = *dh_size; 6064aa61755SAndy Ye SharedMem0.flags = 0; 6074aa61755SAndy Ye 6084aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 609f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 610f4e1db95SHisping Lin goto exit; 6114aa61755SAndy Ye 6124aa61755SAndy Ye TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 6134aa61755SAndy Ye TeecOperation.params[0].tmpref.size = SharedMem0.size; 6144aa61755SAndy Ye 6154aa61755SAndy Ye TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, 6164aa61755SAndy Ye TEEC_NONE, 6174aa61755SAndy Ye TEEC_NONE, 6184aa61755SAndy Ye TEEC_NONE); 6194aa61755SAndy Ye 6204aa61755SAndy Ye TeecResult = TEEC_InvokeCommand(&TeecSession, 6214aa61755SAndy Ye 143, 6224aa61755SAndy Ye &TeecOperation, 6234aa61755SAndy Ye &ErrorOrigin); 624f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 625f4e1db95SHisping Lin goto exit; 6264aa61755SAndy Ye 6274aa61755SAndy Ye *dh_size = TeecOperation.params[0].tmpref.size; 6284aa61755SAndy Ye memcpy(dh, SharedMem0.buffer, SharedMem0.size); 629f4e1db95SHisping Lin exit: 6304aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem0); 6314aa61755SAndy Ye TEEC_CloseSession(&TeecSession); 632f4e1db95SHisping Lin TEEC_FinalizeContext(&TeecContext); 6334aa61755SAndy Ye 6344aa61755SAndy Ye return TeecResult; 6354aa61755SAndy Ye } 6364aa61755SAndy Ye 6374aa61755SAndy Ye uint32_t trusty_attest_uuid(uint8_t *uuid, uint32_t *uuid_size) 6384aa61755SAndy Ye { 6394aa61755SAndy Ye TEEC_Result TeecResult; 6404aa61755SAndy Ye TEEC_Context TeecContext; 6414aa61755SAndy Ye TEEC_Session TeecSession; 6424aa61755SAndy Ye uint32_t ErrorOrigin; 6434aa61755SAndy Ye TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6, 6444aa61755SAndy Ye { 0xa8, 0x69, 0x9c, 0xe6, 6454aa61755SAndy Ye 0x88, 0x6c, 0x5d, 0x5d 6464aa61755SAndy Ye } 6474aa61755SAndy Ye }; 6484aa61755SAndy Ye TEEC_UUID *TeecUuid = &tempuuid; 6494aa61755SAndy Ye TEEC_Operation TeecOperation = {0}; 6503251364cSHisping Lin struct blk_desc *dev_desc; 6513251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 6526651d4c0SJason Zhu if (!dev_desc) { 6536651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 6546651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 6556651d4c0SJason Zhu } 6564aa61755SAndy Ye 657f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 658f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 659f4e1db95SHisping Lin return TeecResult; 6604aa61755SAndy Ye 6614aa61755SAndy Ye TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 662f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 663f4e1db95SHisping Lin return TeecResult; 6644aa61755SAndy Ye 6653251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 6663251364cSHisping Lin TEEC_NONE, 6673251364cSHisping Lin TEEC_NONE, 6683251364cSHisping Lin TEEC_NONE); 6693251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 670b9a7e756SHisping Lin if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0) 671b9a7e756SHisping Lin TeecOperation.params[0].value.a = 1; 672b9a7e756SHisping Lin else 673b9a7e756SHisping Lin TeecOperation.params[0].value.a = 0; 674b9a7e756SHisping Lin 6753251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 6763251364cSHisping Lin TeecOperation.params[0].value.a = 0; 6773251364cSHisping Lin #endif 6783251364cSHisping Lin 6794aa61755SAndy Ye TeecResult = TEEC_OpenSession(&TeecContext, 6804aa61755SAndy Ye &TeecSession, 6814aa61755SAndy Ye TeecUuid, 6824aa61755SAndy Ye TEEC_LOGIN_PUBLIC, 6834aa61755SAndy Ye NULL, 6843251364cSHisping Lin &TeecOperation, 6854aa61755SAndy Ye &ErrorOrigin); 686f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 687f4e1db95SHisping Lin return TeecResult; 6884aa61755SAndy Ye 6894aa61755SAndy Ye TEEC_SharedMemory SharedMem0 = {0}; 6904aa61755SAndy Ye 6914aa61755SAndy Ye SharedMem0.size = *uuid_size; 6924aa61755SAndy Ye SharedMem0.flags = 0; 6934aa61755SAndy Ye 6944aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 695f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 696f4e1db95SHisping Lin goto exit; 6974aa61755SAndy Ye 6984aa61755SAndy Ye TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 6994aa61755SAndy Ye TeecOperation.params[0].tmpref.size = SharedMem0.size; 7004aa61755SAndy Ye 7014aa61755SAndy Ye TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, 7024aa61755SAndy Ye TEEC_NONE, 7034aa61755SAndy Ye TEEC_NONE, 7044aa61755SAndy Ye TEEC_NONE); 7054aa61755SAndy Ye 7064aa61755SAndy Ye TeecResult = TEEC_InvokeCommand(&TeecSession, 7074aa61755SAndy Ye 144, 7084aa61755SAndy Ye &TeecOperation, 7094aa61755SAndy Ye &ErrorOrigin); 710f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 711f4e1db95SHisping Lin goto exit; 7124aa61755SAndy Ye 7134aa61755SAndy Ye *uuid_size = TeecOperation.params[0].tmpref.size; 7144aa61755SAndy Ye memcpy(uuid, SharedMem0.buffer, SharedMem0.size); 715f4e1db95SHisping Lin exit: 7164aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem0); 7174aa61755SAndy Ye TEEC_CloseSession(&TeecSession); 718f4e1db95SHisping Lin TEEC_FinalizeContext(&TeecContext); 7194aa61755SAndy Ye 7204aa61755SAndy Ye return TeecResult; 7214aa61755SAndy Ye } 7224aa61755SAndy Ye 7234aa61755SAndy Ye uint32_t trusty_attest_get_ca(uint8_t *operation_start, 7244aa61755SAndy Ye uint32_t *operation_size, 7254aa61755SAndy Ye uint8_t *out, 7264aa61755SAndy Ye uint32_t *out_len) 7274aa61755SAndy Ye { 7284aa61755SAndy Ye TEEC_Result TeecResult; 7294aa61755SAndy Ye TEEC_Context TeecContext; 7304aa61755SAndy Ye TEEC_Session TeecSession; 7314aa61755SAndy Ye uint32_t ErrorOrigin; 7324aa61755SAndy Ye 7334aa61755SAndy Ye TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6, 7344aa61755SAndy Ye { 0xa8, 0x69, 0x9c, 0xe6, 7354aa61755SAndy Ye 0x88, 0x6c, 0x5d, 0x5d 7364aa61755SAndy Ye } 7374aa61755SAndy Ye }; 7384aa61755SAndy Ye 7394aa61755SAndy Ye TEEC_UUID *TeecUuid = &tempuuid; 7404aa61755SAndy Ye TEEC_Operation TeecOperation = {0}; 7413251364cSHisping Lin struct blk_desc *dev_desc; 7423251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 7436651d4c0SJason Zhu if (!dev_desc) { 7446651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 7456651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 7466651d4c0SJason Zhu } 7474aa61755SAndy Ye 748f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 749f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 750f4e1db95SHisping Lin return TeecResult; 7514aa61755SAndy Ye 7524aa61755SAndy Ye TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 753f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 754f4e1db95SHisping Lin return TeecResult; 7554aa61755SAndy Ye 7563251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 7573251364cSHisping Lin TEEC_NONE, 7583251364cSHisping Lin TEEC_NONE, 7593251364cSHisping Lin TEEC_NONE); 7603251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 761b9a7e756SHisping Lin if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0) 762b9a7e756SHisping Lin TeecOperation.params[0].value.a = 1; 763b9a7e756SHisping Lin else 764b9a7e756SHisping Lin TeecOperation.params[0].value.a = 0; 765b9a7e756SHisping Lin 7663251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 7673251364cSHisping Lin TeecOperation.params[0].value.a = 0; 7683251364cSHisping Lin #endif 7693251364cSHisping Lin 7704aa61755SAndy Ye TeecResult = TEEC_OpenSession(&TeecContext, 7714aa61755SAndy Ye &TeecSession, 7724aa61755SAndy Ye TeecUuid, 7734aa61755SAndy Ye TEEC_LOGIN_PUBLIC, 7744aa61755SAndy Ye NULL, 7753251364cSHisping Lin &TeecOperation, 7764aa61755SAndy Ye &ErrorOrigin); 777f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 778f4e1db95SHisping Lin return TeecResult; 7794aa61755SAndy Ye 7804aa61755SAndy Ye TEEC_SharedMemory SharedMem0 = {0}; 7814aa61755SAndy Ye 7824aa61755SAndy Ye SharedMem0.size = *operation_size; 7834aa61755SAndy Ye SharedMem0.flags = 0; 7844aa61755SAndy Ye 7854aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 786f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 787f4e1db95SHisping Lin goto exit; 7884aa61755SAndy Ye 7894aa61755SAndy Ye memcpy(SharedMem0.buffer, operation_start, SharedMem0.size); 7904aa61755SAndy Ye 7914aa61755SAndy Ye TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 7924aa61755SAndy Ye TeecOperation.params[0].tmpref.size = SharedMem0.size; 7934aa61755SAndy Ye 7944aa61755SAndy Ye TEEC_SharedMemory SharedMem1 = {0}; 7954aa61755SAndy Ye 7964aa61755SAndy Ye SharedMem1.size = *out_len; 7974aa61755SAndy Ye SharedMem1.flags = 0; 7984aa61755SAndy Ye 7994aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 800f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 801f4e1db95SHisping Lin goto exit; 8024aa61755SAndy Ye 8034aa61755SAndy Ye TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 8044aa61755SAndy Ye TeecOperation.params[1].tmpref.size = SharedMem1.size; 8054aa61755SAndy Ye 8064aa61755SAndy Ye TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, 8074aa61755SAndy Ye TEEC_MEMREF_TEMP_INOUT, 8084aa61755SAndy Ye TEEC_NONE, 8094aa61755SAndy Ye TEEC_NONE); 8104aa61755SAndy Ye 8114aa61755SAndy Ye TeecResult = TEEC_InvokeCommand(&TeecSession, 8124aa61755SAndy Ye 145, 8134aa61755SAndy Ye &TeecOperation, 8144aa61755SAndy Ye &ErrorOrigin); 815f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 816f4e1db95SHisping Lin goto exit; 8174aa61755SAndy Ye 8184aa61755SAndy Ye *out_len = TeecOperation.params[1].tmpref.size; 8194aa61755SAndy Ye memcpy(out, SharedMem1.buffer, SharedMem1.size); 820f4e1db95SHisping Lin exit: 8214aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem0); 8224aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem1); 823f4e1db95SHisping Lin TEEC_CloseSession(&TeecSession); 824f4e1db95SHisping Lin TEEC_FinalizeContext(&TeecContext); 8254aa61755SAndy Ye 8264aa61755SAndy Ye return TeecResult; 8274aa61755SAndy Ye } 8284aa61755SAndy Ye 8294aa61755SAndy Ye uint32_t trusty_attest_set_ca(uint8_t *ca_response, uint32_t *ca_response_size) 8304aa61755SAndy Ye { 8314aa61755SAndy Ye TEEC_Result TeecResult; 8324aa61755SAndy Ye TEEC_Context TeecContext; 8334aa61755SAndy Ye TEEC_Session TeecSession; 8344aa61755SAndy Ye uint32_t ErrorOrigin; 8354aa61755SAndy Ye TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6, 8364aa61755SAndy Ye { 0xa8, 0x69, 0x9c, 0xe6, 8374aa61755SAndy Ye 0x88, 0x6c, 0x5d, 0x5d 8384aa61755SAndy Ye } 8394aa61755SAndy Ye }; 8404aa61755SAndy Ye TEEC_UUID *TeecUuid = &tempuuid; 8414aa61755SAndy Ye TEEC_Operation TeecOperation = {0}; 8423251364cSHisping Lin struct blk_desc *dev_desc; 8433251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 8446651d4c0SJason Zhu if (!dev_desc) { 8456651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 8466651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 8476651d4c0SJason Zhu } 848f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 849f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 850f4e1db95SHisping Lin return TeecResult; 8514aa61755SAndy Ye 8524aa61755SAndy Ye TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 853f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 854f4e1db95SHisping Lin return TeecResult; 8554aa61755SAndy Ye 8563251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 8573251364cSHisping Lin TEEC_NONE, 8583251364cSHisping Lin TEEC_NONE, 8593251364cSHisping Lin TEEC_NONE); 8603251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 861b9a7e756SHisping Lin if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0) 862b9a7e756SHisping Lin TeecOperation.params[0].value.a = 1; 863b9a7e756SHisping Lin else 864b9a7e756SHisping Lin TeecOperation.params[0].value.a = 0; 865b9a7e756SHisping Lin 8663251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 8673251364cSHisping Lin TeecOperation.params[0].value.a = 0; 8683251364cSHisping Lin #endif 8693251364cSHisping Lin 8704aa61755SAndy Ye TeecResult = TEEC_OpenSession(&TeecContext, 8714aa61755SAndy Ye &TeecSession, 8724aa61755SAndy Ye TeecUuid, 8734aa61755SAndy Ye TEEC_LOGIN_PUBLIC, 8744aa61755SAndy Ye NULL, 8753251364cSHisping Lin &TeecOperation, 8764aa61755SAndy Ye &ErrorOrigin); 877f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 878f4e1db95SHisping Lin return TeecResult; 8794aa61755SAndy Ye 8804aa61755SAndy Ye TEEC_SharedMemory SharedMem0 = {0}; 8814aa61755SAndy Ye 8824aa61755SAndy Ye SharedMem0.size = *ca_response_size; 8834aa61755SAndy Ye SharedMem0.flags = 0; 8844aa61755SAndy Ye 8854aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 886f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 887f4e1db95SHisping Lin goto exit; 8884aa61755SAndy Ye 8894aa61755SAndy Ye memcpy(SharedMem0.buffer, ca_response, SharedMem0.size); 8904aa61755SAndy Ye 8914aa61755SAndy Ye TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 8924aa61755SAndy Ye TeecOperation.params[0].tmpref.size = SharedMem0.size; 8934aa61755SAndy Ye 8944aa61755SAndy Ye TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, 8954aa61755SAndy Ye TEEC_NONE, 8964aa61755SAndy Ye TEEC_NONE, 8974aa61755SAndy Ye TEEC_NONE); 8984aa61755SAndy Ye 8994aa61755SAndy Ye TeecResult = TEEC_InvokeCommand(&TeecSession, 9004aa61755SAndy Ye 146, 9014aa61755SAndy Ye &TeecOperation, 9024aa61755SAndy Ye &ErrorOrigin); 903f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 904f4e1db95SHisping Lin goto exit; 905f4e1db95SHisping Lin exit: 9064aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem0); 9074aa61755SAndy Ye TEEC_CloseSession(&TeecSession); 908f4e1db95SHisping Lin TEEC_FinalizeContext(&TeecContext); 9094aa61755SAndy Ye 9104aa61755SAndy Ye return TeecResult; 9114aa61755SAndy Ye } 912