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> 13*a7df4868Stony.xu #include <stdlib.h> 14*a7df4868Stony.xu 15*a7df4868Stony.xu #define BOOT_FROM_EMMC (1 << 1) 16*a7df4868Stony.xu 17*a7df4868Stony.xu uint32_t rk_send_keybox_to_ta(uint8_t *filename, uint32_t filename_size, 18*a7df4868Stony.xu TEEC_UUID uuid, 19*a7df4868Stony.xu uint8_t *key, uint32_t key_size, 20*a7df4868Stony.xu uint8_t *data, uint32_t data_size) 21*a7df4868Stony.xu { 22*a7df4868Stony.xu TEEC_Result TeecResult; 23*a7df4868Stony.xu TEEC_Context TeecContext; 24*a7df4868Stony.xu TEEC_Session TeecSession; 25*a7df4868Stony.xu uint32_t ErrorOrigin; 26*a7df4868Stony.xu 27*a7df4868Stony.xu TEEC_UUID *TeecUuid = &uuid; 28*a7df4868Stony.xu TEEC_Operation TeecOperation = {0}; 29*a7df4868Stony.xu 30*a7df4868Stony.xu struct blk_desc *dev_desc; 31*a7df4868Stony.xu 32*a7df4868Stony.xu dev_desc = rockchip_get_bootdev(); 33*a7df4868Stony.xu if (!dev_desc) { 34*a7df4868Stony.xu printf("%s: dev_desc is NULL!\n", __func__); 35*a7df4868Stony.xu return -TEEC_ERROR_GENERIC; 36*a7df4868Stony.xu } 37*a7df4868Stony.xu 38*a7df4868Stony.xu OpteeClientApiLibInitialize(); 39*a7df4868Stony.xu TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 40*a7df4868Stony.xu TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 41*a7df4868Stony.xu TEEC_NONE, 42*a7df4868Stony.xu TEEC_NONE, 43*a7df4868Stony.xu TEEC_NONE); 44*a7df4868Stony.xu 45*a7df4868Stony.xu /* 0 nand or emmc "security" partition , 1 rpmb */ 46*a7df4868Stony.xu TeecOperation.params[0].value.a = 47*a7df4868Stony.xu (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0; 48*a7df4868Stony.xu #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 49*a7df4868Stony.xu TeecOperation.params[0].value.a = 0; 50*a7df4868Stony.xu #endif 51*a7df4868Stony.xu TeecResult = TEEC_OpenSession(&TeecContext, 52*a7df4868Stony.xu &TeecSession, 53*a7df4868Stony.xu TeecUuid, 54*a7df4868Stony.xu TEEC_LOGIN_PUBLIC, 55*a7df4868Stony.xu NULL, 56*a7df4868Stony.xu &TeecOperation, 57*a7df4868Stony.xu &ErrorOrigin); 58*a7df4868Stony.xu 59*a7df4868Stony.xu TEEC_SharedMemory SharedMem0 = {0}; 60*a7df4868Stony.xu 61*a7df4868Stony.xu SharedMem0.size = filename_size; 62*a7df4868Stony.xu SharedMem0.flags = 0; 63*a7df4868Stony.xu 64*a7df4868Stony.xu TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 65*a7df4868Stony.xu 66*a7df4868Stony.xu memcpy(SharedMem0.buffer, filename, SharedMem0.size); 67*a7df4868Stony.xu 68*a7df4868Stony.xu TEEC_SharedMemory SharedMem1 = {0}; 69*a7df4868Stony.xu 70*a7df4868Stony.xu SharedMem1.size = key_size; 71*a7df4868Stony.xu SharedMem1.flags = 0; 72*a7df4868Stony.xu 73*a7df4868Stony.xu TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 74*a7df4868Stony.xu 75*a7df4868Stony.xu memcpy(SharedMem1.buffer, key, SharedMem1.size); 76*a7df4868Stony.xu 77*a7df4868Stony.xu TEEC_SharedMemory SharedMem2 = {0}; 78*a7df4868Stony.xu 79*a7df4868Stony.xu SharedMem2.size = data_size; 80*a7df4868Stony.xu SharedMem2.flags = 0; 81*a7df4868Stony.xu 82*a7df4868Stony.xu TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem2); 83*a7df4868Stony.xu 84*a7df4868Stony.xu memcpy(SharedMem2.buffer, data, SharedMem2.size); 85*a7df4868Stony.xu 86*a7df4868Stony.xu TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 87*a7df4868Stony.xu TeecOperation.params[0].tmpref.size = SharedMem0.size; 88*a7df4868Stony.xu 89*a7df4868Stony.xu TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 90*a7df4868Stony.xu TeecOperation.params[1].tmpref.size = SharedMem1.size; 91*a7df4868Stony.xu 92*a7df4868Stony.xu TeecOperation.params[2].tmpref.buffer = SharedMem2.buffer; 93*a7df4868Stony.xu TeecOperation.params[2].tmpref.size = SharedMem2.size; 94*a7df4868Stony.xu 95*a7df4868Stony.xu TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 96*a7df4868Stony.xu TEEC_MEMREF_TEMP_INPUT, 97*a7df4868Stony.xu TEEC_MEMREF_TEMP_INOUT, 98*a7df4868Stony.xu TEEC_NONE); 99*a7df4868Stony.xu 100*a7df4868Stony.xu printf("check: does keybox exised in secure storage...\n"); 101*a7df4868Stony.xu TeecResult = TEEC_InvokeCommand(&TeecSession, 102*a7df4868Stony.xu 122, 103*a7df4868Stony.xu &TeecOperation, 104*a7df4868Stony.xu &ErrorOrigin); 105*a7df4868Stony.xu if (TeecResult != TEEC_SUCCESS) { 106*a7df4868Stony.xu printf("no keybox in secure storage, write keybox to secure storage\n"); 107*a7df4868Stony.xu TeecResult = TEEC_InvokeCommand(&TeecSession, 108*a7df4868Stony.xu 121, 109*a7df4868Stony.xu &TeecOperation, 110*a7df4868Stony.xu &ErrorOrigin); 111*a7df4868Stony.xu if (TeecResult != TEEC_SUCCESS) { 112*a7df4868Stony.xu printf("send data to TA failed with code 0x%x\n", TeecResult); 113*a7df4868Stony.xu } else { 114*a7df4868Stony.xu printf("send data to TA success with code 0x%x\n", TeecResult); 115*a7df4868Stony.xu } 116*a7df4868Stony.xu } 117*a7df4868Stony.xu TEEC_ReleaseSharedMemory(&SharedMem0); 118*a7df4868Stony.xu TEEC_ReleaseSharedMemory(&SharedMem1); 119*a7df4868Stony.xu TEEC_ReleaseSharedMemory(&SharedMem2); 120*a7df4868Stony.xu 121*a7df4868Stony.xu TEEC_CloseSession(&TeecSession); 122*a7df4868Stony.xu TEEC_FinalizeContext(&TeecContext); 123*a7df4868Stony.xu 124*a7df4868Stony.xu return TeecResult; 125*a7df4868Stony.xu } 126*a7df4868Stony.xu 127*a7df4868Stony.xu int write_keybox_to_secure_storage(uint8_t *uboot_data, uint32_t len) 128*a7df4868Stony.xu { 129*a7df4868Stony.xu typedef struct VENDOR_DATA { 130*a7df4868Stony.xu uint8_t tag[4]; 131*a7df4868Stony.xu uint32_t key_size; 132*a7df4868Stony.xu uint32_t data_size; 133*a7df4868Stony.xu uint8_t *all_data; 134*a7df4868Stony.xu } VENDOR_DATA; 135*a7df4868Stony.xu 136*a7df4868Stony.xu uint8_t *key = NULL; 137*a7df4868Stony.xu uint8_t *data = NULL; 138*a7df4868Stony.xu VENDOR_DATA tmp_data; 139*a7df4868Stony.xu 140*a7df4868Stony.xu memset(&tmp_data, 0, sizeof(VENDOR_DATA)); 141*a7df4868Stony.xu memcpy(tmp_data.tag, uboot_data, 4); 142*a7df4868Stony.xu tmp_data.key_size = *(uboot_data + 4); 143*a7df4868Stony.xu tmp_data.data_size = *(uboot_data + 8); 144*a7df4868Stony.xu tmp_data.all_data = malloc(tmp_data.key_size + tmp_data.data_size); 145*a7df4868Stony.xu memcpy(tmp_data.all_data, uboot_data + 12, 146*a7df4868Stony.xu tmp_data.key_size + tmp_data.data_size); 147*a7df4868Stony.xu 148*a7df4868Stony.xu uint8_t widevine_tag[] = {'K', 'B', 'O', 'X'}; 149*a7df4868Stony.xu uint8_t tag[] = {0}; 150*a7df4868Stony.xu 151*a7df4868Stony.xu uint32_t object_id = 101; 152*a7df4868Stony.xu 153*a7df4868Stony.xu TEEC_UUID tmp_uuid; 154*a7df4868Stony.xu 155*a7df4868Stony.xu if (memcmp(uboot_data, widevine_tag, 4) == 0) { 156*a7df4868Stony.xu TEEC_UUID widevine_uuid = { 0xc11fe8ac, 0xb997, 0x48cf, 157*a7df4868Stony.xu { 0xa2, 0x8d, 0xe2, 0xa5, 0x5e, 0x52, 0x40, 0xef} }; 158*a7df4868Stony.xu tmp_uuid = widevine_uuid; 159*a7df4868Stony.xu memcpy(tag, uboot_data, 4); 160*a7df4868Stony.xu printf("check tag success! %s\n", tag); 161*a7df4868Stony.xu } else { 162*a7df4868Stony.xu memcpy(tag, uboot_data, 4); 163*a7df4868Stony.xu printf("check tag failed! %s\n", tag); 164*a7df4868Stony.xu } 165*a7df4868Stony.xu 166*a7df4868Stony.xu key = malloc(tmp_data.key_size); 167*a7df4868Stony.xu if (!key) { 168*a7df4868Stony.xu printf("Malloc key failed!!\n"); 169*a7df4868Stony.xu goto reboot; 170*a7df4868Stony.xu } 171*a7df4868Stony.xu 172*a7df4868Stony.xu data = malloc(tmp_data.data_size); 173*a7df4868Stony.xu if (!data) { 174*a7df4868Stony.xu printf("Malloc data failed!!\n"); 175*a7df4868Stony.xu goto reboot; 176*a7df4868Stony.xu } 177*a7df4868Stony.xu 178*a7df4868Stony.xu memcpy(key, tmp_data.all_data, tmp_data.key_size); 179*a7df4868Stony.xu memcpy(data, tmp_data.all_data + tmp_data.key_size, 180*a7df4868Stony.xu tmp_data.data_size); 181*a7df4868Stony.xu 182*a7df4868Stony.xu rk_send_keybox_to_ta((uint8_t *)&object_id, sizeof(uint32_t), 183*a7df4868Stony.xu tmp_uuid, 184*a7df4868Stony.xu key, tmp_data.key_size, 185*a7df4868Stony.xu data, tmp_data.data_size); 186*a7df4868Stony.xu reboot: 187*a7df4868Stony.xu if (key) 188*a7df4868Stony.xu free(key); 189*a7df4868Stony.xu if (data) 190*a7df4868Stony.xu free(data); 191*a7df4868Stony.xu if (tmp_data.all_data) 192*a7df4868Stony.xu free(tmp_data.all_data); 193*a7df4868Stony.xu 194*a7df4868Stony.xu memset(&tmp_data, 0, sizeof(VENDOR_DATA)); 195*a7df4868Stony.xu return 0; 196*a7df4868Stony.xu } 197ae8ec5e1SHisping Lin 198ae8ec5e1SHisping Lin void test_optee(void) 199ae8ec5e1SHisping Lin { 200ae8ec5e1SHisping Lin TEEC_Result TeecResult; 201ae8ec5e1SHisping Lin TEEC_Context TeecContext; 202ae8ec5e1SHisping Lin TEEC_Session TeecSession; 203ae8ec5e1SHisping Lin uint32_t ErrorOrigin; 204*a7df4868Stony.xu TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, \ 205ae8ec5e1SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 206ae8ec5e1SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 207ae8ec5e1SHisping Lin TEEC_Operation TeecOperation = {0}; 2083251364cSHisping Lin struct blk_desc *dev_desc; 2093251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 2106651d4c0SJason Zhu if (!dev_desc) { 2116651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 2126651d4c0SJason Zhu return; 2136651d4c0SJason Zhu } 214ae8ec5e1SHisping Lin 215ae8ec5e1SHisping Lin debug("testmm start\n"); 216ae8ec5e1SHisping Lin OpteeClientApiLibInitialize(); 217ae8ec5e1SHisping Lin 218ae8ec5e1SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 219ae8ec5e1SHisping Lin 2203251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 2213251364cSHisping Lin TEEC_NONE, 2223251364cSHisping Lin TEEC_NONE, 2233251364cSHisping Lin TEEC_NONE); 2243251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 2253251364cSHisping Lin TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0; 2263251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 2273251364cSHisping Lin TeecOperation.params[0].value.a = 0; 2283251364cSHisping Lin #endif 2293251364cSHisping Lin 230ae8ec5e1SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 231ae8ec5e1SHisping Lin &TeecSession, 232ae8ec5e1SHisping Lin TeecUuid, 233ae8ec5e1SHisping Lin TEEC_LOGIN_PUBLIC, 234ae8ec5e1SHisping Lin NULL, 2353251364cSHisping Lin &TeecOperation, 236ae8ec5e1SHisping Lin &ErrorOrigin); 237ae8ec5e1SHisping Lin 238ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 239ae8ec5e1SHisping Lin 240ae8ec5e1SHisping Lin SharedMem0.size = sizeof("filename_test"); 241ae8ec5e1SHisping Lin SharedMem0.flags = 0; 242ae8ec5e1SHisping Lin 243ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 244ae8ec5e1SHisping Lin 245ae8ec5e1SHisping Lin memcpy(SharedMem0.buffer, "filename_test", SharedMem0.size); 246ae8ec5e1SHisping Lin 247ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem1 = {0}; 248ae8ec5e1SHisping Lin 249ae8ec5e1SHisping Lin SharedMem1.size = 32; 250ae8ec5e1SHisping Lin SharedMem1.flags = 0; 251ae8ec5e1SHisping Lin 252ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 253ae8ec5e1SHisping Lin 254ae8ec5e1SHisping Lin memset(SharedMem1.buffer, 'a', SharedMem1.size); 255ae8ec5e1SHisping Lin 256ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 257ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 258ae8ec5e1SHisping Lin 259ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 260ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem1.size; 261ae8ec5e1SHisping Lin 262ae8ec5e1SHisping Lin 263ae8ec5e1SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 264ae8ec5e1SHisping Lin TEEC_MEMREF_TEMP_INOUT, 265ae8ec5e1SHisping Lin TEEC_NONE, 266ae8ec5e1SHisping Lin TEEC_NONE); 267ae8ec5e1SHisping Lin 268ae8ec5e1SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 269ae8ec5e1SHisping Lin 1, 270ae8ec5e1SHisping Lin &TeecOperation, 271ae8ec5e1SHisping Lin &ErrorOrigin); 272ae8ec5e1SHisping Lin 273ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 274ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem1); 275ae8ec5e1SHisping Lin 276ae8ec5e1SHisping Lin TEEC_CloseSession(&TeecSession); 277ae8ec5e1SHisping Lin 27846b2a054SHisping Lin TEEC_FinalizeContext(&TeecContext); 279ae8ec5e1SHisping Lin 280ae8ec5e1SHisping Lin debug("testmm end\n"); 281ae8ec5e1SHisping Lin debug("TeecResult %x\n", TeecResult); 282ae8ec5e1SHisping Lin } 283ae8ec5e1SHisping Lin 284ae8ec5e1SHisping Lin static uint8_t b2hs_add_base(uint8_t in) 285ae8ec5e1SHisping Lin { 286ae8ec5e1SHisping Lin if (in > 9) 287ae8ec5e1SHisping Lin return in + 55; 288ae8ec5e1SHisping Lin else 289ae8ec5e1SHisping Lin return in + 48; 290ae8ec5e1SHisping Lin } 291ae8ec5e1SHisping Lin 292ae8ec5e1SHisping Lin uint32_t b2hs(uint8_t *b, uint8_t *hs, uint32_t blen, uint32_t hslen) 293ae8ec5e1SHisping Lin { 294ae8ec5e1SHisping Lin uint32_t i = 0; 295ae8ec5e1SHisping Lin 296ae8ec5e1SHisping Lin if (blen * 2 + 1 > hslen) 297ae8ec5e1SHisping Lin return 0; 298ae8ec5e1SHisping Lin 299ae8ec5e1SHisping Lin for (; i < blen; i++) { 300ae8ec5e1SHisping Lin hs[i * 2 + 1] = b2hs_add_base(b[i] & 0xf); 301ae8ec5e1SHisping Lin hs[i * 2] = b2hs_add_base(b[i] >> 4); 302ae8ec5e1SHisping Lin } 303ae8ec5e1SHisping Lin hs[blen * 2] = 0; 304ae8ec5e1SHisping Lin 305ae8ec5e1SHisping Lin return blen * 2; 306ae8ec5e1SHisping Lin } 307ae8ec5e1SHisping Lin 308ae8ec5e1SHisping Lin 309ae8ec5e1SHisping Lin uint32_t trusty_read_rollback_index(uint32_t slot, uint64_t *value) 310ae8ec5e1SHisping Lin { 311ae8ec5e1SHisping Lin TEEC_Result TeecResult; 312ae8ec5e1SHisping Lin TEEC_Context TeecContext; 313ae8ec5e1SHisping Lin TEEC_Session TeecSession; 314ae8ec5e1SHisping Lin uint32_t ErrorOrigin; 315ae8ec5e1SHisping Lin TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 316ae8ec5e1SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 317ae8ec5e1SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 318ae8ec5e1SHisping Lin TEEC_Operation TeecOperation = {0}; 319ae8ec5e1SHisping Lin uint8_t hs[9]; 320ae8ec5e1SHisping Lin 3213251364cSHisping Lin struct blk_desc *dev_desc; 3223251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 3236651d4c0SJason Zhu if (!dev_desc) { 3246651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 3256651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 3266651d4c0SJason Zhu } 3273251364cSHisping Lin 328ae8ec5e1SHisping Lin b2hs((uint8_t *)&slot, hs, 4, 9); 329ae8ec5e1SHisping Lin debug("testmm start\n"); 330ae8ec5e1SHisping Lin OpteeClientApiLibInitialize(); 331ae8ec5e1SHisping Lin 332ae8ec5e1SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 333ae8ec5e1SHisping Lin 3343251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 3353251364cSHisping Lin TEEC_NONE, 3363251364cSHisping Lin TEEC_NONE, 3373251364cSHisping Lin TEEC_NONE); 3383251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 3393251364cSHisping Lin TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0; 3403251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 3413251364cSHisping Lin TeecOperation.params[0].value.a = 0; 3423251364cSHisping Lin #endif 3433251364cSHisping Lin 344ae8ec5e1SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 345ae8ec5e1SHisping Lin &TeecSession, 346ae8ec5e1SHisping Lin TeecUuid, 347ae8ec5e1SHisping Lin TEEC_LOGIN_PUBLIC, 348ae8ec5e1SHisping Lin NULL, 3493251364cSHisping Lin &TeecOperation, 350f303baf0SHisping Lin 351ae8ec5e1SHisping Lin &ErrorOrigin); 352ae8ec5e1SHisping Lin 353ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 354ae8ec5e1SHisping Lin 355ae8ec5e1SHisping Lin SharedMem0.size = 8; 356ae8ec5e1SHisping Lin SharedMem0.flags = 0; 357ae8ec5e1SHisping Lin 358ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 359ae8ec5e1SHisping Lin 360ae8ec5e1SHisping Lin memcpy(SharedMem0.buffer, hs, SharedMem0.size); 361ae8ec5e1SHisping Lin 362ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem1 = {0}; 363ae8ec5e1SHisping Lin 364ae8ec5e1SHisping Lin SharedMem1.size = 8; 365ae8ec5e1SHisping Lin SharedMem1.flags = 0; 366ae8ec5e1SHisping Lin 367ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 368ae8ec5e1SHisping Lin 369ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 370ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 371ae8ec5e1SHisping Lin 372ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 373ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem1.size; 374ae8ec5e1SHisping Lin 375ae8ec5e1SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 376ae8ec5e1SHisping Lin TEEC_MEMREF_TEMP_INOUT, 377ae8ec5e1SHisping Lin TEEC_NONE, 378ae8ec5e1SHisping Lin TEEC_NONE); 379ae8ec5e1SHisping Lin 380ae8ec5e1SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 381ae8ec5e1SHisping Lin 0, 382ae8ec5e1SHisping Lin &TeecOperation, 383ae8ec5e1SHisping Lin &ErrorOrigin); 38446b2a054SHisping Lin if (TeecResult == TEEC_SUCCESS) 385ae8ec5e1SHisping Lin memcpy((char *)value, SharedMem1.buffer, SharedMem1.size); 386ae8ec5e1SHisping Lin 387ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 388ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem1); 389ae8ec5e1SHisping Lin 390ae8ec5e1SHisping Lin TEEC_CloseSession(&TeecSession); 391ae8ec5e1SHisping Lin 39246b2a054SHisping Lin TEEC_FinalizeContext(&TeecContext); 393ae8ec5e1SHisping Lin 394ae8ec5e1SHisping Lin debug("testmm end\n"); 395ae8ec5e1SHisping Lin return TeecResult; 396ae8ec5e1SHisping Lin } 397ae8ec5e1SHisping Lin 398ae8ec5e1SHisping Lin uint32_t trusty_write_rollback_index(uint32_t slot, uint64_t value) 399ae8ec5e1SHisping Lin { 400ae8ec5e1SHisping Lin TEEC_Result TeecResult; 401ae8ec5e1SHisping Lin TEEC_Context TeecContext; 402ae8ec5e1SHisping Lin TEEC_Session TeecSession; 403ae8ec5e1SHisping Lin uint32_t ErrorOrigin; 404ae8ec5e1SHisping Lin TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 405ae8ec5e1SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 406ae8ec5e1SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 407ae8ec5e1SHisping Lin TEEC_Operation TeecOperation = {0}; 408ae8ec5e1SHisping Lin uint8_t hs[9]; 4093251364cSHisping Lin struct blk_desc *dev_desc; 4103251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 4116651d4c0SJason Zhu if (!dev_desc) { 4126651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 4136651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 4146651d4c0SJason Zhu } 4153251364cSHisping Lin 416ae8ec5e1SHisping Lin b2hs((uint8_t *)&slot, hs, 4, 9); 417ae8ec5e1SHisping Lin OpteeClientApiLibInitialize(); 418ae8ec5e1SHisping Lin 419ae8ec5e1SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 420ae8ec5e1SHisping Lin 4213251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 4223251364cSHisping Lin TEEC_NONE, 4233251364cSHisping Lin TEEC_NONE, 4243251364cSHisping Lin TEEC_NONE); 4253251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 4263251364cSHisping Lin TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0; 4273251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 4283251364cSHisping Lin TeecOperation.params[0].value.a = 0; 4293251364cSHisping Lin #endif 4303251364cSHisping Lin 431ae8ec5e1SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 432ae8ec5e1SHisping Lin &TeecSession, 433ae8ec5e1SHisping Lin TeecUuid, 434ae8ec5e1SHisping Lin TEEC_LOGIN_PUBLIC, 435ae8ec5e1SHisping Lin NULL, 4363251364cSHisping Lin &TeecOperation, 437ae8ec5e1SHisping Lin &ErrorOrigin); 438ae8ec5e1SHisping Lin 439ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 440ae8ec5e1SHisping Lin 441ae8ec5e1SHisping Lin SharedMem0.size = 8; 442ae8ec5e1SHisping Lin SharedMem0.flags = 0; 443ae8ec5e1SHisping Lin 444ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 445ae8ec5e1SHisping Lin 446ae8ec5e1SHisping Lin memcpy(SharedMem0.buffer, hs, SharedMem0.size); 447ae8ec5e1SHisping Lin 448ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem1 = {0}; 449ae8ec5e1SHisping Lin 450ae8ec5e1SHisping Lin SharedMem1.size = 8; 451ae8ec5e1SHisping Lin SharedMem1.flags = 0; 452ae8ec5e1SHisping Lin 453ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 454ae8ec5e1SHisping Lin 455ae8ec5e1SHisping Lin memcpy(SharedMem1.buffer, (char *)&value, SharedMem1.size); 456ae8ec5e1SHisping Lin 457ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 458ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 459ae8ec5e1SHisping Lin 460ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 461ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem1.size; 462ae8ec5e1SHisping Lin 463ae8ec5e1SHisping Lin 464ae8ec5e1SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 465ae8ec5e1SHisping Lin TEEC_MEMREF_TEMP_INOUT, 466ae8ec5e1SHisping Lin TEEC_NONE, 467ae8ec5e1SHisping Lin TEEC_NONE); 468ae8ec5e1SHisping Lin 469ae8ec5e1SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 470ae8ec5e1SHisping Lin 1, 471ae8ec5e1SHisping Lin &TeecOperation, 472ae8ec5e1SHisping Lin &ErrorOrigin); 473ae8ec5e1SHisping Lin 474ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 475ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem1); 476ae8ec5e1SHisping Lin 477ae8ec5e1SHisping Lin TEEC_CloseSession(&TeecSession); 478ae8ec5e1SHisping Lin 47946b2a054SHisping Lin TEEC_FinalizeContext(&TeecContext); 480ae8ec5e1SHisping Lin 481ae8ec5e1SHisping Lin debug("testmm end\n"); 482ae8ec5e1SHisping Lin 483ae8ec5e1SHisping Lin return TeecResult; 484ae8ec5e1SHisping Lin } 485ae8ec5e1SHisping Lin 486ae8ec5e1SHisping Lin uint32_t trusty_read_permanent_attributes(uint8_t *attributes, uint32_t size) 487ae8ec5e1SHisping Lin { 488ae8ec5e1SHisping Lin TEEC_Result TeecResult; 489ae8ec5e1SHisping Lin TEEC_Context TeecContext; 490ae8ec5e1SHisping Lin TEEC_Session TeecSession; 491ae8ec5e1SHisping Lin uint32_t ErrorOrigin; 49246b2a054SHisping Lin TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6, 49346b2a054SHisping Lin { 0xa8, 0x69, 0x9c, 0xe6, 0x88, 0x6c, 0x5d, 0x5d } }; 494ae8ec5e1SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 495ae8ec5e1SHisping Lin TEEC_Operation TeecOperation = {0}; 4963251364cSHisping Lin struct blk_desc *dev_desc; 4973251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 4986651d4c0SJason Zhu if (!dev_desc) { 4996651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 5006651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 5016651d4c0SJason Zhu } 502ae8ec5e1SHisping Lin 503ae8ec5e1SHisping Lin debug("testmm start\n"); 504ae8ec5e1SHisping Lin OpteeClientApiLibInitialize(); 505ae8ec5e1SHisping Lin 506ae8ec5e1SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 507ae8ec5e1SHisping Lin 5083251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 5093251364cSHisping Lin TEEC_NONE, 5103251364cSHisping Lin TEEC_NONE, 5113251364cSHisping Lin TEEC_NONE); 5123251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 5133251364cSHisping Lin TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0; 5143251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 5153251364cSHisping Lin TeecOperation.params[0].value.a = 0; 5163251364cSHisping Lin #endif 5173251364cSHisping Lin 518ae8ec5e1SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 519ae8ec5e1SHisping Lin &TeecSession, 520ae8ec5e1SHisping Lin TeecUuid, 521ae8ec5e1SHisping Lin TEEC_LOGIN_PUBLIC, 522ae8ec5e1SHisping Lin NULL, 5233251364cSHisping Lin &TeecOperation, 524ae8ec5e1SHisping Lin &ErrorOrigin); 525ae8ec5e1SHisping Lin 526ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 527ae8ec5e1SHisping Lin 528ae8ec5e1SHisping Lin SharedMem0.size = sizeof("attributes"); 529ae8ec5e1SHisping Lin SharedMem0.flags = 0; 530ae8ec5e1SHisping Lin 531ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 532ae8ec5e1SHisping Lin 533ae8ec5e1SHisping Lin memcpy(SharedMem0.buffer, "attributes", SharedMem0.size); 534ae8ec5e1SHisping Lin 535ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem1 = {0}; 536ae8ec5e1SHisping Lin 537ae8ec5e1SHisping Lin SharedMem1.size = size; 538ae8ec5e1SHisping Lin SharedMem1.flags = 0; 539ae8ec5e1SHisping Lin 540ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 541ae8ec5e1SHisping Lin 542ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 543ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 544ae8ec5e1SHisping Lin 545ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 546ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem1.size; 547ae8ec5e1SHisping Lin 548ae8ec5e1SHisping Lin 549ae8ec5e1SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 550ae8ec5e1SHisping Lin TEEC_MEMREF_TEMP_INOUT, 551ae8ec5e1SHisping Lin TEEC_NONE, 552ae8ec5e1SHisping Lin TEEC_NONE); 553ae8ec5e1SHisping Lin 554ae8ec5e1SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 55546b2a054SHisping Lin 142, 556ae8ec5e1SHisping Lin &TeecOperation, 557ae8ec5e1SHisping Lin &ErrorOrigin); 55846b2a054SHisping Lin if (TeecResult == TEEC_SUCCESS) 559ae8ec5e1SHisping Lin memcpy(attributes, SharedMem1.buffer, SharedMem1.size); 560ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 561ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem1); 562ae8ec5e1SHisping Lin TEEC_CloseSession(&TeecSession); 56346b2a054SHisping Lin TEEC_FinalizeContext(&TeecContext); 564ae8ec5e1SHisping Lin debug("testmm end\n"); 565ae8ec5e1SHisping Lin 566ae8ec5e1SHisping Lin return TeecResult; 567ae8ec5e1SHisping Lin } 568ae8ec5e1SHisping Lin 569ae8ec5e1SHisping Lin uint32_t trusty_write_permanent_attributes(uint8_t *attributes, uint32_t size) 570ae8ec5e1SHisping Lin { 571ae8ec5e1SHisping Lin TEEC_Result TeecResult; 572ae8ec5e1SHisping Lin TEEC_Context TeecContext; 573ae8ec5e1SHisping Lin TEEC_Session TeecSession; 574ae8ec5e1SHisping Lin uint32_t ErrorOrigin; 57546b2a054SHisping Lin TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6, 57646b2a054SHisping Lin { 0xa8, 0x69, 0x9c, 0xe6, 0x88, 0x6c, 0x5d, 0x5d } }; 577ae8ec5e1SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 578ae8ec5e1SHisping Lin TEEC_Operation TeecOperation = {0}; 5793251364cSHisping Lin struct blk_desc *dev_desc; 5803251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 5816651d4c0SJason Zhu if (!dev_desc) { 5826651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 5836651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 5846651d4c0SJason Zhu } 585ae8ec5e1SHisping Lin 586ae8ec5e1SHisping Lin debug("testmm start\n"); 587ae8ec5e1SHisping Lin OpteeClientApiLibInitialize(); 588ae8ec5e1SHisping Lin 589ae8ec5e1SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 590ae8ec5e1SHisping Lin 5913251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 5923251364cSHisping Lin TEEC_NONE, 5933251364cSHisping Lin TEEC_NONE, 5943251364cSHisping Lin TEEC_NONE); 5953251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 5963251364cSHisping Lin TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0; 5973251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 5983251364cSHisping Lin TeecOperation.params[0].value.a = 0; 5993251364cSHisping Lin #endif 6003251364cSHisping Lin 601ae8ec5e1SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 602ae8ec5e1SHisping Lin &TeecSession, 603ae8ec5e1SHisping Lin TeecUuid, 604ae8ec5e1SHisping Lin TEEC_LOGIN_PUBLIC, 605ae8ec5e1SHisping Lin NULL, 6063251364cSHisping Lin &TeecOperation, 607ae8ec5e1SHisping Lin &ErrorOrigin); 608ae8ec5e1SHisping Lin 609ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 610ae8ec5e1SHisping Lin 611ae8ec5e1SHisping Lin SharedMem0.size = sizeof("attributes"); 612ae8ec5e1SHisping Lin SharedMem0.flags = 0; 613ae8ec5e1SHisping Lin 614ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 615ae8ec5e1SHisping Lin 616ae8ec5e1SHisping Lin memcpy(SharedMem0.buffer, "attributes", SharedMem0.size); 617ae8ec5e1SHisping Lin 618ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem1 = {0}; 619ae8ec5e1SHisping Lin 620ae8ec5e1SHisping Lin SharedMem1.size = size; 621ae8ec5e1SHisping Lin SharedMem1.flags = 0; 622ae8ec5e1SHisping Lin 623ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 624ae8ec5e1SHisping Lin 625ae8ec5e1SHisping Lin memcpy(SharedMem1.buffer, attributes, SharedMem1.size); 626ae8ec5e1SHisping Lin 627ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 628ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 629ae8ec5e1SHisping Lin 630ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 631ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem1.size; 632ae8ec5e1SHisping Lin 633ae8ec5e1SHisping Lin 634ae8ec5e1SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 635ae8ec5e1SHisping Lin TEEC_MEMREF_TEMP_INOUT, 636ae8ec5e1SHisping Lin TEEC_NONE, 637ae8ec5e1SHisping Lin TEEC_NONE); 638ae8ec5e1SHisping Lin 639ae8ec5e1SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 64046b2a054SHisping Lin 141, 641ae8ec5e1SHisping Lin &TeecOperation, 642ae8ec5e1SHisping Lin &ErrorOrigin); 643ae8ec5e1SHisping Lin 644ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 645ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem1); 646ae8ec5e1SHisping Lin TEEC_CloseSession(&TeecSession); 64746b2a054SHisping Lin TEEC_FinalizeContext(&TeecContext); 648ae8ec5e1SHisping Lin debug("testmm end\n"); 649ae8ec5e1SHisping Lin 650ae8ec5e1SHisping Lin return TeecResult; 651ae8ec5e1SHisping Lin } 652ae8ec5e1SHisping Lin 653ae8ec5e1SHisping Lin uint32_t trusty_read_lock_state(uint8_t *lock_state) 654ae8ec5e1SHisping Lin { 655ae8ec5e1SHisping Lin TEEC_Result TeecResult; 656ae8ec5e1SHisping Lin TEEC_Context TeecContext; 657ae8ec5e1SHisping Lin TEEC_Session TeecSession; 658ae8ec5e1SHisping Lin uint32_t ErrorOrigin; 659ae8ec5e1SHisping Lin TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 660ae8ec5e1SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 661ae8ec5e1SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 662ae8ec5e1SHisping Lin TEEC_Operation TeecOperation = {0}; 6633251364cSHisping Lin struct blk_desc *dev_desc; 6643251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 6656651d4c0SJason Zhu if (!dev_desc) { 6666651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 6676651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 6686651d4c0SJason Zhu } 669ae8ec5e1SHisping Lin 670ae8ec5e1SHisping Lin debug("testmm start\n"); 671ae8ec5e1SHisping Lin OpteeClientApiLibInitialize(); 672ae8ec5e1SHisping Lin 673ae8ec5e1SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 674ae8ec5e1SHisping Lin 6753251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 6763251364cSHisping Lin TEEC_NONE, 6773251364cSHisping Lin TEEC_NONE, 6783251364cSHisping Lin TEEC_NONE); 6793251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 6803251364cSHisping Lin TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0; 6813251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 6823251364cSHisping Lin TeecOperation.params[0].value.a = 0; 6833251364cSHisping Lin #endif 684ae8ec5e1SHisping Lin 685ae8ec5e1SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 686ae8ec5e1SHisping Lin &TeecSession, 687ae8ec5e1SHisping Lin TeecUuid, 688ae8ec5e1SHisping Lin TEEC_LOGIN_PUBLIC, 689ae8ec5e1SHisping Lin NULL, 6903251364cSHisping Lin &TeecOperation, 691ae8ec5e1SHisping Lin &ErrorOrigin); 692ae8ec5e1SHisping Lin 693ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 694ae8ec5e1SHisping Lin 695ae8ec5e1SHisping Lin SharedMem0.size = sizeof("lock_state"); 696ae8ec5e1SHisping Lin SharedMem0.flags = 0; 697ae8ec5e1SHisping Lin 698ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 699ae8ec5e1SHisping Lin 700ae8ec5e1SHisping Lin memcpy(SharedMem0.buffer, "lock_state", SharedMem0.size); 701ae8ec5e1SHisping Lin 702ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem1 = {0}; 703ae8ec5e1SHisping Lin 704ae8ec5e1SHisping Lin SharedMem1.size = 1; 705ae8ec5e1SHisping Lin SharedMem1.flags = 0; 706ae8ec5e1SHisping Lin 707ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 708ae8ec5e1SHisping Lin 709ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 710ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 711ae8ec5e1SHisping Lin 712ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 713ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem1.size; 714ae8ec5e1SHisping Lin 715ae8ec5e1SHisping Lin 716ae8ec5e1SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 717ae8ec5e1SHisping Lin TEEC_MEMREF_TEMP_INOUT, 718ae8ec5e1SHisping Lin TEEC_NONE, 719ae8ec5e1SHisping Lin TEEC_NONE); 720ae8ec5e1SHisping Lin 721ae8ec5e1SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 722ae8ec5e1SHisping Lin 0, 723ae8ec5e1SHisping Lin &TeecOperation, 724ae8ec5e1SHisping Lin &ErrorOrigin); 72546b2a054SHisping Lin if (TeecResult == TEEC_SUCCESS) 726ae8ec5e1SHisping Lin memcpy(lock_state, SharedMem1.buffer, SharedMem1.size); 727ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 728ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem1); 729ae8ec5e1SHisping Lin TEEC_CloseSession(&TeecSession); 73046b2a054SHisping Lin TEEC_FinalizeContext(&TeecContext); 731ae8ec5e1SHisping Lin debug("testmm end\n"); 732ae8ec5e1SHisping Lin 733ae8ec5e1SHisping Lin return TeecResult; 734ae8ec5e1SHisping Lin } 735ae8ec5e1SHisping Lin 736ae8ec5e1SHisping Lin uint32_t trusty_write_lock_state(uint8_t lock_state) 737ae8ec5e1SHisping Lin { 738ae8ec5e1SHisping Lin TEEC_Result TeecResult; 739ae8ec5e1SHisping Lin TEEC_Context TeecContext; 740ae8ec5e1SHisping Lin TEEC_Session TeecSession; 741ae8ec5e1SHisping Lin uint32_t ErrorOrigin; 742ae8ec5e1SHisping Lin TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 743ae8ec5e1SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 744ae8ec5e1SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 745ae8ec5e1SHisping Lin TEEC_Operation TeecOperation = {0}; 7463251364cSHisping Lin struct blk_desc *dev_desc; 7473251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 7486651d4c0SJason Zhu if (!dev_desc) { 7496651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 7506651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 7516651d4c0SJason Zhu } 752ae8ec5e1SHisping Lin 753ae8ec5e1SHisping Lin debug("testmm start\n"); 754ae8ec5e1SHisping Lin OpteeClientApiLibInitialize(); 755ae8ec5e1SHisping Lin 756ae8ec5e1SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 757ae8ec5e1SHisping Lin 7583251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 7593251364cSHisping Lin TEEC_NONE, 7603251364cSHisping Lin TEEC_NONE, 7613251364cSHisping Lin TEEC_NONE); 7623251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 7633251364cSHisping Lin TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0; 7643251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 7653251364cSHisping Lin TeecOperation.params[0].value.a = 0; 7663251364cSHisping Lin #endif 7673251364cSHisping Lin 768ae8ec5e1SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 769ae8ec5e1SHisping Lin &TeecSession, 770ae8ec5e1SHisping Lin TeecUuid, 771ae8ec5e1SHisping Lin TEEC_LOGIN_PUBLIC, 772ae8ec5e1SHisping Lin NULL, 7733251364cSHisping Lin &TeecOperation, 774ae8ec5e1SHisping Lin &ErrorOrigin); 775ae8ec5e1SHisping Lin 776ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 777ae8ec5e1SHisping Lin 778ae8ec5e1SHisping Lin SharedMem0.size = sizeof("lock_state"); 779ae8ec5e1SHisping Lin SharedMem0.flags = 0; 780ae8ec5e1SHisping Lin 781ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 782ae8ec5e1SHisping Lin 783ae8ec5e1SHisping Lin memcpy(SharedMem0.buffer, "lock_state", SharedMem0.size); 784ae8ec5e1SHisping Lin 785ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem1 = {0}; 786ae8ec5e1SHisping Lin 787ae8ec5e1SHisping Lin SharedMem1.size = 1; 788ae8ec5e1SHisping Lin SharedMem1.flags = 0; 789ae8ec5e1SHisping Lin 790ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 791ae8ec5e1SHisping Lin 792ae8ec5e1SHisping Lin memcpy(SharedMem1.buffer, &lock_state, SharedMem1.size); 793ae8ec5e1SHisping Lin 794ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 795ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 796ae8ec5e1SHisping Lin 797ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 798ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem1.size; 799ae8ec5e1SHisping Lin 800ae8ec5e1SHisping Lin 801ae8ec5e1SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 802ae8ec5e1SHisping Lin TEEC_MEMREF_TEMP_INOUT, 803ae8ec5e1SHisping Lin TEEC_NONE, 804ae8ec5e1SHisping Lin TEEC_NONE); 805ae8ec5e1SHisping Lin 806ae8ec5e1SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 807ae8ec5e1SHisping Lin 1, 808ae8ec5e1SHisping Lin &TeecOperation, 809ae8ec5e1SHisping Lin &ErrorOrigin); 810ae8ec5e1SHisping Lin 811ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 812ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem1); 813ae8ec5e1SHisping Lin TEEC_CloseSession(&TeecSession); 81446b2a054SHisping Lin TEEC_FinalizeContext(&TeecContext); 815ae8ec5e1SHisping Lin debug("testmm end\n"); 816ae8ec5e1SHisping Lin 817ae8ec5e1SHisping Lin return TeecResult; 818ae8ec5e1SHisping Lin } 819ae8ec5e1SHisping Lin 820ae8ec5e1SHisping Lin uint32_t trusty_read_flash_lock_state(uint8_t *flash_lock_state) 821ae8ec5e1SHisping Lin { 822ae8ec5e1SHisping Lin TEEC_Result TeecResult; 823ae8ec5e1SHisping Lin TEEC_Context TeecContext; 824ae8ec5e1SHisping Lin TEEC_Session TeecSession; 825ae8ec5e1SHisping Lin uint32_t ErrorOrigin; 826ae8ec5e1SHisping Lin TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 827ae8ec5e1SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 828ae8ec5e1SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 829ae8ec5e1SHisping Lin TEEC_Operation TeecOperation = {0}; 8303251364cSHisping Lin struct blk_desc *dev_desc; 8313251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 8326651d4c0SJason Zhu if (!dev_desc) { 8336651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 8346651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 8356651d4c0SJason Zhu } 836ae8ec5e1SHisping Lin 837ae8ec5e1SHisping Lin debug("testmm start\n"); 838ae8ec5e1SHisping Lin OpteeClientApiLibInitialize(); 839ae8ec5e1SHisping Lin 840ae8ec5e1SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 841ae8ec5e1SHisping Lin 8423251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 8433251364cSHisping Lin TEEC_NONE, 8443251364cSHisping Lin TEEC_NONE, 8453251364cSHisping Lin TEEC_NONE); 8463251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 8473251364cSHisping Lin TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0; 8483251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 8493251364cSHisping Lin TeecOperation.params[0].value.a = 0; 8503251364cSHisping Lin #endif 851ae8ec5e1SHisping Lin 852ae8ec5e1SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 853ae8ec5e1SHisping Lin &TeecSession, 854ae8ec5e1SHisping Lin TeecUuid, 855ae8ec5e1SHisping Lin TEEC_LOGIN_PUBLIC, 856ae8ec5e1SHisping Lin NULL, 8573251364cSHisping Lin &TeecOperation, 858ae8ec5e1SHisping Lin &ErrorOrigin); 859ae8ec5e1SHisping Lin 860ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 861ae8ec5e1SHisping Lin 862ae8ec5e1SHisping Lin SharedMem0.size = sizeof("flash_lock_state"); 863ae8ec5e1SHisping Lin SharedMem0.flags = 0; 864ae8ec5e1SHisping Lin 865ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 866ae8ec5e1SHisping Lin 867ae8ec5e1SHisping Lin memcpy(SharedMem0.buffer, "flash_lock_state", SharedMem0.size); 868ae8ec5e1SHisping Lin 869ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem1 = {0}; 870ae8ec5e1SHisping Lin 871ae8ec5e1SHisping Lin SharedMem1.size = 1; 872ae8ec5e1SHisping Lin SharedMem1.flags = 0; 873ae8ec5e1SHisping Lin 874ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 875ae8ec5e1SHisping Lin 876ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 877ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 878ae8ec5e1SHisping Lin 879ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 880ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem1.size; 881ae8ec5e1SHisping Lin 882ae8ec5e1SHisping Lin 883ae8ec5e1SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 884ae8ec5e1SHisping Lin TEEC_MEMREF_TEMP_INOUT, 885ae8ec5e1SHisping Lin TEEC_NONE, 886ae8ec5e1SHisping Lin TEEC_NONE); 887ae8ec5e1SHisping Lin 888ae8ec5e1SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 889ae8ec5e1SHisping Lin 0, 890ae8ec5e1SHisping Lin &TeecOperation, 891ae8ec5e1SHisping Lin &ErrorOrigin); 89246b2a054SHisping Lin if (TeecResult == TEEC_SUCCESS) 893ae8ec5e1SHisping Lin memcpy(flash_lock_state, SharedMem1.buffer, SharedMem1.size); 894ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 895ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem1); 896ae8ec5e1SHisping Lin TEEC_CloseSession(&TeecSession); 89746b2a054SHisping Lin TEEC_FinalizeContext(&TeecContext); 898ae8ec5e1SHisping Lin debug("testmm end\n"); 899ae8ec5e1SHisping Lin 900ae8ec5e1SHisping Lin return TeecResult; 901ae8ec5e1SHisping Lin } 902ae8ec5e1SHisping Lin 903ae8ec5e1SHisping Lin 904ae8ec5e1SHisping Lin uint32_t trusty_write_flash_lock_state(uint8_t flash_lock_state) 905ae8ec5e1SHisping Lin { 906ae8ec5e1SHisping Lin TEEC_Result TeecResult; 907ae8ec5e1SHisping Lin TEEC_Context TeecContext; 908ae8ec5e1SHisping Lin TEEC_Session TeecSession; 909ae8ec5e1SHisping Lin uint32_t ErrorOrigin; 910ae8ec5e1SHisping Lin TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 911ae8ec5e1SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 912ae8ec5e1SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 913ae8ec5e1SHisping Lin TEEC_Operation TeecOperation = {0}; 9143251364cSHisping Lin struct blk_desc *dev_desc; 9153251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 9166651d4c0SJason Zhu if (!dev_desc) { 9176651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 9186651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 9196651d4c0SJason Zhu } 920ae8ec5e1SHisping Lin 921ae8ec5e1SHisping Lin debug("testmm start\n"); 922ae8ec5e1SHisping Lin OpteeClientApiLibInitialize(); 923ae8ec5e1SHisping Lin 924ae8ec5e1SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 925ae8ec5e1SHisping Lin 9263251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 9273251364cSHisping Lin TEEC_NONE, 9283251364cSHisping Lin TEEC_NONE, 9293251364cSHisping Lin TEEC_NONE); 9303251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 9313251364cSHisping Lin TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0; 9323251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 9333251364cSHisping Lin TeecOperation.params[0].value.a = 0; 9343251364cSHisping Lin #endif 9353251364cSHisping Lin 936ae8ec5e1SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 937ae8ec5e1SHisping Lin &TeecSession, 938ae8ec5e1SHisping Lin TeecUuid, 939ae8ec5e1SHisping Lin TEEC_LOGIN_PUBLIC, 940ae8ec5e1SHisping Lin NULL, 9413251364cSHisping Lin &TeecOperation, 942ae8ec5e1SHisping Lin &ErrorOrigin); 943ae8ec5e1SHisping Lin 944ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 945ae8ec5e1SHisping Lin 946ae8ec5e1SHisping Lin SharedMem0.size = sizeof("flash_lock_state"); 947ae8ec5e1SHisping Lin SharedMem0.flags = 0; 948ae8ec5e1SHisping Lin 949ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 950ae8ec5e1SHisping Lin 951ae8ec5e1SHisping Lin memcpy(SharedMem0.buffer, "flash_lock_state", SharedMem0.size); 952ae8ec5e1SHisping Lin 953ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem1 = {0}; 954ae8ec5e1SHisping Lin 955ae8ec5e1SHisping Lin SharedMem1.size = 1; 956ae8ec5e1SHisping Lin SharedMem1.flags = 0; 957ae8ec5e1SHisping Lin 958ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 959ae8ec5e1SHisping Lin 960ae8ec5e1SHisping Lin memcpy(SharedMem1.buffer, &flash_lock_state, SharedMem1.size); 961ae8ec5e1SHisping Lin 962ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 963ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 964ae8ec5e1SHisping Lin 965ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 966ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem1.size; 967ae8ec5e1SHisping Lin 968ae8ec5e1SHisping Lin 969ae8ec5e1SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 970ae8ec5e1SHisping Lin TEEC_MEMREF_TEMP_INOUT, 971ae8ec5e1SHisping Lin TEEC_NONE, 972ae8ec5e1SHisping Lin TEEC_NONE); 973ae8ec5e1SHisping Lin 974ae8ec5e1SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 975ae8ec5e1SHisping Lin 1, 976ae8ec5e1SHisping Lin &TeecOperation, 977ae8ec5e1SHisping Lin &ErrorOrigin); 978ae8ec5e1SHisping Lin 979ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 980ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem1); 981ae8ec5e1SHisping Lin TEEC_CloseSession(&TeecSession); 98246b2a054SHisping Lin TEEC_FinalizeContext(&TeecContext); 983ae8ec5e1SHisping Lin debug("testmm end\n"); 984ae8ec5e1SHisping Lin 985ae8ec5e1SHisping Lin return TeecResult; 986ae8ec5e1SHisping Lin } 987ae8ec5e1SHisping Lin 98878ef5fbdSqiujian TEEC_Result read_from_keymaster(uint8_t *filename, 98978ef5fbdSqiujian uint32_t filename_size, 99078ef5fbdSqiujian uint8_t *data, 99178ef5fbdSqiujian uint32_t size) 99278ef5fbdSqiujian { 99378ef5fbdSqiujian TEEC_Result TeecResult; 99478ef5fbdSqiujian TEEC_Context TeecContext; 99578ef5fbdSqiujian TEEC_Session TeecSession; 99678ef5fbdSqiujian uint32_t ErrorOrigin; 99778ef5fbdSqiujian TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6, 99878ef5fbdSqiujian { 0xa8, 0x69, 0x9c, 0xe6, 0x88, 0x6c, 0x5d, 0x5d } }; 99978ef5fbdSqiujian TEEC_UUID *TeecUuid = &tempuuid; 100078ef5fbdSqiujian TEEC_Operation TeecOperation = {0}; 100178ef5fbdSqiujian struct blk_desc *dev_desc; 100278ef5fbdSqiujian dev_desc = rockchip_get_bootdev(); 10036651d4c0SJason Zhu if (!dev_desc) { 10046651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 10056651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 10066651d4c0SJason Zhu } 100778ef5fbdSqiujian 100878ef5fbdSqiujian debug("read_from_keymaster start\n"); 100978ef5fbdSqiujian OpteeClientApiLibInitialize(); 101078ef5fbdSqiujian 101178ef5fbdSqiujian TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 101278ef5fbdSqiujian 101378ef5fbdSqiujian TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 101478ef5fbdSqiujian TEEC_NONE, 101578ef5fbdSqiujian TEEC_NONE, 101678ef5fbdSqiujian TEEC_NONE); 101778ef5fbdSqiujian /*0 nand or emmc "security" partition , 1 rpmb*/ 101878ef5fbdSqiujian TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0; 101978ef5fbdSqiujian #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 102078ef5fbdSqiujian TeecOperation.params[0].value.a = 0; 102178ef5fbdSqiujian #endif 102278ef5fbdSqiujian 102378ef5fbdSqiujian TeecResult = TEEC_OpenSession(&TeecContext, 102478ef5fbdSqiujian &TeecSession, 102578ef5fbdSqiujian TeecUuid, 102678ef5fbdSqiujian TEEC_LOGIN_PUBLIC, 102778ef5fbdSqiujian NULL, 102878ef5fbdSqiujian &TeecOperation, 102978ef5fbdSqiujian &ErrorOrigin); 103078ef5fbdSqiujian 103178ef5fbdSqiujian TEEC_SharedMemory SharedMem0 = {0}; 103278ef5fbdSqiujian 103378ef5fbdSqiujian SharedMem0.size = filename_size; 103478ef5fbdSqiujian SharedMem0.flags = 0; 103578ef5fbdSqiujian 103678ef5fbdSqiujian TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 103778ef5fbdSqiujian 103878ef5fbdSqiujian memcpy(SharedMem0.buffer, filename, SharedMem0.size); 103978ef5fbdSqiujian 104078ef5fbdSqiujian TEEC_SharedMemory SharedMem1 = {0}; 104178ef5fbdSqiujian 104278ef5fbdSqiujian SharedMem1.size = size; 104378ef5fbdSqiujian SharedMem1.flags = 0; 104478ef5fbdSqiujian 104578ef5fbdSqiujian TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 104678ef5fbdSqiujian 104778ef5fbdSqiujian TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 104878ef5fbdSqiujian TeecOperation.params[0].tmpref.size = SharedMem0.size; 104978ef5fbdSqiujian 105078ef5fbdSqiujian TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 105178ef5fbdSqiujian TeecOperation.params[1].tmpref.size = SharedMem1.size; 105278ef5fbdSqiujian 105378ef5fbdSqiujian 105478ef5fbdSqiujian TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 105578ef5fbdSqiujian TEEC_MEMREF_TEMP_INOUT, 105678ef5fbdSqiujian TEEC_NONE, 105778ef5fbdSqiujian TEEC_NONE); 105878ef5fbdSqiujian 105978ef5fbdSqiujian TeecResult = TEEC_InvokeCommand(&TeecSession, 106078ef5fbdSqiujian 142, 106178ef5fbdSqiujian &TeecOperation, 106278ef5fbdSqiujian &ErrorOrigin); 106378ef5fbdSqiujian if (TeecResult == TEEC_SUCCESS) 106478ef5fbdSqiujian memcpy(data, SharedMem1.buffer, SharedMem1.size); 106578ef5fbdSqiujian TEEC_ReleaseSharedMemory(&SharedMem0); 106678ef5fbdSqiujian TEEC_ReleaseSharedMemory(&SharedMem1); 106778ef5fbdSqiujian TEEC_CloseSession(&TeecSession); 106878ef5fbdSqiujian TEEC_FinalizeContext(&TeecContext); 106978ef5fbdSqiujian debug("read_from_keymaster end\n"); 107078ef5fbdSqiujian 107178ef5fbdSqiujian return TeecResult; 107278ef5fbdSqiujian } 107378ef5fbdSqiujian 1074ae8ec5e1SHisping Lin uint32_t write_to_keymaster(uint8_t *filename, 1075ae8ec5e1SHisping Lin uint32_t filename_size, 1076ae8ec5e1SHisping Lin uint8_t *data, 1077ae8ec5e1SHisping Lin uint32_t data_size) 1078ae8ec5e1SHisping Lin { 1079ae8ec5e1SHisping Lin TEEC_Result TeecResult; 1080ae8ec5e1SHisping Lin TEEC_Context TeecContext; 1081ae8ec5e1SHisping Lin TEEC_Session TeecSession; 1082ae8ec5e1SHisping Lin uint32_t ErrorOrigin; 1083ae8ec5e1SHisping Lin 1084ae8ec5e1SHisping Lin TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6, 1085ae8ec5e1SHisping Lin { 0xa8, 0x69, 0x9c, 0xe6, 0x88, 0x6c, 0x5d, 0x5d } }; 1086ae8ec5e1SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 1087ae8ec5e1SHisping Lin TEEC_Operation TeecOperation = {0}; 10883251364cSHisping Lin struct blk_desc *dev_desc; 10893251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 10906651d4c0SJason Zhu if (!dev_desc) { 10916651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 10926651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 10936651d4c0SJason Zhu } 1094ae8ec5e1SHisping Lin 1095ae8ec5e1SHisping Lin debug("write_to_keymaster\n"); 1096ae8ec5e1SHisping Lin OpteeClientApiLibInitialize(); 1097ae8ec5e1SHisping Lin 1098ae8ec5e1SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1099ae8ec5e1SHisping Lin 11003251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 11013251364cSHisping Lin TEEC_NONE, 11023251364cSHisping Lin TEEC_NONE, 11033251364cSHisping Lin TEEC_NONE); 11043251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 11053251364cSHisping Lin TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0; 11063251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 11073251364cSHisping Lin TeecOperation.params[0].value.a = 0; 11083251364cSHisping Lin #endif 11093251364cSHisping Lin 1110ae8ec5e1SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 1111ae8ec5e1SHisping Lin &TeecSession, 1112ae8ec5e1SHisping Lin TeecUuid, 1113ae8ec5e1SHisping Lin TEEC_LOGIN_PUBLIC, 1114ae8ec5e1SHisping Lin NULL, 11153251364cSHisping Lin &TeecOperation, 1116ae8ec5e1SHisping Lin &ErrorOrigin); 1117ae8ec5e1SHisping Lin 1118ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 1119ae8ec5e1SHisping Lin 1120ae8ec5e1SHisping Lin SharedMem0.size = filename_size; 1121ae8ec5e1SHisping Lin SharedMem0.flags = 0; 1122ae8ec5e1SHisping Lin 1123ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 1124ae8ec5e1SHisping Lin 1125ae8ec5e1SHisping Lin memcpy(SharedMem0.buffer, filename, SharedMem0.size); 1126ae8ec5e1SHisping Lin 1127ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem1 = {0}; 1128ae8ec5e1SHisping Lin 1129ae8ec5e1SHisping Lin SharedMem1.size = data_size; 1130ae8ec5e1SHisping Lin SharedMem1.flags = 0; 1131ae8ec5e1SHisping Lin 1132ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 1133ae8ec5e1SHisping Lin 1134ae8ec5e1SHisping Lin memcpy(SharedMem1.buffer, data, SharedMem1.size); 1135ae8ec5e1SHisping Lin 1136ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 1137ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 1138ae8ec5e1SHisping Lin 1139ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 1140ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem1.size; 1141ae8ec5e1SHisping Lin 1142ae8ec5e1SHisping Lin 1143ae8ec5e1SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 1144ae8ec5e1SHisping Lin TEEC_MEMREF_TEMP_INOUT, 1145ae8ec5e1SHisping Lin TEEC_NONE, 1146ae8ec5e1SHisping Lin TEEC_NONE); 1147ae8ec5e1SHisping Lin 1148ae8ec5e1SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 11491f25ada2SHisping Lin 141, 1150ae8ec5e1SHisping Lin &TeecOperation, 1151ae8ec5e1SHisping Lin &ErrorOrigin); 1152ae8ec5e1SHisping Lin 1153ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 1154ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem1); 1155ae8ec5e1SHisping Lin TEEC_CloseSession(&TeecSession); 115646b2a054SHisping Lin TEEC_FinalizeContext(&TeecContext); 115778ef5fbdSqiujian debug("write_to_keymaster end\n"); 1158ae8ec5e1SHisping Lin debug("TeecResult %x\n", TeecResult); 1159ae8ec5e1SHisping Lin 1160ae8ec5e1SHisping Lin return TeecResult; 1161ae8ec5e1SHisping Lin } 11626ef445a4SHisping Lin 11636ef445a4SHisping Lin uint32_t trusty_read_attribute_hash(uint32_t *buf, uint32_t length) 11646ef445a4SHisping Lin { 11656ef445a4SHisping Lin TEEC_Result TeecResult; 11666ef445a4SHisping Lin TEEC_Context TeecContext; 11676ef445a4SHisping Lin TEEC_Session TeecSession; 11686ef445a4SHisping Lin uint32_t ErrorOrigin; 11696ef445a4SHisping Lin 11706ef445a4SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, \ 11716ef445a4SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 11726ef445a4SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 11736ef445a4SHisping Lin TEEC_Operation TeecOperation = {0}; 11746ef445a4SHisping Lin 11756ef445a4SHisping Lin OpteeClientApiLibInitialize(); 11766ef445a4SHisping Lin 11776ef445a4SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 11786ef445a4SHisping Lin 11796ef445a4SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 11806ef445a4SHisping Lin &TeecSession, 11816ef445a4SHisping Lin TeecUuid, 11826ef445a4SHisping Lin TEEC_LOGIN_PUBLIC, 11836ef445a4SHisping Lin NULL, 11846ef445a4SHisping Lin NULL, 11856ef445a4SHisping Lin &ErrorOrigin); 11866ef445a4SHisping Lin 11876ef445a4SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 11886ef445a4SHisping Lin 11896ef445a4SHisping Lin SharedMem0.size = length * sizeof(uint32_t); 11906ef445a4SHisping Lin SharedMem0.flags = 0; 11916ef445a4SHisping Lin 11926ef445a4SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 11936ef445a4SHisping Lin 11946ef445a4SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 11956ef445a4SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 11966ef445a4SHisping Lin 11976ef445a4SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT, 11986ef445a4SHisping Lin TEEC_NONE, 11996ef445a4SHisping Lin TEEC_NONE, 12006ef445a4SHisping Lin TEEC_NONE); 12016ef445a4SHisping Lin 12026ef445a4SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 12036ef445a4SHisping Lin 0, 12046ef445a4SHisping Lin &TeecOperation, 12056ef445a4SHisping Lin &ErrorOrigin); 12066ef445a4SHisping Lin 12076ef445a4SHisping Lin if (TeecResult == TEEC_SUCCESS) 12086ef445a4SHisping Lin memcpy(buf, SharedMem0.buffer, SharedMem0.size); 12096ef445a4SHisping Lin 12106ef445a4SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 12116ef445a4SHisping Lin TEEC_CloseSession(&TeecSession); 12126ef445a4SHisping Lin TEEC_FinalizeContext(&TeecContext); 12136ef445a4SHisping Lin 12146ef445a4SHisping Lin return TeecResult; 12156ef445a4SHisping Lin } 12166ef445a4SHisping Lin 12176ef445a4SHisping Lin uint32_t trusty_write_attribute_hash(uint32_t *buf, uint32_t length) 12186ef445a4SHisping Lin { 12196ef445a4SHisping Lin TEEC_Result TeecResult; 12206ef445a4SHisping Lin TEEC_Context TeecContext; 12216ef445a4SHisping Lin TEEC_Session TeecSession; 12226ef445a4SHisping Lin uint32_t ErrorOrigin; 12236ef445a4SHisping Lin 12246ef445a4SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, \ 12256ef445a4SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 12266ef445a4SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 12276ef445a4SHisping Lin TEEC_Operation TeecOperation = {0}; 12286ef445a4SHisping Lin 12296ef445a4SHisping Lin OpteeClientApiLibInitialize(); 12306ef445a4SHisping Lin 12316ef445a4SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 12326ef445a4SHisping Lin 12336ef445a4SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 12346ef445a4SHisping Lin &TeecSession, 12356ef445a4SHisping Lin TeecUuid, 12366ef445a4SHisping Lin TEEC_LOGIN_PUBLIC, 12376ef445a4SHisping Lin NULL, 12386ef445a4SHisping Lin NULL, 12396ef445a4SHisping Lin &ErrorOrigin); 12406ef445a4SHisping Lin 12416ef445a4SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 12426ef445a4SHisping Lin 12436ef445a4SHisping Lin SharedMem0.size = length * sizeof(uint32_t); 12446ef445a4SHisping Lin SharedMem0.flags = 0; 12456ef445a4SHisping Lin 12466ef445a4SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 12476ef445a4SHisping Lin 12486ef445a4SHisping Lin memcpy(SharedMem0.buffer, buf, SharedMem0.size); 12496ef445a4SHisping Lin 12506ef445a4SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 12516ef445a4SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 12526ef445a4SHisping Lin 12536ef445a4SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 12546ef445a4SHisping Lin TEEC_NONE, 12556ef445a4SHisping Lin TEEC_NONE, 12566ef445a4SHisping Lin TEEC_NONE); 12576ef445a4SHisping Lin 12586ef445a4SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 12596ef445a4SHisping Lin 1, 12606ef445a4SHisping Lin &TeecOperation, 12616ef445a4SHisping Lin &ErrorOrigin); 12626ef445a4SHisping Lin 12636ef445a4SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 12646ef445a4SHisping Lin TEEC_CloseSession(&TeecSession); 12656ef445a4SHisping Lin TEEC_FinalizeContext(&TeecContext); 12666ef445a4SHisping Lin 12676ef445a4SHisping Lin return TeecResult; 12686ef445a4SHisping Lin } 126916539616SHisping Lin 127016539616SHisping Lin uint32_t notify_optee_rpmb_ta(void) 127116539616SHisping Lin { 127216539616SHisping Lin TEEC_Result TeecResult; 127316539616SHisping Lin TEEC_Context TeecContext; 127416539616SHisping Lin TEEC_Session TeecSession; 127516539616SHisping Lin uint32_t ErrorOrigin; 127616539616SHisping Lin TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 127716539616SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 127816539616SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 127916539616SHisping Lin TEEC_Operation TeecOperation = {0}; 128016539616SHisping Lin 128116539616SHisping Lin OpteeClientApiLibInitialize(); 128216539616SHisping Lin 128316539616SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 128416539616SHisping Lin 128516539616SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 128616539616SHisping Lin &TeecSession, 128716539616SHisping Lin TeecUuid, 128816539616SHisping Lin TEEC_LOGIN_PUBLIC, 128916539616SHisping Lin NULL, 129016539616SHisping Lin NULL, 129116539616SHisping Lin &ErrorOrigin); 129216539616SHisping Lin 129316539616SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE, 129416539616SHisping Lin TEEC_NONE, 129516539616SHisping Lin TEEC_NONE, 129616539616SHisping Lin TEEC_NONE); 129716539616SHisping Lin 129816539616SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 129916539616SHisping Lin 2, 130016539616SHisping Lin &TeecOperation, 130116539616SHisping Lin &ErrorOrigin); 130216539616SHisping Lin 130316539616SHisping Lin TEEC_CloseSession(&TeecSession); 130416539616SHisping Lin TEEC_FinalizeContext(&TeecContext); 130516539616SHisping Lin 130616539616SHisping Lin return TeecResult; 130716539616SHisping Lin } 130816539616SHisping Lin 130916539616SHisping Lin uint32_t notify_optee_efuse_ta(void) 131016539616SHisping Lin { 131116539616SHisping Lin TEEC_Result TeecResult; 131216539616SHisping Lin TEEC_Context TeecContext; 131316539616SHisping Lin TEEC_Session TeecSession; 131416539616SHisping Lin uint32_t ErrorOrigin; 131516539616SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, \ 131616539616SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 131716539616SHisping Lin 131816539616SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 131916539616SHisping Lin TEEC_Operation TeecOperation = {0}; 132016539616SHisping Lin 132116539616SHisping Lin OpteeClientApiLibInitialize(); 132216539616SHisping Lin 132316539616SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 132416539616SHisping Lin 132516539616SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 132616539616SHisping Lin &TeecSession, 132716539616SHisping Lin TeecUuid, 132816539616SHisping Lin TEEC_LOGIN_PUBLIC, 132916539616SHisping Lin NULL, 133016539616SHisping Lin NULL, 133116539616SHisping Lin &ErrorOrigin); 133216539616SHisping Lin 133316539616SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE, 133416539616SHisping Lin TEEC_NONE, 133516539616SHisping Lin TEEC_NONE, 133616539616SHisping Lin TEEC_NONE); 133716539616SHisping Lin 133816539616SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 133916539616SHisping Lin 2, 134016539616SHisping Lin &TeecOperation, 134116539616SHisping Lin &ErrorOrigin); 134216539616SHisping Lin 134316539616SHisping Lin TEEC_CloseSession(&TeecSession); 134416539616SHisping Lin TEEC_FinalizeContext(&TeecContext); 134516539616SHisping Lin 134616539616SHisping Lin return TeecResult; 134716539616SHisping Lin } 134816539616SHisping Lin 134916539616SHisping Lin uint32_t trusty_notify_optee_uboot_end(void) 135016539616SHisping Lin { 135116539616SHisping Lin TEEC_Result res; 135216539616SHisping Lin res = notify_optee_rpmb_ta(); 135316539616SHisping Lin res |= notify_optee_efuse_ta(); 135416539616SHisping Lin return res; 135516539616SHisping Lin } 13562cd27853SHisping Lin 13572cd27853SHisping Lin uint32_t trusty_read_vbootkey_hash(uint32_t *buf, uint32_t length) 13582cd27853SHisping Lin { 13592cd27853SHisping Lin TEEC_Result TeecResult; 13602cd27853SHisping Lin TEEC_Context TeecContext; 13612cd27853SHisping Lin TEEC_Session TeecSession; 13622cd27853SHisping Lin uint32_t ErrorOrigin; 13632cd27853SHisping Lin 13642cd27853SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, \ 13652cd27853SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 13662cd27853SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 13672cd27853SHisping Lin TEEC_Operation TeecOperation = {0}; 13682cd27853SHisping Lin 13692cd27853SHisping Lin OpteeClientApiLibInitialize(); 13702cd27853SHisping Lin 13712cd27853SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 13722cd27853SHisping Lin 13732cd27853SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 13742cd27853SHisping Lin &TeecSession, 13752cd27853SHisping Lin TeecUuid, 13762cd27853SHisping Lin TEEC_LOGIN_PUBLIC, 13772cd27853SHisping Lin NULL, 13782cd27853SHisping Lin NULL, 13792cd27853SHisping Lin &ErrorOrigin); 13802cd27853SHisping Lin 13812cd27853SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 13822cd27853SHisping Lin 13832cd27853SHisping Lin SharedMem0.size = length * sizeof(uint32_t); 13842cd27853SHisping Lin SharedMem0.flags = 0; 13852cd27853SHisping Lin 13862cd27853SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 13872cd27853SHisping Lin 13882cd27853SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 13892cd27853SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 13902cd27853SHisping Lin 13912cd27853SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT, 13922cd27853SHisping Lin TEEC_NONE, 13932cd27853SHisping Lin TEEC_NONE, 13942cd27853SHisping Lin TEEC_NONE); 13952cd27853SHisping Lin 13962cd27853SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 13972cd27853SHisping Lin 3, 13982cd27853SHisping Lin &TeecOperation, 13992cd27853SHisping Lin &ErrorOrigin); 14002cd27853SHisping Lin 14012cd27853SHisping Lin if (TeecResult == TEEC_SUCCESS) 14022cd27853SHisping Lin memcpy(buf, SharedMem0.buffer, SharedMem0.size); 14032cd27853SHisping Lin 14042cd27853SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 14052cd27853SHisping Lin TEEC_CloseSession(&TeecSession); 14062cd27853SHisping Lin TEEC_FinalizeContext(&TeecContext); 14072cd27853SHisping Lin 14082cd27853SHisping Lin return TeecResult; 14092cd27853SHisping Lin } 14102cd27853SHisping Lin uint32_t trusty_write_vbootkey_hash(uint32_t *buf, uint32_t length) 14112cd27853SHisping Lin { 14122cd27853SHisping Lin TEEC_Result TeecResult; 14132cd27853SHisping Lin TEEC_Context TeecContext; 14142cd27853SHisping Lin TEEC_Session TeecSession; 14152cd27853SHisping Lin uint32_t ErrorOrigin; 14162cd27853SHisping Lin 14172cd27853SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, \ 14182cd27853SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 14192cd27853SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 14202cd27853SHisping Lin TEEC_Operation TeecOperation = {0}; 14212cd27853SHisping Lin 14222cd27853SHisping Lin OpteeClientApiLibInitialize(); 14232cd27853SHisping Lin 14242cd27853SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 14252cd27853SHisping Lin 14262cd27853SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 14272cd27853SHisping Lin &TeecSession, 14282cd27853SHisping Lin TeecUuid, 14292cd27853SHisping Lin TEEC_LOGIN_PUBLIC, 14302cd27853SHisping Lin NULL, 14312cd27853SHisping Lin NULL, 14322cd27853SHisping Lin &ErrorOrigin); 14332cd27853SHisping Lin 14342cd27853SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 14352cd27853SHisping Lin 14362cd27853SHisping Lin SharedMem0.size = length * sizeof(uint32_t); 14372cd27853SHisping Lin SharedMem0.flags = 0; 14382cd27853SHisping Lin 14392cd27853SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 14402cd27853SHisping Lin 14412cd27853SHisping Lin memcpy(SharedMem0.buffer, buf, SharedMem0.size); 14422cd27853SHisping Lin 14432cd27853SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 14442cd27853SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 14452cd27853SHisping Lin 14462cd27853SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 14472cd27853SHisping Lin TEEC_NONE, 14482cd27853SHisping Lin TEEC_NONE, 14492cd27853SHisping Lin TEEC_NONE); 14502cd27853SHisping Lin 14512cd27853SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 14522cd27853SHisping Lin 4, 14532cd27853SHisping Lin &TeecOperation, 14542cd27853SHisping Lin &ErrorOrigin); 14552cd27853SHisping Lin 14562cd27853SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 14572cd27853SHisping Lin TEEC_CloseSession(&TeecSession); 14582cd27853SHisping Lin TEEC_FinalizeContext(&TeecContext); 14592cd27853SHisping Lin 14602cd27853SHisping Lin return TeecResult; 14612cd27853SHisping Lin } 1462095e2a82SHisping Lin 1463468df3b2SHisping Lin uint32_t trusty_read_vbootkey_enable_flag(uint8_t *flag) 1464468df3b2SHisping Lin { 1465468df3b2SHisping Lin TEEC_Result TeecResult; 1466468df3b2SHisping Lin TEEC_Context TeecContext; 1467468df3b2SHisping Lin TEEC_Session TeecSession; 1468468df3b2SHisping Lin uint32_t ErrorOrigin; 1469468df3b2SHisping Lin uint32_t bootflag; 1470468df3b2SHisping Lin 1471468df3b2SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, \ 1472468df3b2SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 1473468df3b2SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 1474468df3b2SHisping Lin TEEC_Operation TeecOperation = {0}; 1475468df3b2SHisping Lin 1476468df3b2SHisping Lin OpteeClientApiLibInitialize(); 1477468df3b2SHisping Lin 1478468df3b2SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1479468df3b2SHisping Lin 1480468df3b2SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 1481468df3b2SHisping Lin &TeecSession, 1482468df3b2SHisping Lin TeecUuid, 1483468df3b2SHisping Lin TEEC_LOGIN_PUBLIC, 1484468df3b2SHisping Lin NULL, 1485468df3b2SHisping Lin NULL, 1486468df3b2SHisping Lin &ErrorOrigin); 1487468df3b2SHisping Lin 1488468df3b2SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 1489468df3b2SHisping Lin 1490468df3b2SHisping Lin SharedMem0.size = 1 * sizeof(uint32_t); 1491468df3b2SHisping Lin SharedMem0.flags = 0; 1492468df3b2SHisping Lin 1493468df3b2SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 1494468df3b2SHisping Lin 1495468df3b2SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 1496468df3b2SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 1497468df3b2SHisping Lin 1498468df3b2SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT, 1499468df3b2SHisping Lin TEEC_NONE, 1500468df3b2SHisping Lin TEEC_NONE, 1501468df3b2SHisping Lin TEEC_NONE); 1502468df3b2SHisping Lin 1503468df3b2SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 1504468df3b2SHisping Lin 5, 1505468df3b2SHisping Lin &TeecOperation, 1506468df3b2SHisping Lin &ErrorOrigin); 1507468df3b2SHisping Lin 1508468df3b2SHisping Lin if (TeecResult == TEEC_SUCCESS) { 1509468df3b2SHisping Lin memcpy(&bootflag, SharedMem0.buffer, SharedMem0.size); 1510468df3b2SHisping Lin if (bootflag == 0x000000FF) 1511468df3b2SHisping Lin *flag = 1; 1512468df3b2SHisping Lin } 1513468df3b2SHisping Lin 1514468df3b2SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 1515468df3b2SHisping Lin TEEC_CloseSession(&TeecSession); 1516468df3b2SHisping Lin TEEC_FinalizeContext(&TeecContext); 1517468df3b2SHisping Lin 1518468df3b2SHisping Lin return TeecResult; 1519468df3b2SHisping Lin } 1520468df3b2SHisping Lin 1521095e2a82SHisping Lin uint32_t trusty_read_permanent_attributes_flag(uint8_t *attributes) 1522095e2a82SHisping Lin { 1523095e2a82SHisping Lin TEEC_Result TeecResult; 1524095e2a82SHisping Lin TEEC_Context TeecContext; 1525095e2a82SHisping Lin TEEC_Session TeecSession; 1526095e2a82SHisping Lin uint32_t ErrorOrigin; 1527095e2a82SHisping Lin TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6, 1528095e2a82SHisping Lin { 0xa8, 0x69, 0x9c, 0xe6, 0x88, 0x6c, 0x5d, 0x5d } }; 1529095e2a82SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 1530095e2a82SHisping Lin TEEC_Operation TeecOperation = {0}; 15313251364cSHisping Lin struct blk_desc *dev_desc; 15323251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 15336651d4c0SJason Zhu if (!dev_desc) { 15346651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 15356651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 15366651d4c0SJason Zhu } 1537095e2a82SHisping Lin 1538095e2a82SHisping Lin debug("testmm start\n"); 1539095e2a82SHisping Lin OpteeClientApiLibInitialize(); 1540095e2a82SHisping Lin 1541095e2a82SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1542095e2a82SHisping Lin 15433251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 15443251364cSHisping Lin TEEC_NONE, 15453251364cSHisping Lin TEEC_NONE, 15463251364cSHisping Lin TEEC_NONE); 15473251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 15483251364cSHisping Lin TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0; 15493251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 15503251364cSHisping Lin TeecOperation.params[0].value.a = 0; 15513251364cSHisping Lin #endif 15523251364cSHisping Lin 1553095e2a82SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 1554095e2a82SHisping Lin &TeecSession, 1555095e2a82SHisping Lin TeecUuid, 1556095e2a82SHisping Lin TEEC_LOGIN_PUBLIC, 1557095e2a82SHisping Lin NULL, 15583251364cSHisping Lin &TeecOperation, 1559095e2a82SHisping Lin &ErrorOrigin); 1560095e2a82SHisping Lin 1561095e2a82SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 1562095e2a82SHisping Lin 1563095e2a82SHisping Lin SharedMem0.size = sizeof("attributes_flag"); 1564095e2a82SHisping Lin SharedMem0.flags = 0; 1565095e2a82SHisping Lin 1566095e2a82SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 1567095e2a82SHisping Lin 1568095e2a82SHisping Lin memcpy(SharedMem0.buffer, "attributes_flag", SharedMem0.size); 1569095e2a82SHisping Lin 1570095e2a82SHisping Lin TEEC_SharedMemory SharedMem1 = {0}; 1571095e2a82SHisping Lin 1572095e2a82SHisping Lin SharedMem1.size = 1; 1573095e2a82SHisping Lin SharedMem1.flags = 0; 1574095e2a82SHisping Lin 1575095e2a82SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 1576095e2a82SHisping Lin 1577095e2a82SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 1578095e2a82SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 1579095e2a82SHisping Lin 1580095e2a82SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 1581095e2a82SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem1.size; 1582095e2a82SHisping Lin 1583095e2a82SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 1584095e2a82SHisping Lin TEEC_MEMREF_TEMP_INOUT, 1585095e2a82SHisping Lin TEEC_NONE, 1586095e2a82SHisping Lin TEEC_NONE); 1587095e2a82SHisping Lin 1588095e2a82SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 1589095e2a82SHisping Lin 142, 1590095e2a82SHisping Lin &TeecOperation, 1591095e2a82SHisping Lin &ErrorOrigin); 1592095e2a82SHisping Lin if (TeecResult == TEEC_SUCCESS) 1593095e2a82SHisping Lin memcpy(attributes, SharedMem1.buffer, SharedMem1.size); 1594095e2a82SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 1595095e2a82SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem1); 1596095e2a82SHisping Lin TEEC_CloseSession(&TeecSession); 1597095e2a82SHisping Lin TEEC_FinalizeContext(&TeecContext); 1598095e2a82SHisping Lin debug("testmm end\n"); 1599095e2a82SHisping Lin 1600095e2a82SHisping Lin return TeecResult; 1601095e2a82SHisping Lin } 1602095e2a82SHisping Lin 1603095e2a82SHisping Lin uint32_t trusty_write_permanent_attributes_flag(uint8_t attributes) 1604095e2a82SHisping Lin { 1605095e2a82SHisping Lin TEEC_Result TeecResult; 1606095e2a82SHisping Lin TEEC_Context TeecContext; 1607095e2a82SHisping Lin TEEC_Session TeecSession; 1608095e2a82SHisping Lin uint32_t ErrorOrigin; 1609095e2a82SHisping Lin TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6, 1610095e2a82SHisping Lin { 0xa8, 0x69, 0x9c, 0xe6, 0x88, 0x6c, 0x5d, 0x5d } }; 1611095e2a82SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 1612095e2a82SHisping Lin TEEC_Operation TeecOperation = {0}; 16133251364cSHisping Lin struct blk_desc *dev_desc; 16143251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 16156651d4c0SJason Zhu if (!dev_desc) { 16166651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 16176651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 16186651d4c0SJason Zhu } 1619095e2a82SHisping Lin 1620095e2a82SHisping Lin debug("testmm start\n"); 1621095e2a82SHisping Lin OpteeClientApiLibInitialize(); 1622095e2a82SHisping Lin 1623095e2a82SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1624095e2a82SHisping Lin 16253251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 16263251364cSHisping Lin TEEC_NONE, 16273251364cSHisping Lin TEEC_NONE, 16283251364cSHisping Lin TEEC_NONE); 16293251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 16303251364cSHisping Lin TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0; 16313251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 16323251364cSHisping Lin TeecOperation.params[0].value.a = 0; 16333251364cSHisping Lin #endif 16343251364cSHisping Lin 1635095e2a82SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 1636095e2a82SHisping Lin &TeecSession, 1637095e2a82SHisping Lin TeecUuid, 1638095e2a82SHisping Lin TEEC_LOGIN_PUBLIC, 1639095e2a82SHisping Lin NULL, 16403251364cSHisping Lin &TeecOperation, 1641095e2a82SHisping Lin &ErrorOrigin); 1642095e2a82SHisping Lin 1643095e2a82SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 1644095e2a82SHisping Lin 1645095e2a82SHisping Lin SharedMem0.size = sizeof("attributes_flag"); 1646095e2a82SHisping Lin SharedMem0.flags = 0; 1647095e2a82SHisping Lin 1648095e2a82SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 1649095e2a82SHisping Lin 1650095e2a82SHisping Lin memcpy(SharedMem0.buffer, "attributes_flag", SharedMem0.size); 1651095e2a82SHisping Lin 1652095e2a82SHisping Lin TEEC_SharedMemory SharedMem1 = {0}; 1653095e2a82SHisping Lin 1654095e2a82SHisping Lin SharedMem1.size = 1; 1655095e2a82SHisping Lin SharedMem1.flags = 0; 1656095e2a82SHisping Lin 1657095e2a82SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 1658095e2a82SHisping Lin 1659095e2a82SHisping Lin memcpy(SharedMem1.buffer, (char *)&attributes, SharedMem1.size); 1660095e2a82SHisping Lin 1661095e2a82SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 1662095e2a82SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 1663095e2a82SHisping Lin 1664095e2a82SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 1665095e2a82SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem1.size; 1666095e2a82SHisping Lin 1667095e2a82SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 1668095e2a82SHisping Lin TEEC_MEMREF_TEMP_INOUT, 1669095e2a82SHisping Lin TEEC_NONE, 1670095e2a82SHisping Lin TEEC_NONE); 1671095e2a82SHisping Lin 1672095e2a82SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 1673095e2a82SHisping Lin 141, 1674095e2a82SHisping Lin &TeecOperation, 1675095e2a82SHisping Lin &ErrorOrigin); 1676095e2a82SHisping Lin 1677095e2a82SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 1678095e2a82SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem1); 1679095e2a82SHisping Lin TEEC_CloseSession(&TeecSession); 1680095e2a82SHisping Lin TEEC_FinalizeContext(&TeecContext); 1681095e2a82SHisping Lin debug("testmm end\n"); 1682095e2a82SHisping Lin 1683095e2a82SHisping Lin return TeecResult; 1684095e2a82SHisping Lin } 16854aa61755SAndy Ye 16864aa61755SAndy Ye uint32_t trusty_attest_dh(uint8_t *dh, uint32_t *dh_size) 16874aa61755SAndy Ye { 16884aa61755SAndy Ye TEEC_Result TeecResult; 16894aa61755SAndy Ye TEEC_Context TeecContext; 16904aa61755SAndy Ye TEEC_Session TeecSession; 16914aa61755SAndy Ye uint32_t ErrorOrigin; 16924aa61755SAndy Ye TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6, 16934aa61755SAndy Ye { 0xa8, 0x69, 0x9c, 0xe6, 16944aa61755SAndy Ye 0x88, 0x6c, 0x5d, 0x5d 16954aa61755SAndy Ye } 16964aa61755SAndy Ye }; 16974aa61755SAndy Ye TEEC_UUID *TeecUuid = &tempuuid; 16984aa61755SAndy Ye TEEC_Operation TeecOperation = {0}; 16993251364cSHisping Lin struct blk_desc *dev_desc; 17003251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 17016651d4c0SJason Zhu if (!dev_desc) { 17026651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 17036651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 17046651d4c0SJason Zhu } 17054aa61755SAndy Ye 17064aa61755SAndy Ye OpteeClientApiLibInitialize(); 17074aa61755SAndy Ye 17084aa61755SAndy Ye TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 17094aa61755SAndy Ye 17103251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 17113251364cSHisping Lin TEEC_NONE, 17123251364cSHisping Lin TEEC_NONE, 17133251364cSHisping Lin TEEC_NONE); 17143251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 17153251364cSHisping Lin TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0; 17163251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 17173251364cSHisping Lin TeecOperation.params[0].value.a = 0; 17183251364cSHisping Lin #endif 17193251364cSHisping Lin 17204aa61755SAndy Ye TeecResult = TEEC_OpenSession(&TeecContext, 17214aa61755SAndy Ye &TeecSession, 17224aa61755SAndy Ye TeecUuid, 17234aa61755SAndy Ye TEEC_LOGIN_PUBLIC, 17244aa61755SAndy Ye NULL, 17253251364cSHisping Lin &TeecOperation, 17264aa61755SAndy Ye &ErrorOrigin); 17274aa61755SAndy Ye 17284aa61755SAndy Ye TEEC_SharedMemory SharedMem0 = {0}; 17294aa61755SAndy Ye 17304aa61755SAndy Ye SharedMem0.size = *dh_size; 17314aa61755SAndy Ye SharedMem0.flags = 0; 17324aa61755SAndy Ye 17334aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 17344aa61755SAndy Ye 17354aa61755SAndy Ye TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 17364aa61755SAndy Ye TeecOperation.params[0].tmpref.size = SharedMem0.size; 17374aa61755SAndy Ye 17384aa61755SAndy Ye TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, 17394aa61755SAndy Ye TEEC_NONE, 17404aa61755SAndy Ye TEEC_NONE, 17414aa61755SAndy Ye TEEC_NONE); 17424aa61755SAndy Ye 17434aa61755SAndy Ye TeecResult = TEEC_InvokeCommand(&TeecSession, 17444aa61755SAndy Ye 143, 17454aa61755SAndy Ye &TeecOperation, 17464aa61755SAndy Ye &ErrorOrigin); 17474aa61755SAndy Ye 17484aa61755SAndy Ye *dh_size = TeecOperation.params[0].tmpref.size; 17494aa61755SAndy Ye memcpy(dh, SharedMem0.buffer, SharedMem0.size); 17504aa61755SAndy Ye 17514aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem0); 17524aa61755SAndy Ye 17534aa61755SAndy Ye TEEC_CloseSession(&TeecSession); 17544aa61755SAndy Ye TeecResult = TEEC_FinalizeContext(&TeecContext); 17554aa61755SAndy Ye 17564aa61755SAndy Ye return TeecResult; 17574aa61755SAndy Ye } 17584aa61755SAndy Ye 17594aa61755SAndy Ye uint32_t trusty_attest_uuid(uint8_t *uuid, uint32_t *uuid_size) 17604aa61755SAndy Ye { 17614aa61755SAndy Ye TEEC_Result TeecResult; 17624aa61755SAndy Ye TEEC_Context TeecContext; 17634aa61755SAndy Ye TEEC_Session TeecSession; 17644aa61755SAndy Ye uint32_t ErrorOrigin; 17654aa61755SAndy Ye TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6, 17664aa61755SAndy Ye { 0xa8, 0x69, 0x9c, 0xe6, 17674aa61755SAndy Ye 0x88, 0x6c, 0x5d, 0x5d 17684aa61755SAndy Ye } 17694aa61755SAndy Ye }; 17704aa61755SAndy Ye TEEC_UUID *TeecUuid = &tempuuid; 17714aa61755SAndy Ye TEEC_Operation TeecOperation = {0}; 17723251364cSHisping Lin struct blk_desc *dev_desc; 17733251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 17746651d4c0SJason Zhu if (!dev_desc) { 17756651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 17766651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 17776651d4c0SJason Zhu } 17784aa61755SAndy Ye 17794aa61755SAndy Ye OpteeClientApiLibInitialize(); 17804aa61755SAndy Ye 17814aa61755SAndy Ye TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 17824aa61755SAndy Ye 17833251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 17843251364cSHisping Lin TEEC_NONE, 17853251364cSHisping Lin TEEC_NONE, 17863251364cSHisping Lin TEEC_NONE); 17873251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 17883251364cSHisping Lin TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0; 17893251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 17903251364cSHisping Lin TeecOperation.params[0].value.a = 0; 17913251364cSHisping Lin #endif 17923251364cSHisping Lin 17934aa61755SAndy Ye TeecResult = TEEC_OpenSession(&TeecContext, 17944aa61755SAndy Ye &TeecSession, 17954aa61755SAndy Ye TeecUuid, 17964aa61755SAndy Ye TEEC_LOGIN_PUBLIC, 17974aa61755SAndy Ye NULL, 17983251364cSHisping Lin &TeecOperation, 17994aa61755SAndy Ye &ErrorOrigin); 18004aa61755SAndy Ye 18014aa61755SAndy Ye TEEC_SharedMemory SharedMem0 = {0}; 18024aa61755SAndy Ye 18034aa61755SAndy Ye SharedMem0.size = *uuid_size; 18044aa61755SAndy Ye SharedMem0.flags = 0; 18054aa61755SAndy Ye 18064aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 18074aa61755SAndy Ye 18084aa61755SAndy Ye TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 18094aa61755SAndy Ye TeecOperation.params[0].tmpref.size = SharedMem0.size; 18104aa61755SAndy Ye 18114aa61755SAndy Ye TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, 18124aa61755SAndy Ye TEEC_NONE, 18134aa61755SAndy Ye TEEC_NONE, 18144aa61755SAndy Ye TEEC_NONE); 18154aa61755SAndy Ye 18164aa61755SAndy Ye TeecResult = TEEC_InvokeCommand(&TeecSession, 18174aa61755SAndy Ye 144, 18184aa61755SAndy Ye &TeecOperation, 18194aa61755SAndy Ye &ErrorOrigin); 18204aa61755SAndy Ye 18214aa61755SAndy Ye *uuid_size = TeecOperation.params[0].tmpref.size; 18224aa61755SAndy Ye memcpy(uuid, SharedMem0.buffer, SharedMem0.size); 18234aa61755SAndy Ye 18244aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem0); 18254aa61755SAndy Ye 18264aa61755SAndy Ye TEEC_CloseSession(&TeecSession); 18274aa61755SAndy Ye TeecResult = TEEC_FinalizeContext(&TeecContext); 18284aa61755SAndy Ye 18294aa61755SAndy Ye return TeecResult; 18304aa61755SAndy Ye } 18314aa61755SAndy Ye 18324aa61755SAndy Ye uint32_t trusty_attest_get_ca(uint8_t *operation_start, 18334aa61755SAndy Ye uint32_t *operation_size, 18344aa61755SAndy Ye uint8_t *out, 18354aa61755SAndy Ye uint32_t *out_len) 18364aa61755SAndy Ye { 18374aa61755SAndy Ye TEEC_Result TeecResult; 18384aa61755SAndy Ye TEEC_Context TeecContext; 18394aa61755SAndy Ye TEEC_Session TeecSession; 18404aa61755SAndy Ye uint32_t ErrorOrigin; 18414aa61755SAndy Ye 18424aa61755SAndy Ye OpteeClientApiLibInitialize(); 18434aa61755SAndy Ye 18444aa61755SAndy Ye TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6, 18454aa61755SAndy Ye { 0xa8, 0x69, 0x9c, 0xe6, 18464aa61755SAndy Ye 0x88, 0x6c, 0x5d, 0x5d 18474aa61755SAndy Ye } 18484aa61755SAndy Ye }; 18494aa61755SAndy Ye 18504aa61755SAndy Ye TEEC_UUID *TeecUuid = &tempuuid; 18514aa61755SAndy Ye TEEC_Operation TeecOperation = {0}; 18523251364cSHisping Lin struct blk_desc *dev_desc; 18533251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 18546651d4c0SJason Zhu if (!dev_desc) { 18556651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 18566651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 18576651d4c0SJason Zhu } 18584aa61755SAndy Ye 18594aa61755SAndy Ye OpteeClientApiLibInitialize(); 18604aa61755SAndy Ye 18614aa61755SAndy Ye TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 18624aa61755SAndy Ye 18633251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 18643251364cSHisping Lin TEEC_NONE, 18653251364cSHisping Lin TEEC_NONE, 18663251364cSHisping Lin TEEC_NONE); 18673251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 18683251364cSHisping Lin TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0; 18693251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 18703251364cSHisping Lin TeecOperation.params[0].value.a = 0; 18713251364cSHisping Lin #endif 18723251364cSHisping Lin 18734aa61755SAndy Ye TeecResult = TEEC_OpenSession(&TeecContext, 18744aa61755SAndy Ye &TeecSession, 18754aa61755SAndy Ye TeecUuid, 18764aa61755SAndy Ye TEEC_LOGIN_PUBLIC, 18774aa61755SAndy Ye NULL, 18783251364cSHisping Lin &TeecOperation, 18794aa61755SAndy Ye &ErrorOrigin); 18804aa61755SAndy Ye 18814aa61755SAndy Ye TEEC_SharedMemory SharedMem0 = {0}; 18824aa61755SAndy Ye 18834aa61755SAndy Ye SharedMem0.size = *operation_size; 18844aa61755SAndy Ye SharedMem0.flags = 0; 18854aa61755SAndy Ye 18864aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 18874aa61755SAndy Ye 18884aa61755SAndy Ye memcpy(SharedMem0.buffer, operation_start, SharedMem0.size); 18894aa61755SAndy Ye 18904aa61755SAndy Ye TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 18914aa61755SAndy Ye TeecOperation.params[0].tmpref.size = SharedMem0.size; 18924aa61755SAndy Ye 18934aa61755SAndy Ye TEEC_SharedMemory SharedMem1 = {0}; 18944aa61755SAndy Ye 18954aa61755SAndy Ye SharedMem1.size = *out_len; 18964aa61755SAndy Ye SharedMem1.flags = 0; 18974aa61755SAndy Ye 18984aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 18994aa61755SAndy Ye 19004aa61755SAndy Ye TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 19014aa61755SAndy Ye TeecOperation.params[1].tmpref.size = SharedMem1.size; 19024aa61755SAndy Ye 19034aa61755SAndy Ye TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, 19044aa61755SAndy Ye TEEC_MEMREF_TEMP_INOUT, 19054aa61755SAndy Ye TEEC_NONE, 19064aa61755SAndy Ye TEEC_NONE); 19074aa61755SAndy Ye 19084aa61755SAndy Ye TeecResult = TEEC_InvokeCommand(&TeecSession, 19094aa61755SAndy Ye 145, 19104aa61755SAndy Ye &TeecOperation, 19114aa61755SAndy Ye &ErrorOrigin); 19124aa61755SAndy Ye 19134aa61755SAndy Ye *out_len = TeecOperation.params[1].tmpref.size; 19144aa61755SAndy Ye memcpy(out, SharedMem1.buffer, SharedMem1.size); 19154aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem0); 19164aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem1); 19174aa61755SAndy Ye 19184aa61755SAndy Ye return TeecResult; 19194aa61755SAndy Ye } 19204aa61755SAndy Ye 19214aa61755SAndy Ye uint32_t trusty_attest_set_ca(uint8_t *ca_response, uint32_t *ca_response_size) 19224aa61755SAndy Ye { 19234aa61755SAndy Ye TEEC_Result TeecResult; 19244aa61755SAndy Ye TEEC_Context TeecContext; 19254aa61755SAndy Ye TEEC_Session TeecSession; 19264aa61755SAndy Ye uint32_t ErrorOrigin; 19274aa61755SAndy Ye TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6, 19284aa61755SAndy Ye { 0xa8, 0x69, 0x9c, 0xe6, 19294aa61755SAndy Ye 0x88, 0x6c, 0x5d, 0x5d 19304aa61755SAndy Ye } 19314aa61755SAndy Ye }; 19324aa61755SAndy Ye TEEC_UUID *TeecUuid = &tempuuid; 19334aa61755SAndy Ye TEEC_Operation TeecOperation = {0}; 19343251364cSHisping Lin struct blk_desc *dev_desc; 19353251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 19366651d4c0SJason Zhu if (!dev_desc) { 19376651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 19386651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 19396651d4c0SJason Zhu } 19404aa61755SAndy Ye 19414aa61755SAndy Ye TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 19424aa61755SAndy Ye 19433251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 19443251364cSHisping Lin TEEC_NONE, 19453251364cSHisping Lin TEEC_NONE, 19463251364cSHisping Lin TEEC_NONE); 19473251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 19483251364cSHisping Lin TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0; 19493251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 19503251364cSHisping Lin TeecOperation.params[0].value.a = 0; 19513251364cSHisping Lin #endif 19523251364cSHisping Lin 19534aa61755SAndy Ye TeecResult = TEEC_OpenSession(&TeecContext, 19544aa61755SAndy Ye &TeecSession, 19554aa61755SAndy Ye TeecUuid, 19564aa61755SAndy Ye TEEC_LOGIN_PUBLIC, 19574aa61755SAndy Ye NULL, 19583251364cSHisping Lin &TeecOperation, 19594aa61755SAndy Ye &ErrorOrigin); 19604aa61755SAndy Ye 19614aa61755SAndy Ye TEEC_SharedMemory SharedMem0 = {0}; 19624aa61755SAndy Ye 19634aa61755SAndy Ye SharedMem0.size = *ca_response_size; 19644aa61755SAndy Ye SharedMem0.flags = 0; 19654aa61755SAndy Ye 19664aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 19674aa61755SAndy Ye 19684aa61755SAndy Ye memcpy(SharedMem0.buffer, ca_response, SharedMem0.size); 19694aa61755SAndy Ye 19704aa61755SAndy Ye TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 19714aa61755SAndy Ye TeecOperation.params[0].tmpref.size = SharedMem0.size; 19724aa61755SAndy Ye 19734aa61755SAndy Ye TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, 19744aa61755SAndy Ye TEEC_NONE, 19754aa61755SAndy Ye TEEC_NONE, 19764aa61755SAndy Ye TEEC_NONE); 19774aa61755SAndy Ye 19784aa61755SAndy Ye TeecResult = TEEC_InvokeCommand(&TeecSession, 19794aa61755SAndy Ye 146, 19804aa61755SAndy Ye &TeecOperation, 19814aa61755SAndy Ye &ErrorOrigin); 19824aa61755SAndy Ye 19834aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem0); 19844aa61755SAndy Ye 19854aa61755SAndy Ye TEEC_CloseSession(&TeecSession); 19864aa61755SAndy Ye TeecResult = TEEC_FinalizeContext(&TeecContext); 19874aa61755SAndy Ye 19884aa61755SAndy Ye return TeecResult; 19894aa61755SAndy Ye } 199078ef5fbdSqiujian 199178ef5fbdSqiujian TEEC_Result trusty_write_oem_unlock(uint8_t unlock) 199278ef5fbdSqiujian { 199378ef5fbdSqiujian char *file = "oem.unlock"; 199478ef5fbdSqiujian TEEC_Result ret; 199578ef5fbdSqiujian 199678ef5fbdSqiujian ret = write_to_keymaster((uint8_t *)file, strlen(file), 199778ef5fbdSqiujian (uint8_t *)&unlock, 1); 199878ef5fbdSqiujian return ret; 199978ef5fbdSqiujian } 200078ef5fbdSqiujian 200178ef5fbdSqiujian TEEC_Result trusty_read_oem_unlock(uint8_t *unlock) 200278ef5fbdSqiujian { 200378ef5fbdSqiujian char *file = "oem.unlock"; 200478ef5fbdSqiujian TEEC_Result ret; 200578ef5fbdSqiujian 200678ef5fbdSqiujian ret = read_from_keymaster((uint8_t *)file, strlen(file), 200778ef5fbdSqiujian unlock, 1); 200878ef5fbdSqiujian 200978ef5fbdSqiujian if (ret == TEE_ERROR_ITEM_NOT_FOUND) { 201078ef5fbdSqiujian debug("init oem unlock status 0"); 201178ef5fbdSqiujian ret = trusty_write_oem_unlock(0); 201278ef5fbdSqiujian } 201378ef5fbdSqiujian 201478ef5fbdSqiujian return ret; 201578ef5fbdSqiujian } 2016