1ae8ec5e1SHisping Lin /* 2ae8ec5e1SHisping Lin * Copyright 2017, Rockchip Electronics Co., Ltd 3ae8ec5e1SHisping Lin * hisping lin, <hisping.lin@rock-chips.com> 4ae8ec5e1SHisping Lin * 5ae8ec5e1SHisping Lin * SPDX-License-Identifier: GPL-2.0+ 6ae8ec5e1SHisping Lin */ 7ae8ec5e1SHisping Lin 8ae8ec5e1SHisping Lin #include <common.h> 9ae8ec5e1SHisping Lin #include <optee_include/OpteeClientApiLib.h> 10ae8ec5e1SHisping Lin #include <optee_include/tee_client_api.h> 1178ef5fbdSqiujian #include <optee_include/tee_api_defines.h> 123251364cSHisping Lin #include <boot_rkimg.h> 13a7df4868Stony.xu #include <stdlib.h> 14a7df4868Stony.xu 15a7df4868Stony.xu #define BOOT_FROM_EMMC (1 << 1) 16*f18b06fbSTony Xu #define WIDEVINE_TAG "KBOX" 17*f18b06fbSTony Xu #define ATTESTATION_TAG "ATTE" 18a7df4868Stony.xu 19a7df4868Stony.xu uint32_t rk_send_keybox_to_ta(uint8_t *filename, uint32_t filename_size, 20a7df4868Stony.xu TEEC_UUID uuid, 21a7df4868Stony.xu uint8_t *key, uint32_t key_size, 22a7df4868Stony.xu uint8_t *data, uint32_t data_size) 23a7df4868Stony.xu { 24a7df4868Stony.xu TEEC_Result TeecResult; 25a7df4868Stony.xu TEEC_Context TeecContext; 26a7df4868Stony.xu TEEC_Session TeecSession; 27a7df4868Stony.xu uint32_t ErrorOrigin; 28a7df4868Stony.xu 29a7df4868Stony.xu TEEC_UUID *TeecUuid = &uuid; 30a7df4868Stony.xu TEEC_Operation TeecOperation = {0}; 31a7df4868Stony.xu 32a7df4868Stony.xu struct blk_desc *dev_desc; 33a7df4868Stony.xu 34a7df4868Stony.xu dev_desc = rockchip_get_bootdev(); 35a7df4868Stony.xu if (!dev_desc) { 36a7df4868Stony.xu printf("%s: dev_desc is NULL!\n", __func__); 37a7df4868Stony.xu return -TEEC_ERROR_GENERIC; 38a7df4868Stony.xu } 39a7df4868Stony.xu 40a7df4868Stony.xu OpteeClientApiLibInitialize(); 41a7df4868Stony.xu TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 42a7df4868Stony.xu TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 43a7df4868Stony.xu TEEC_NONE, 44a7df4868Stony.xu TEEC_NONE, 45a7df4868Stony.xu TEEC_NONE); 46a7df4868Stony.xu 47a7df4868Stony.xu /* 0 nand or emmc "security" partition , 1 rpmb */ 48a7df4868Stony.xu TeecOperation.params[0].value.a = 49a7df4868Stony.xu (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0; 50a7df4868Stony.xu #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 51a7df4868Stony.xu TeecOperation.params[0].value.a = 0; 52a7df4868Stony.xu #endif 53a7df4868Stony.xu TeecResult = TEEC_OpenSession(&TeecContext, 54a7df4868Stony.xu &TeecSession, 55a7df4868Stony.xu TeecUuid, 56a7df4868Stony.xu TEEC_LOGIN_PUBLIC, 57a7df4868Stony.xu NULL, 58a7df4868Stony.xu &TeecOperation, 59a7df4868Stony.xu &ErrorOrigin); 60a7df4868Stony.xu 61a7df4868Stony.xu TEEC_SharedMemory SharedMem0 = {0}; 62a7df4868Stony.xu 63a7df4868Stony.xu SharedMem0.size = filename_size; 64a7df4868Stony.xu SharedMem0.flags = 0; 65a7df4868Stony.xu 66a7df4868Stony.xu TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 67a7df4868Stony.xu 68a7df4868Stony.xu memcpy(SharedMem0.buffer, filename, SharedMem0.size); 69a7df4868Stony.xu 70a7df4868Stony.xu TEEC_SharedMemory SharedMem1 = {0}; 71a7df4868Stony.xu 72a7df4868Stony.xu SharedMem1.size = key_size; 73a7df4868Stony.xu SharedMem1.flags = 0; 74a7df4868Stony.xu 75a7df4868Stony.xu TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 76a7df4868Stony.xu 77a7df4868Stony.xu memcpy(SharedMem1.buffer, key, SharedMem1.size); 78a7df4868Stony.xu 79a7df4868Stony.xu TEEC_SharedMemory SharedMem2 = {0}; 80a7df4868Stony.xu 81a7df4868Stony.xu SharedMem2.size = data_size; 82a7df4868Stony.xu SharedMem2.flags = 0; 83a7df4868Stony.xu 84a7df4868Stony.xu TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem2); 85a7df4868Stony.xu 86a7df4868Stony.xu memcpy(SharedMem2.buffer, data, SharedMem2.size); 87a7df4868Stony.xu 88a7df4868Stony.xu TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 89a7df4868Stony.xu TeecOperation.params[0].tmpref.size = SharedMem0.size; 90a7df4868Stony.xu 91a7df4868Stony.xu TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 92a7df4868Stony.xu TeecOperation.params[1].tmpref.size = SharedMem1.size; 93a7df4868Stony.xu 94a7df4868Stony.xu TeecOperation.params[2].tmpref.buffer = SharedMem2.buffer; 95a7df4868Stony.xu TeecOperation.params[2].tmpref.size = SharedMem2.size; 96a7df4868Stony.xu 97a7df4868Stony.xu TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 98a7df4868Stony.xu TEEC_MEMREF_TEMP_INPUT, 99a7df4868Stony.xu TEEC_MEMREF_TEMP_INOUT, 100a7df4868Stony.xu TEEC_NONE); 101a7df4868Stony.xu 102a7df4868Stony.xu printf("check: does keybox exised in secure storage...\n"); 103a7df4868Stony.xu TeecResult = TEEC_InvokeCommand(&TeecSession, 104a7df4868Stony.xu 122, 105a7df4868Stony.xu &TeecOperation, 106a7df4868Stony.xu &ErrorOrigin); 107a7df4868Stony.xu if (TeecResult != TEEC_SUCCESS) { 108a7df4868Stony.xu printf("no keybox in secure storage, write keybox to secure storage\n"); 109a7df4868Stony.xu TeecResult = TEEC_InvokeCommand(&TeecSession, 110a7df4868Stony.xu 121, 111a7df4868Stony.xu &TeecOperation, 112a7df4868Stony.xu &ErrorOrigin); 113a7df4868Stony.xu if (TeecResult != TEEC_SUCCESS) { 114a7df4868Stony.xu printf("send data to TA failed with code 0x%x\n", TeecResult); 115a7df4868Stony.xu } else { 116a7df4868Stony.xu printf("send data to TA success with code 0x%x\n", TeecResult); 117a7df4868Stony.xu } 118a7df4868Stony.xu } 119a7df4868Stony.xu TEEC_ReleaseSharedMemory(&SharedMem0); 120a7df4868Stony.xu TEEC_ReleaseSharedMemory(&SharedMem1); 121a7df4868Stony.xu TEEC_ReleaseSharedMemory(&SharedMem2); 122a7df4868Stony.xu 123a7df4868Stony.xu TEEC_CloseSession(&TeecSession); 124a7df4868Stony.xu TEEC_FinalizeContext(&TeecContext); 125a7df4868Stony.xu 126a7df4868Stony.xu return TeecResult; 127a7df4868Stony.xu } 128a7df4868Stony.xu 129a7df4868Stony.xu int write_keybox_to_secure_storage(uint8_t *uboot_data, uint32_t len) 130a7df4868Stony.xu { 131a7df4868Stony.xu uint32_t key_size; 132a7df4868Stony.xu uint32_t data_size; 133*f18b06fbSTony Xu uint32_t object_id; 134*f18b06fbSTony Xu TEEC_Result ret; 135*f18b06fbSTony Xu int rc = 0; 136a7df4868Stony.xu 137*f18b06fbSTony Xu if (memcmp(uboot_data, WIDEVINE_TAG, 4) == 0) { 138*f18b06fbSTony Xu /* widevine keybox */ 139a7df4868Stony.xu TEEC_UUID widevine_uuid = { 0xc11fe8ac, 0xb997, 0x48cf, 140a7df4868Stony.xu { 0xa2, 0x8d, 0xe2, 0xa5, 0x5e, 0x52, 0x40, 0xef} }; 141*f18b06fbSTony Xu object_id = 101; 142*f18b06fbSTony Xu 143*f18b06fbSTony Xu key_size = *(uboot_data + 4); 144*f18b06fbSTony Xu data_size = *(uboot_data + 8); 145*f18b06fbSTony Xu 146*f18b06fbSTony Xu ret = rk_send_keybox_to_ta((uint8_t *)&object_id, 147*f18b06fbSTony Xu sizeof(uint32_t), 148*f18b06fbSTony Xu widevine_uuid, 149*f18b06fbSTony Xu uboot_data + 12, 150*f18b06fbSTony Xu key_size, 151*f18b06fbSTony Xu uboot_data + 12 + key_size, 152*f18b06fbSTony Xu data_size); 153*f18b06fbSTony Xu if (ret == TEEC_SUCCESS) { 154*f18b06fbSTony Xu rc = 0; 155*f18b06fbSTony Xu printf("write widevine keybox to secure storage success\n"); 156a7df4868Stony.xu } else { 157*f18b06fbSTony Xu rc = -EIO; 158*f18b06fbSTony Xu printf("write widevine keybox to secure storage fail\n"); 159*f18b06fbSTony Xu } 160*f18b06fbSTony Xu } else if (memcmp(uboot_data, ATTESTATION_TAG, 4) == 0) { 161*f18b06fbSTony Xu /* attestation key */ 162*f18b06fbSTony Xu 163a7df4868Stony.xu } 164a7df4868Stony.xu 165*f18b06fbSTony Xu return rc; 166a7df4868Stony.xu } 167ae8ec5e1SHisping Lin 168ae8ec5e1SHisping Lin void test_optee(void) 169ae8ec5e1SHisping Lin { 170ae8ec5e1SHisping Lin TEEC_Result TeecResult; 171ae8ec5e1SHisping Lin TEEC_Context TeecContext; 172ae8ec5e1SHisping Lin TEEC_Session TeecSession; 173ae8ec5e1SHisping Lin uint32_t ErrorOrigin; 174a7df4868Stony.xu TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, \ 175ae8ec5e1SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 176ae8ec5e1SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 177ae8ec5e1SHisping Lin TEEC_Operation TeecOperation = {0}; 1783251364cSHisping Lin struct blk_desc *dev_desc; 1793251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 1806651d4c0SJason Zhu if (!dev_desc) { 1816651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 1826651d4c0SJason Zhu return; 1836651d4c0SJason Zhu } 184ae8ec5e1SHisping Lin 185ae8ec5e1SHisping Lin debug("testmm start\n"); 186ae8ec5e1SHisping Lin OpteeClientApiLibInitialize(); 187ae8ec5e1SHisping Lin 188ae8ec5e1SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 189ae8ec5e1SHisping Lin 1903251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 1913251364cSHisping Lin TEEC_NONE, 1923251364cSHisping Lin TEEC_NONE, 1933251364cSHisping Lin TEEC_NONE); 1943251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 1953251364cSHisping Lin TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0; 1963251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 1973251364cSHisping Lin TeecOperation.params[0].value.a = 0; 1983251364cSHisping Lin #endif 1993251364cSHisping Lin 200ae8ec5e1SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 201ae8ec5e1SHisping Lin &TeecSession, 202ae8ec5e1SHisping Lin TeecUuid, 203ae8ec5e1SHisping Lin TEEC_LOGIN_PUBLIC, 204ae8ec5e1SHisping Lin NULL, 2053251364cSHisping Lin &TeecOperation, 206ae8ec5e1SHisping Lin &ErrorOrigin); 207ae8ec5e1SHisping Lin 208ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 209ae8ec5e1SHisping Lin 210ae8ec5e1SHisping Lin SharedMem0.size = sizeof("filename_test"); 211ae8ec5e1SHisping Lin SharedMem0.flags = 0; 212ae8ec5e1SHisping Lin 213ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 214ae8ec5e1SHisping Lin 215ae8ec5e1SHisping Lin memcpy(SharedMem0.buffer, "filename_test", SharedMem0.size); 216ae8ec5e1SHisping Lin 217ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem1 = {0}; 218ae8ec5e1SHisping Lin 219ae8ec5e1SHisping Lin SharedMem1.size = 32; 220ae8ec5e1SHisping Lin SharedMem1.flags = 0; 221ae8ec5e1SHisping Lin 222ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 223ae8ec5e1SHisping Lin 224ae8ec5e1SHisping Lin memset(SharedMem1.buffer, 'a', SharedMem1.size); 225ae8ec5e1SHisping Lin 226ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 227ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 228ae8ec5e1SHisping Lin 229ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 230ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem1.size; 231ae8ec5e1SHisping Lin 232ae8ec5e1SHisping Lin 233ae8ec5e1SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 234ae8ec5e1SHisping Lin TEEC_MEMREF_TEMP_INOUT, 235ae8ec5e1SHisping Lin TEEC_NONE, 236ae8ec5e1SHisping Lin TEEC_NONE); 237ae8ec5e1SHisping Lin 238ae8ec5e1SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 239ae8ec5e1SHisping Lin 1, 240ae8ec5e1SHisping Lin &TeecOperation, 241ae8ec5e1SHisping Lin &ErrorOrigin); 242ae8ec5e1SHisping Lin 243ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 244ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem1); 245ae8ec5e1SHisping Lin 246ae8ec5e1SHisping Lin TEEC_CloseSession(&TeecSession); 247ae8ec5e1SHisping Lin 24846b2a054SHisping Lin TEEC_FinalizeContext(&TeecContext); 249ae8ec5e1SHisping Lin 250ae8ec5e1SHisping Lin debug("testmm end\n"); 251ae8ec5e1SHisping Lin debug("TeecResult %x\n", TeecResult); 252ae8ec5e1SHisping Lin } 253ae8ec5e1SHisping Lin 254ae8ec5e1SHisping Lin static uint8_t b2hs_add_base(uint8_t in) 255ae8ec5e1SHisping Lin { 256ae8ec5e1SHisping Lin if (in > 9) 257ae8ec5e1SHisping Lin return in + 55; 258ae8ec5e1SHisping Lin else 259ae8ec5e1SHisping Lin return in + 48; 260ae8ec5e1SHisping Lin } 261ae8ec5e1SHisping Lin 262ae8ec5e1SHisping Lin uint32_t b2hs(uint8_t *b, uint8_t *hs, uint32_t blen, uint32_t hslen) 263ae8ec5e1SHisping Lin { 264ae8ec5e1SHisping Lin uint32_t i = 0; 265ae8ec5e1SHisping Lin 266ae8ec5e1SHisping Lin if (blen * 2 + 1 > hslen) 267ae8ec5e1SHisping Lin return 0; 268ae8ec5e1SHisping Lin 269ae8ec5e1SHisping Lin for (; i < blen; i++) { 270ae8ec5e1SHisping Lin hs[i * 2 + 1] = b2hs_add_base(b[i] & 0xf); 271ae8ec5e1SHisping Lin hs[i * 2] = b2hs_add_base(b[i] >> 4); 272ae8ec5e1SHisping Lin } 273ae8ec5e1SHisping Lin hs[blen * 2] = 0; 274ae8ec5e1SHisping Lin 275ae8ec5e1SHisping Lin return blen * 2; 276ae8ec5e1SHisping Lin } 277ae8ec5e1SHisping Lin 278ae8ec5e1SHisping Lin 279ae8ec5e1SHisping Lin uint32_t trusty_read_rollback_index(uint32_t slot, uint64_t *value) 280ae8ec5e1SHisping Lin { 281ae8ec5e1SHisping Lin TEEC_Result TeecResult; 282ae8ec5e1SHisping Lin TEEC_Context TeecContext; 283ae8ec5e1SHisping Lin TEEC_Session TeecSession; 284ae8ec5e1SHisping Lin uint32_t ErrorOrigin; 285ae8ec5e1SHisping Lin TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 286ae8ec5e1SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 287ae8ec5e1SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 288ae8ec5e1SHisping Lin TEEC_Operation TeecOperation = {0}; 289ae8ec5e1SHisping Lin uint8_t hs[9]; 290ae8ec5e1SHisping Lin 2913251364cSHisping Lin struct blk_desc *dev_desc; 2923251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 2936651d4c0SJason Zhu if (!dev_desc) { 2946651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 2956651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 2966651d4c0SJason Zhu } 2973251364cSHisping Lin 298ae8ec5e1SHisping Lin b2hs((uint8_t *)&slot, hs, 4, 9); 299ae8ec5e1SHisping Lin debug("testmm start\n"); 300ae8ec5e1SHisping Lin OpteeClientApiLibInitialize(); 301ae8ec5e1SHisping Lin 302ae8ec5e1SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 303ae8ec5e1SHisping Lin 3043251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 3053251364cSHisping Lin TEEC_NONE, 3063251364cSHisping Lin TEEC_NONE, 3073251364cSHisping Lin TEEC_NONE); 3083251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 3093251364cSHisping Lin TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0; 3103251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 3113251364cSHisping Lin TeecOperation.params[0].value.a = 0; 3123251364cSHisping Lin #endif 3133251364cSHisping Lin 314ae8ec5e1SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 315ae8ec5e1SHisping Lin &TeecSession, 316ae8ec5e1SHisping Lin TeecUuid, 317ae8ec5e1SHisping Lin TEEC_LOGIN_PUBLIC, 318ae8ec5e1SHisping Lin NULL, 3193251364cSHisping Lin &TeecOperation, 320f303baf0SHisping Lin 321ae8ec5e1SHisping Lin &ErrorOrigin); 322ae8ec5e1SHisping Lin 323ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 324ae8ec5e1SHisping Lin 325ae8ec5e1SHisping Lin SharedMem0.size = 8; 326ae8ec5e1SHisping Lin SharedMem0.flags = 0; 327ae8ec5e1SHisping Lin 328ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 329ae8ec5e1SHisping Lin 330ae8ec5e1SHisping Lin memcpy(SharedMem0.buffer, hs, SharedMem0.size); 331ae8ec5e1SHisping Lin 332ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem1 = {0}; 333ae8ec5e1SHisping Lin 334ae8ec5e1SHisping Lin SharedMem1.size = 8; 335ae8ec5e1SHisping Lin SharedMem1.flags = 0; 336ae8ec5e1SHisping Lin 337ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 338ae8ec5e1SHisping Lin 339ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 340ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 341ae8ec5e1SHisping Lin 342ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 343ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem1.size; 344ae8ec5e1SHisping Lin 345ae8ec5e1SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 346ae8ec5e1SHisping Lin TEEC_MEMREF_TEMP_INOUT, 347ae8ec5e1SHisping Lin TEEC_NONE, 348ae8ec5e1SHisping Lin TEEC_NONE); 349ae8ec5e1SHisping Lin 350ae8ec5e1SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 351ae8ec5e1SHisping Lin 0, 352ae8ec5e1SHisping Lin &TeecOperation, 353ae8ec5e1SHisping Lin &ErrorOrigin); 35446b2a054SHisping Lin if (TeecResult == TEEC_SUCCESS) 355ae8ec5e1SHisping Lin memcpy((char *)value, SharedMem1.buffer, SharedMem1.size); 356ae8ec5e1SHisping Lin 357ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 358ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem1); 359ae8ec5e1SHisping Lin 360ae8ec5e1SHisping Lin TEEC_CloseSession(&TeecSession); 361ae8ec5e1SHisping Lin 36246b2a054SHisping Lin TEEC_FinalizeContext(&TeecContext); 363ae8ec5e1SHisping Lin 364ae8ec5e1SHisping Lin debug("testmm end\n"); 365ae8ec5e1SHisping Lin return TeecResult; 366ae8ec5e1SHisping Lin } 367ae8ec5e1SHisping Lin 368ae8ec5e1SHisping Lin uint32_t trusty_write_rollback_index(uint32_t slot, uint64_t value) 369ae8ec5e1SHisping Lin { 370ae8ec5e1SHisping Lin TEEC_Result TeecResult; 371ae8ec5e1SHisping Lin TEEC_Context TeecContext; 372ae8ec5e1SHisping Lin TEEC_Session TeecSession; 373ae8ec5e1SHisping Lin uint32_t ErrorOrigin; 374ae8ec5e1SHisping Lin TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 375ae8ec5e1SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 376ae8ec5e1SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 377ae8ec5e1SHisping Lin TEEC_Operation TeecOperation = {0}; 378ae8ec5e1SHisping Lin uint8_t hs[9]; 3793251364cSHisping Lin struct blk_desc *dev_desc; 3803251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 3816651d4c0SJason Zhu if (!dev_desc) { 3826651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 3836651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 3846651d4c0SJason Zhu } 3853251364cSHisping Lin 386ae8ec5e1SHisping Lin b2hs((uint8_t *)&slot, hs, 4, 9); 387ae8ec5e1SHisping Lin OpteeClientApiLibInitialize(); 388ae8ec5e1SHisping Lin 389ae8ec5e1SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 390ae8ec5e1SHisping Lin 3913251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 3923251364cSHisping Lin TEEC_NONE, 3933251364cSHisping Lin TEEC_NONE, 3943251364cSHisping Lin TEEC_NONE); 3953251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 3963251364cSHisping Lin TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0; 3973251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 3983251364cSHisping Lin TeecOperation.params[0].value.a = 0; 3993251364cSHisping Lin #endif 4003251364cSHisping Lin 401ae8ec5e1SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 402ae8ec5e1SHisping Lin &TeecSession, 403ae8ec5e1SHisping Lin TeecUuid, 404ae8ec5e1SHisping Lin TEEC_LOGIN_PUBLIC, 405ae8ec5e1SHisping Lin NULL, 4063251364cSHisping Lin &TeecOperation, 407ae8ec5e1SHisping Lin &ErrorOrigin); 408ae8ec5e1SHisping Lin 409ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 410ae8ec5e1SHisping Lin 411ae8ec5e1SHisping Lin SharedMem0.size = 8; 412ae8ec5e1SHisping Lin SharedMem0.flags = 0; 413ae8ec5e1SHisping Lin 414ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 415ae8ec5e1SHisping Lin 416ae8ec5e1SHisping Lin memcpy(SharedMem0.buffer, hs, SharedMem0.size); 417ae8ec5e1SHisping Lin 418ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem1 = {0}; 419ae8ec5e1SHisping Lin 420ae8ec5e1SHisping Lin SharedMem1.size = 8; 421ae8ec5e1SHisping Lin SharedMem1.flags = 0; 422ae8ec5e1SHisping Lin 423ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 424ae8ec5e1SHisping Lin 425ae8ec5e1SHisping Lin memcpy(SharedMem1.buffer, (char *)&value, SharedMem1.size); 426ae8ec5e1SHisping Lin 427ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 428ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 429ae8ec5e1SHisping Lin 430ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 431ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem1.size; 432ae8ec5e1SHisping Lin 433ae8ec5e1SHisping Lin 434ae8ec5e1SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 435ae8ec5e1SHisping Lin TEEC_MEMREF_TEMP_INOUT, 436ae8ec5e1SHisping Lin TEEC_NONE, 437ae8ec5e1SHisping Lin TEEC_NONE); 438ae8ec5e1SHisping Lin 439ae8ec5e1SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 440ae8ec5e1SHisping Lin 1, 441ae8ec5e1SHisping Lin &TeecOperation, 442ae8ec5e1SHisping Lin &ErrorOrigin); 443ae8ec5e1SHisping Lin 444ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 445ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem1); 446ae8ec5e1SHisping Lin 447ae8ec5e1SHisping Lin TEEC_CloseSession(&TeecSession); 448ae8ec5e1SHisping Lin 44946b2a054SHisping Lin TEEC_FinalizeContext(&TeecContext); 450ae8ec5e1SHisping Lin 451ae8ec5e1SHisping Lin debug("testmm end\n"); 452ae8ec5e1SHisping Lin 453ae8ec5e1SHisping Lin return TeecResult; 454ae8ec5e1SHisping Lin } 455ae8ec5e1SHisping Lin 456ae8ec5e1SHisping Lin uint32_t trusty_read_permanent_attributes(uint8_t *attributes, uint32_t size) 457ae8ec5e1SHisping Lin { 458ae8ec5e1SHisping Lin TEEC_Result TeecResult; 459ae8ec5e1SHisping Lin TEEC_Context TeecContext; 460ae8ec5e1SHisping Lin TEEC_Session TeecSession; 461ae8ec5e1SHisping Lin uint32_t ErrorOrigin; 46246b2a054SHisping Lin TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6, 46346b2a054SHisping Lin { 0xa8, 0x69, 0x9c, 0xe6, 0x88, 0x6c, 0x5d, 0x5d } }; 464ae8ec5e1SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 465ae8ec5e1SHisping Lin TEEC_Operation TeecOperation = {0}; 4663251364cSHisping Lin struct blk_desc *dev_desc; 4673251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 4686651d4c0SJason Zhu if (!dev_desc) { 4696651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 4706651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 4716651d4c0SJason Zhu } 472ae8ec5e1SHisping Lin 473ae8ec5e1SHisping Lin debug("testmm start\n"); 474ae8ec5e1SHisping Lin OpteeClientApiLibInitialize(); 475ae8ec5e1SHisping Lin 476ae8ec5e1SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 477ae8ec5e1SHisping Lin 4783251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 4793251364cSHisping Lin TEEC_NONE, 4803251364cSHisping Lin TEEC_NONE, 4813251364cSHisping Lin TEEC_NONE); 4823251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 4833251364cSHisping Lin TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0; 4843251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 4853251364cSHisping Lin TeecOperation.params[0].value.a = 0; 4863251364cSHisping Lin #endif 4873251364cSHisping Lin 488ae8ec5e1SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 489ae8ec5e1SHisping Lin &TeecSession, 490ae8ec5e1SHisping Lin TeecUuid, 491ae8ec5e1SHisping Lin TEEC_LOGIN_PUBLIC, 492ae8ec5e1SHisping Lin NULL, 4933251364cSHisping Lin &TeecOperation, 494ae8ec5e1SHisping Lin &ErrorOrigin); 495ae8ec5e1SHisping Lin 496ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 497ae8ec5e1SHisping Lin 498ae8ec5e1SHisping Lin SharedMem0.size = sizeof("attributes"); 499ae8ec5e1SHisping Lin SharedMem0.flags = 0; 500ae8ec5e1SHisping Lin 501ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 502ae8ec5e1SHisping Lin 503ae8ec5e1SHisping Lin memcpy(SharedMem0.buffer, "attributes", SharedMem0.size); 504ae8ec5e1SHisping Lin 505ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem1 = {0}; 506ae8ec5e1SHisping Lin 507ae8ec5e1SHisping Lin SharedMem1.size = size; 508ae8ec5e1SHisping Lin SharedMem1.flags = 0; 509ae8ec5e1SHisping Lin 510ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 511ae8ec5e1SHisping Lin 512ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 513ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 514ae8ec5e1SHisping Lin 515ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 516ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem1.size; 517ae8ec5e1SHisping Lin 518ae8ec5e1SHisping Lin 519ae8ec5e1SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 520ae8ec5e1SHisping Lin TEEC_MEMREF_TEMP_INOUT, 521ae8ec5e1SHisping Lin TEEC_NONE, 522ae8ec5e1SHisping Lin TEEC_NONE); 523ae8ec5e1SHisping Lin 524ae8ec5e1SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 52546b2a054SHisping Lin 142, 526ae8ec5e1SHisping Lin &TeecOperation, 527ae8ec5e1SHisping Lin &ErrorOrigin); 52846b2a054SHisping Lin if (TeecResult == TEEC_SUCCESS) 529ae8ec5e1SHisping Lin memcpy(attributes, SharedMem1.buffer, SharedMem1.size); 530ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 531ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem1); 532ae8ec5e1SHisping Lin TEEC_CloseSession(&TeecSession); 53346b2a054SHisping Lin TEEC_FinalizeContext(&TeecContext); 534ae8ec5e1SHisping Lin debug("testmm end\n"); 535ae8ec5e1SHisping Lin 536ae8ec5e1SHisping Lin return TeecResult; 537ae8ec5e1SHisping Lin } 538ae8ec5e1SHisping Lin 539ae8ec5e1SHisping Lin uint32_t trusty_write_permanent_attributes(uint8_t *attributes, uint32_t size) 540ae8ec5e1SHisping Lin { 541ae8ec5e1SHisping Lin TEEC_Result TeecResult; 542ae8ec5e1SHisping Lin TEEC_Context TeecContext; 543ae8ec5e1SHisping Lin TEEC_Session TeecSession; 544ae8ec5e1SHisping Lin uint32_t ErrorOrigin; 54546b2a054SHisping Lin TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6, 54646b2a054SHisping Lin { 0xa8, 0x69, 0x9c, 0xe6, 0x88, 0x6c, 0x5d, 0x5d } }; 547ae8ec5e1SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 548ae8ec5e1SHisping Lin TEEC_Operation TeecOperation = {0}; 5493251364cSHisping Lin struct blk_desc *dev_desc; 5503251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 5516651d4c0SJason Zhu if (!dev_desc) { 5526651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 5536651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 5546651d4c0SJason Zhu } 555ae8ec5e1SHisping Lin 556ae8ec5e1SHisping Lin debug("testmm start\n"); 557ae8ec5e1SHisping Lin OpteeClientApiLibInitialize(); 558ae8ec5e1SHisping Lin 559ae8ec5e1SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 560ae8ec5e1SHisping Lin 5613251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 5623251364cSHisping Lin TEEC_NONE, 5633251364cSHisping Lin TEEC_NONE, 5643251364cSHisping Lin TEEC_NONE); 5653251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 5663251364cSHisping Lin TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0; 5673251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 5683251364cSHisping Lin TeecOperation.params[0].value.a = 0; 5693251364cSHisping Lin #endif 5703251364cSHisping Lin 571ae8ec5e1SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 572ae8ec5e1SHisping Lin &TeecSession, 573ae8ec5e1SHisping Lin TeecUuid, 574ae8ec5e1SHisping Lin TEEC_LOGIN_PUBLIC, 575ae8ec5e1SHisping Lin NULL, 5763251364cSHisping Lin &TeecOperation, 577ae8ec5e1SHisping Lin &ErrorOrigin); 578ae8ec5e1SHisping Lin 579ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 580ae8ec5e1SHisping Lin 581ae8ec5e1SHisping Lin SharedMem0.size = sizeof("attributes"); 582ae8ec5e1SHisping Lin SharedMem0.flags = 0; 583ae8ec5e1SHisping Lin 584ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 585ae8ec5e1SHisping Lin 586ae8ec5e1SHisping Lin memcpy(SharedMem0.buffer, "attributes", SharedMem0.size); 587ae8ec5e1SHisping Lin 588ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem1 = {0}; 589ae8ec5e1SHisping Lin 590ae8ec5e1SHisping Lin SharedMem1.size = size; 591ae8ec5e1SHisping Lin SharedMem1.flags = 0; 592ae8ec5e1SHisping Lin 593ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 594ae8ec5e1SHisping Lin 595ae8ec5e1SHisping Lin memcpy(SharedMem1.buffer, attributes, SharedMem1.size); 596ae8ec5e1SHisping Lin 597ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 598ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 599ae8ec5e1SHisping Lin 600ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 601ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem1.size; 602ae8ec5e1SHisping Lin 603ae8ec5e1SHisping Lin 604ae8ec5e1SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 605ae8ec5e1SHisping Lin TEEC_MEMREF_TEMP_INOUT, 606ae8ec5e1SHisping Lin TEEC_NONE, 607ae8ec5e1SHisping Lin TEEC_NONE); 608ae8ec5e1SHisping Lin 609ae8ec5e1SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 61046b2a054SHisping Lin 141, 611ae8ec5e1SHisping Lin &TeecOperation, 612ae8ec5e1SHisping Lin &ErrorOrigin); 613ae8ec5e1SHisping Lin 614ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 615ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem1); 616ae8ec5e1SHisping Lin TEEC_CloseSession(&TeecSession); 61746b2a054SHisping Lin TEEC_FinalizeContext(&TeecContext); 618ae8ec5e1SHisping Lin debug("testmm end\n"); 619ae8ec5e1SHisping Lin 620ae8ec5e1SHisping Lin return TeecResult; 621ae8ec5e1SHisping Lin } 622ae8ec5e1SHisping Lin 623ae8ec5e1SHisping Lin uint32_t trusty_read_lock_state(uint8_t *lock_state) 624ae8ec5e1SHisping Lin { 625ae8ec5e1SHisping Lin TEEC_Result TeecResult; 626ae8ec5e1SHisping Lin TEEC_Context TeecContext; 627ae8ec5e1SHisping Lin TEEC_Session TeecSession; 628ae8ec5e1SHisping Lin uint32_t ErrorOrigin; 629ae8ec5e1SHisping Lin TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 630ae8ec5e1SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 631ae8ec5e1SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 632ae8ec5e1SHisping Lin TEEC_Operation TeecOperation = {0}; 6333251364cSHisping Lin struct blk_desc *dev_desc; 6343251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 6356651d4c0SJason Zhu if (!dev_desc) { 6366651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 6376651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 6386651d4c0SJason Zhu } 639ae8ec5e1SHisping Lin 640ae8ec5e1SHisping Lin debug("testmm start\n"); 641ae8ec5e1SHisping Lin OpteeClientApiLibInitialize(); 642ae8ec5e1SHisping Lin 643ae8ec5e1SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 644ae8ec5e1SHisping Lin 6453251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 6463251364cSHisping Lin TEEC_NONE, 6473251364cSHisping Lin TEEC_NONE, 6483251364cSHisping Lin TEEC_NONE); 6493251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 6503251364cSHisping Lin TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0; 6513251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 6523251364cSHisping Lin TeecOperation.params[0].value.a = 0; 6533251364cSHisping Lin #endif 654ae8ec5e1SHisping Lin 655ae8ec5e1SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 656ae8ec5e1SHisping Lin &TeecSession, 657ae8ec5e1SHisping Lin TeecUuid, 658ae8ec5e1SHisping Lin TEEC_LOGIN_PUBLIC, 659ae8ec5e1SHisping Lin NULL, 6603251364cSHisping Lin &TeecOperation, 661ae8ec5e1SHisping Lin &ErrorOrigin); 662ae8ec5e1SHisping Lin 663ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 664ae8ec5e1SHisping Lin 665ae8ec5e1SHisping Lin SharedMem0.size = sizeof("lock_state"); 666ae8ec5e1SHisping Lin SharedMem0.flags = 0; 667ae8ec5e1SHisping Lin 668ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 669ae8ec5e1SHisping Lin 670ae8ec5e1SHisping Lin memcpy(SharedMem0.buffer, "lock_state", SharedMem0.size); 671ae8ec5e1SHisping Lin 672ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem1 = {0}; 673ae8ec5e1SHisping Lin 674ae8ec5e1SHisping Lin SharedMem1.size = 1; 675ae8ec5e1SHisping Lin SharedMem1.flags = 0; 676ae8ec5e1SHisping Lin 677ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 678ae8ec5e1SHisping Lin 679ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 680ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 681ae8ec5e1SHisping Lin 682ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 683ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem1.size; 684ae8ec5e1SHisping Lin 685ae8ec5e1SHisping Lin 686ae8ec5e1SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 687ae8ec5e1SHisping Lin TEEC_MEMREF_TEMP_INOUT, 688ae8ec5e1SHisping Lin TEEC_NONE, 689ae8ec5e1SHisping Lin TEEC_NONE); 690ae8ec5e1SHisping Lin 691ae8ec5e1SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 692ae8ec5e1SHisping Lin 0, 693ae8ec5e1SHisping Lin &TeecOperation, 694ae8ec5e1SHisping Lin &ErrorOrigin); 69546b2a054SHisping Lin if (TeecResult == TEEC_SUCCESS) 696ae8ec5e1SHisping Lin memcpy(lock_state, SharedMem1.buffer, SharedMem1.size); 697ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 698ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem1); 699ae8ec5e1SHisping Lin TEEC_CloseSession(&TeecSession); 70046b2a054SHisping Lin TEEC_FinalizeContext(&TeecContext); 701ae8ec5e1SHisping Lin debug("testmm end\n"); 702ae8ec5e1SHisping Lin 703ae8ec5e1SHisping Lin return TeecResult; 704ae8ec5e1SHisping Lin } 705ae8ec5e1SHisping Lin 706ae8ec5e1SHisping Lin uint32_t trusty_write_lock_state(uint8_t lock_state) 707ae8ec5e1SHisping Lin { 708ae8ec5e1SHisping Lin TEEC_Result TeecResult; 709ae8ec5e1SHisping Lin TEEC_Context TeecContext; 710ae8ec5e1SHisping Lin TEEC_Session TeecSession; 711ae8ec5e1SHisping Lin uint32_t ErrorOrigin; 712ae8ec5e1SHisping Lin TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 713ae8ec5e1SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 714ae8ec5e1SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 715ae8ec5e1SHisping Lin TEEC_Operation TeecOperation = {0}; 7163251364cSHisping Lin struct blk_desc *dev_desc; 7173251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 7186651d4c0SJason Zhu if (!dev_desc) { 7196651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 7206651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 7216651d4c0SJason Zhu } 722ae8ec5e1SHisping Lin 723ae8ec5e1SHisping Lin debug("testmm start\n"); 724ae8ec5e1SHisping Lin OpteeClientApiLibInitialize(); 725ae8ec5e1SHisping Lin 726ae8ec5e1SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 727ae8ec5e1SHisping Lin 7283251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 7293251364cSHisping Lin TEEC_NONE, 7303251364cSHisping Lin TEEC_NONE, 7313251364cSHisping Lin TEEC_NONE); 7323251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 7333251364cSHisping Lin TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0; 7343251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 7353251364cSHisping Lin TeecOperation.params[0].value.a = 0; 7363251364cSHisping Lin #endif 7373251364cSHisping Lin 738ae8ec5e1SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 739ae8ec5e1SHisping Lin &TeecSession, 740ae8ec5e1SHisping Lin TeecUuid, 741ae8ec5e1SHisping Lin TEEC_LOGIN_PUBLIC, 742ae8ec5e1SHisping Lin NULL, 7433251364cSHisping Lin &TeecOperation, 744ae8ec5e1SHisping Lin &ErrorOrigin); 745ae8ec5e1SHisping Lin 746ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 747ae8ec5e1SHisping Lin 748ae8ec5e1SHisping Lin SharedMem0.size = sizeof("lock_state"); 749ae8ec5e1SHisping Lin SharedMem0.flags = 0; 750ae8ec5e1SHisping Lin 751ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 752ae8ec5e1SHisping Lin 753ae8ec5e1SHisping Lin memcpy(SharedMem0.buffer, "lock_state", SharedMem0.size); 754ae8ec5e1SHisping Lin 755ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem1 = {0}; 756ae8ec5e1SHisping Lin 757ae8ec5e1SHisping Lin SharedMem1.size = 1; 758ae8ec5e1SHisping Lin SharedMem1.flags = 0; 759ae8ec5e1SHisping Lin 760ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 761ae8ec5e1SHisping Lin 762ae8ec5e1SHisping Lin memcpy(SharedMem1.buffer, &lock_state, SharedMem1.size); 763ae8ec5e1SHisping Lin 764ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 765ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 766ae8ec5e1SHisping Lin 767ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 768ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem1.size; 769ae8ec5e1SHisping Lin 770ae8ec5e1SHisping Lin 771ae8ec5e1SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 772ae8ec5e1SHisping Lin TEEC_MEMREF_TEMP_INOUT, 773ae8ec5e1SHisping Lin TEEC_NONE, 774ae8ec5e1SHisping Lin TEEC_NONE); 775ae8ec5e1SHisping Lin 776ae8ec5e1SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 777ae8ec5e1SHisping Lin 1, 778ae8ec5e1SHisping Lin &TeecOperation, 779ae8ec5e1SHisping Lin &ErrorOrigin); 780ae8ec5e1SHisping Lin 781ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 782ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem1); 783ae8ec5e1SHisping Lin TEEC_CloseSession(&TeecSession); 78446b2a054SHisping Lin TEEC_FinalizeContext(&TeecContext); 785ae8ec5e1SHisping Lin debug("testmm end\n"); 786ae8ec5e1SHisping Lin 787ae8ec5e1SHisping Lin return TeecResult; 788ae8ec5e1SHisping Lin } 789ae8ec5e1SHisping Lin 790ae8ec5e1SHisping Lin uint32_t trusty_read_flash_lock_state(uint8_t *flash_lock_state) 791ae8ec5e1SHisping Lin { 792ae8ec5e1SHisping Lin TEEC_Result TeecResult; 793ae8ec5e1SHisping Lin TEEC_Context TeecContext; 794ae8ec5e1SHisping Lin TEEC_Session TeecSession; 795ae8ec5e1SHisping Lin uint32_t ErrorOrigin; 796ae8ec5e1SHisping Lin TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 797ae8ec5e1SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 798ae8ec5e1SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 799ae8ec5e1SHisping Lin TEEC_Operation TeecOperation = {0}; 8003251364cSHisping Lin struct blk_desc *dev_desc; 8013251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 8026651d4c0SJason Zhu if (!dev_desc) { 8036651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 8046651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 8056651d4c0SJason Zhu } 806ae8ec5e1SHisping Lin 807ae8ec5e1SHisping Lin debug("testmm start\n"); 808ae8ec5e1SHisping Lin OpteeClientApiLibInitialize(); 809ae8ec5e1SHisping Lin 810ae8ec5e1SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 811ae8ec5e1SHisping Lin 8123251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 8133251364cSHisping Lin TEEC_NONE, 8143251364cSHisping Lin TEEC_NONE, 8153251364cSHisping Lin TEEC_NONE); 8163251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 8173251364cSHisping Lin TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0; 8183251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 8193251364cSHisping Lin TeecOperation.params[0].value.a = 0; 8203251364cSHisping Lin #endif 821ae8ec5e1SHisping Lin 822ae8ec5e1SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 823ae8ec5e1SHisping Lin &TeecSession, 824ae8ec5e1SHisping Lin TeecUuid, 825ae8ec5e1SHisping Lin TEEC_LOGIN_PUBLIC, 826ae8ec5e1SHisping Lin NULL, 8273251364cSHisping Lin &TeecOperation, 828ae8ec5e1SHisping Lin &ErrorOrigin); 829ae8ec5e1SHisping Lin 830ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 831ae8ec5e1SHisping Lin 832ae8ec5e1SHisping Lin SharedMem0.size = sizeof("flash_lock_state"); 833ae8ec5e1SHisping Lin SharedMem0.flags = 0; 834ae8ec5e1SHisping Lin 835ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 836ae8ec5e1SHisping Lin 837ae8ec5e1SHisping Lin memcpy(SharedMem0.buffer, "flash_lock_state", SharedMem0.size); 838ae8ec5e1SHisping Lin 839ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem1 = {0}; 840ae8ec5e1SHisping Lin 841ae8ec5e1SHisping Lin SharedMem1.size = 1; 842ae8ec5e1SHisping Lin SharedMem1.flags = 0; 843ae8ec5e1SHisping Lin 844ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 845ae8ec5e1SHisping Lin 846ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 847ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 848ae8ec5e1SHisping Lin 849ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 850ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem1.size; 851ae8ec5e1SHisping Lin 852ae8ec5e1SHisping Lin 853ae8ec5e1SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 854ae8ec5e1SHisping Lin TEEC_MEMREF_TEMP_INOUT, 855ae8ec5e1SHisping Lin TEEC_NONE, 856ae8ec5e1SHisping Lin TEEC_NONE); 857ae8ec5e1SHisping Lin 858ae8ec5e1SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 859ae8ec5e1SHisping Lin 0, 860ae8ec5e1SHisping Lin &TeecOperation, 861ae8ec5e1SHisping Lin &ErrorOrigin); 86246b2a054SHisping Lin if (TeecResult == TEEC_SUCCESS) 863ae8ec5e1SHisping Lin memcpy(flash_lock_state, SharedMem1.buffer, SharedMem1.size); 864ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 865ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem1); 866ae8ec5e1SHisping Lin TEEC_CloseSession(&TeecSession); 86746b2a054SHisping Lin TEEC_FinalizeContext(&TeecContext); 868ae8ec5e1SHisping Lin debug("testmm end\n"); 869ae8ec5e1SHisping Lin 870ae8ec5e1SHisping Lin return TeecResult; 871ae8ec5e1SHisping Lin } 872ae8ec5e1SHisping Lin 873ae8ec5e1SHisping Lin 874ae8ec5e1SHisping Lin uint32_t trusty_write_flash_lock_state(uint8_t flash_lock_state) 875ae8ec5e1SHisping Lin { 876ae8ec5e1SHisping Lin TEEC_Result TeecResult; 877ae8ec5e1SHisping Lin TEEC_Context TeecContext; 878ae8ec5e1SHisping Lin TEEC_Session TeecSession; 879ae8ec5e1SHisping Lin uint32_t ErrorOrigin; 880ae8ec5e1SHisping Lin TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 881ae8ec5e1SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 882ae8ec5e1SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 883ae8ec5e1SHisping Lin TEEC_Operation TeecOperation = {0}; 8843251364cSHisping Lin struct blk_desc *dev_desc; 8853251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 8866651d4c0SJason Zhu if (!dev_desc) { 8876651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 8886651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 8896651d4c0SJason Zhu } 890ae8ec5e1SHisping Lin 891ae8ec5e1SHisping Lin debug("testmm start\n"); 892ae8ec5e1SHisping Lin OpteeClientApiLibInitialize(); 893ae8ec5e1SHisping Lin 894ae8ec5e1SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 895ae8ec5e1SHisping Lin 8963251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 8973251364cSHisping Lin TEEC_NONE, 8983251364cSHisping Lin TEEC_NONE, 8993251364cSHisping Lin TEEC_NONE); 9003251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 9013251364cSHisping Lin TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0; 9023251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 9033251364cSHisping Lin TeecOperation.params[0].value.a = 0; 9043251364cSHisping Lin #endif 9053251364cSHisping Lin 906ae8ec5e1SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 907ae8ec5e1SHisping Lin &TeecSession, 908ae8ec5e1SHisping Lin TeecUuid, 909ae8ec5e1SHisping Lin TEEC_LOGIN_PUBLIC, 910ae8ec5e1SHisping Lin NULL, 9113251364cSHisping Lin &TeecOperation, 912ae8ec5e1SHisping Lin &ErrorOrigin); 913ae8ec5e1SHisping Lin 914ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 915ae8ec5e1SHisping Lin 916ae8ec5e1SHisping Lin SharedMem0.size = sizeof("flash_lock_state"); 917ae8ec5e1SHisping Lin SharedMem0.flags = 0; 918ae8ec5e1SHisping Lin 919ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 920ae8ec5e1SHisping Lin 921ae8ec5e1SHisping Lin memcpy(SharedMem0.buffer, "flash_lock_state", SharedMem0.size); 922ae8ec5e1SHisping Lin 923ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem1 = {0}; 924ae8ec5e1SHisping Lin 925ae8ec5e1SHisping Lin SharedMem1.size = 1; 926ae8ec5e1SHisping Lin SharedMem1.flags = 0; 927ae8ec5e1SHisping Lin 928ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 929ae8ec5e1SHisping Lin 930ae8ec5e1SHisping Lin memcpy(SharedMem1.buffer, &flash_lock_state, SharedMem1.size); 931ae8ec5e1SHisping Lin 932ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 933ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 934ae8ec5e1SHisping Lin 935ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 936ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem1.size; 937ae8ec5e1SHisping Lin 938ae8ec5e1SHisping Lin 939ae8ec5e1SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 940ae8ec5e1SHisping Lin TEEC_MEMREF_TEMP_INOUT, 941ae8ec5e1SHisping Lin TEEC_NONE, 942ae8ec5e1SHisping Lin TEEC_NONE); 943ae8ec5e1SHisping Lin 944ae8ec5e1SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 945ae8ec5e1SHisping Lin 1, 946ae8ec5e1SHisping Lin &TeecOperation, 947ae8ec5e1SHisping Lin &ErrorOrigin); 948ae8ec5e1SHisping Lin 949ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 950ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem1); 951ae8ec5e1SHisping Lin TEEC_CloseSession(&TeecSession); 95246b2a054SHisping Lin TEEC_FinalizeContext(&TeecContext); 953ae8ec5e1SHisping Lin debug("testmm end\n"); 954ae8ec5e1SHisping Lin 955ae8ec5e1SHisping Lin return TeecResult; 956ae8ec5e1SHisping Lin } 957ae8ec5e1SHisping Lin 95878ef5fbdSqiujian TEEC_Result read_from_keymaster(uint8_t *filename, 95978ef5fbdSqiujian uint32_t filename_size, 96078ef5fbdSqiujian uint8_t *data, 96178ef5fbdSqiujian uint32_t size) 96278ef5fbdSqiujian { 96378ef5fbdSqiujian TEEC_Result TeecResult; 96478ef5fbdSqiujian TEEC_Context TeecContext; 96578ef5fbdSqiujian TEEC_Session TeecSession; 96678ef5fbdSqiujian uint32_t ErrorOrigin; 96778ef5fbdSqiujian TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6, 96878ef5fbdSqiujian { 0xa8, 0x69, 0x9c, 0xe6, 0x88, 0x6c, 0x5d, 0x5d } }; 96978ef5fbdSqiujian TEEC_UUID *TeecUuid = &tempuuid; 97078ef5fbdSqiujian TEEC_Operation TeecOperation = {0}; 97178ef5fbdSqiujian struct blk_desc *dev_desc; 97278ef5fbdSqiujian dev_desc = rockchip_get_bootdev(); 9736651d4c0SJason Zhu if (!dev_desc) { 9746651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 9756651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 9766651d4c0SJason Zhu } 97778ef5fbdSqiujian 97878ef5fbdSqiujian debug("read_from_keymaster start\n"); 97978ef5fbdSqiujian OpteeClientApiLibInitialize(); 98078ef5fbdSqiujian 98178ef5fbdSqiujian TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 98278ef5fbdSqiujian 98378ef5fbdSqiujian TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 98478ef5fbdSqiujian TEEC_NONE, 98578ef5fbdSqiujian TEEC_NONE, 98678ef5fbdSqiujian TEEC_NONE); 98778ef5fbdSqiujian /*0 nand or emmc "security" partition , 1 rpmb*/ 98878ef5fbdSqiujian TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0; 98978ef5fbdSqiujian #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 99078ef5fbdSqiujian TeecOperation.params[0].value.a = 0; 99178ef5fbdSqiujian #endif 99278ef5fbdSqiujian 99378ef5fbdSqiujian TeecResult = TEEC_OpenSession(&TeecContext, 99478ef5fbdSqiujian &TeecSession, 99578ef5fbdSqiujian TeecUuid, 99678ef5fbdSqiujian TEEC_LOGIN_PUBLIC, 99778ef5fbdSqiujian NULL, 99878ef5fbdSqiujian &TeecOperation, 99978ef5fbdSqiujian &ErrorOrigin); 100078ef5fbdSqiujian 100178ef5fbdSqiujian TEEC_SharedMemory SharedMem0 = {0}; 100278ef5fbdSqiujian 100378ef5fbdSqiujian SharedMem0.size = filename_size; 100478ef5fbdSqiujian SharedMem0.flags = 0; 100578ef5fbdSqiujian 100678ef5fbdSqiujian TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 100778ef5fbdSqiujian 100878ef5fbdSqiujian memcpy(SharedMem0.buffer, filename, SharedMem0.size); 100978ef5fbdSqiujian 101078ef5fbdSqiujian TEEC_SharedMemory SharedMem1 = {0}; 101178ef5fbdSqiujian 101278ef5fbdSqiujian SharedMem1.size = size; 101378ef5fbdSqiujian SharedMem1.flags = 0; 101478ef5fbdSqiujian 101578ef5fbdSqiujian TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 101678ef5fbdSqiujian 101778ef5fbdSqiujian TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 101878ef5fbdSqiujian TeecOperation.params[0].tmpref.size = SharedMem0.size; 101978ef5fbdSqiujian 102078ef5fbdSqiujian TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 102178ef5fbdSqiujian TeecOperation.params[1].tmpref.size = SharedMem1.size; 102278ef5fbdSqiujian 102378ef5fbdSqiujian 102478ef5fbdSqiujian TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 102578ef5fbdSqiujian TEEC_MEMREF_TEMP_INOUT, 102678ef5fbdSqiujian TEEC_NONE, 102778ef5fbdSqiujian TEEC_NONE); 102878ef5fbdSqiujian 102978ef5fbdSqiujian TeecResult = TEEC_InvokeCommand(&TeecSession, 103078ef5fbdSqiujian 142, 103178ef5fbdSqiujian &TeecOperation, 103278ef5fbdSqiujian &ErrorOrigin); 103378ef5fbdSqiujian if (TeecResult == TEEC_SUCCESS) 103478ef5fbdSqiujian memcpy(data, SharedMem1.buffer, SharedMem1.size); 103578ef5fbdSqiujian TEEC_ReleaseSharedMemory(&SharedMem0); 103678ef5fbdSqiujian TEEC_ReleaseSharedMemory(&SharedMem1); 103778ef5fbdSqiujian TEEC_CloseSession(&TeecSession); 103878ef5fbdSqiujian TEEC_FinalizeContext(&TeecContext); 103978ef5fbdSqiujian debug("read_from_keymaster end\n"); 104078ef5fbdSqiujian 104178ef5fbdSqiujian return TeecResult; 104278ef5fbdSqiujian } 104378ef5fbdSqiujian 1044ae8ec5e1SHisping Lin uint32_t write_to_keymaster(uint8_t *filename, 1045ae8ec5e1SHisping Lin uint32_t filename_size, 1046ae8ec5e1SHisping Lin uint8_t *data, 1047ae8ec5e1SHisping Lin uint32_t data_size) 1048ae8ec5e1SHisping Lin { 1049ae8ec5e1SHisping Lin TEEC_Result TeecResult; 1050ae8ec5e1SHisping Lin TEEC_Context TeecContext; 1051ae8ec5e1SHisping Lin TEEC_Session TeecSession; 1052ae8ec5e1SHisping Lin uint32_t ErrorOrigin; 1053ae8ec5e1SHisping Lin 1054ae8ec5e1SHisping Lin TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6, 1055ae8ec5e1SHisping Lin { 0xa8, 0x69, 0x9c, 0xe6, 0x88, 0x6c, 0x5d, 0x5d } }; 1056ae8ec5e1SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 1057ae8ec5e1SHisping Lin TEEC_Operation TeecOperation = {0}; 10583251364cSHisping Lin struct blk_desc *dev_desc; 10593251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 10606651d4c0SJason Zhu if (!dev_desc) { 10616651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 10626651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 10636651d4c0SJason Zhu } 1064ae8ec5e1SHisping Lin 1065ae8ec5e1SHisping Lin debug("write_to_keymaster\n"); 1066ae8ec5e1SHisping Lin OpteeClientApiLibInitialize(); 1067ae8ec5e1SHisping Lin 1068ae8ec5e1SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1069ae8ec5e1SHisping Lin 10703251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 10713251364cSHisping Lin TEEC_NONE, 10723251364cSHisping Lin TEEC_NONE, 10733251364cSHisping Lin TEEC_NONE); 10743251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 10753251364cSHisping Lin TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0; 10763251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 10773251364cSHisping Lin TeecOperation.params[0].value.a = 0; 10783251364cSHisping Lin #endif 10793251364cSHisping Lin 1080ae8ec5e1SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 1081ae8ec5e1SHisping Lin &TeecSession, 1082ae8ec5e1SHisping Lin TeecUuid, 1083ae8ec5e1SHisping Lin TEEC_LOGIN_PUBLIC, 1084ae8ec5e1SHisping Lin NULL, 10853251364cSHisping Lin &TeecOperation, 1086ae8ec5e1SHisping Lin &ErrorOrigin); 1087ae8ec5e1SHisping Lin 1088ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 1089ae8ec5e1SHisping Lin 1090ae8ec5e1SHisping Lin SharedMem0.size = filename_size; 1091ae8ec5e1SHisping Lin SharedMem0.flags = 0; 1092ae8ec5e1SHisping Lin 1093ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 1094ae8ec5e1SHisping Lin 1095ae8ec5e1SHisping Lin memcpy(SharedMem0.buffer, filename, SharedMem0.size); 1096ae8ec5e1SHisping Lin 1097ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem1 = {0}; 1098ae8ec5e1SHisping Lin 1099ae8ec5e1SHisping Lin SharedMem1.size = data_size; 1100ae8ec5e1SHisping Lin SharedMem1.flags = 0; 1101ae8ec5e1SHisping Lin 1102ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 1103ae8ec5e1SHisping Lin 1104ae8ec5e1SHisping Lin memcpy(SharedMem1.buffer, data, SharedMem1.size); 1105ae8ec5e1SHisping Lin 1106ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 1107ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 1108ae8ec5e1SHisping Lin 1109ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 1110ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem1.size; 1111ae8ec5e1SHisping Lin 1112ae8ec5e1SHisping Lin 1113ae8ec5e1SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 1114ae8ec5e1SHisping Lin TEEC_MEMREF_TEMP_INOUT, 1115ae8ec5e1SHisping Lin TEEC_NONE, 1116ae8ec5e1SHisping Lin TEEC_NONE); 1117ae8ec5e1SHisping Lin 1118ae8ec5e1SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 11191f25ada2SHisping Lin 141, 1120ae8ec5e1SHisping Lin &TeecOperation, 1121ae8ec5e1SHisping Lin &ErrorOrigin); 1122ae8ec5e1SHisping Lin 1123ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 1124ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem1); 1125ae8ec5e1SHisping Lin TEEC_CloseSession(&TeecSession); 112646b2a054SHisping Lin TEEC_FinalizeContext(&TeecContext); 112778ef5fbdSqiujian debug("write_to_keymaster end\n"); 1128ae8ec5e1SHisping Lin debug("TeecResult %x\n", TeecResult); 1129ae8ec5e1SHisping Lin 1130ae8ec5e1SHisping Lin return TeecResult; 1131ae8ec5e1SHisping Lin } 11326ef445a4SHisping Lin 11336ef445a4SHisping Lin uint32_t trusty_read_attribute_hash(uint32_t *buf, uint32_t length) 11346ef445a4SHisping Lin { 11356ef445a4SHisping Lin TEEC_Result TeecResult; 11366ef445a4SHisping Lin TEEC_Context TeecContext; 11376ef445a4SHisping Lin TEEC_Session TeecSession; 11386ef445a4SHisping Lin uint32_t ErrorOrigin; 11396ef445a4SHisping Lin 11406ef445a4SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, \ 11416ef445a4SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 11426ef445a4SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 11436ef445a4SHisping Lin TEEC_Operation TeecOperation = {0}; 11446ef445a4SHisping Lin 11456ef445a4SHisping Lin OpteeClientApiLibInitialize(); 11466ef445a4SHisping Lin 11476ef445a4SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 11486ef445a4SHisping Lin 11496ef445a4SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 11506ef445a4SHisping Lin &TeecSession, 11516ef445a4SHisping Lin TeecUuid, 11526ef445a4SHisping Lin TEEC_LOGIN_PUBLIC, 11536ef445a4SHisping Lin NULL, 11546ef445a4SHisping Lin NULL, 11556ef445a4SHisping Lin &ErrorOrigin); 11566ef445a4SHisping Lin 11576ef445a4SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 11586ef445a4SHisping Lin 11596ef445a4SHisping Lin SharedMem0.size = length * sizeof(uint32_t); 11606ef445a4SHisping Lin SharedMem0.flags = 0; 11616ef445a4SHisping Lin 11626ef445a4SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 11636ef445a4SHisping Lin 11646ef445a4SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 11656ef445a4SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 11666ef445a4SHisping Lin 11676ef445a4SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT, 11686ef445a4SHisping Lin TEEC_NONE, 11696ef445a4SHisping Lin TEEC_NONE, 11706ef445a4SHisping Lin TEEC_NONE); 11716ef445a4SHisping Lin 11726ef445a4SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 11736ef445a4SHisping Lin 0, 11746ef445a4SHisping Lin &TeecOperation, 11756ef445a4SHisping Lin &ErrorOrigin); 11766ef445a4SHisping Lin 11776ef445a4SHisping Lin if (TeecResult == TEEC_SUCCESS) 11786ef445a4SHisping Lin memcpy(buf, SharedMem0.buffer, SharedMem0.size); 11796ef445a4SHisping Lin 11806ef445a4SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 11816ef445a4SHisping Lin TEEC_CloseSession(&TeecSession); 11826ef445a4SHisping Lin TEEC_FinalizeContext(&TeecContext); 11836ef445a4SHisping Lin 11846ef445a4SHisping Lin return TeecResult; 11856ef445a4SHisping Lin } 11866ef445a4SHisping Lin 11876ef445a4SHisping Lin uint32_t trusty_write_attribute_hash(uint32_t *buf, uint32_t length) 11886ef445a4SHisping Lin { 11896ef445a4SHisping Lin TEEC_Result TeecResult; 11906ef445a4SHisping Lin TEEC_Context TeecContext; 11916ef445a4SHisping Lin TEEC_Session TeecSession; 11926ef445a4SHisping Lin uint32_t ErrorOrigin; 11936ef445a4SHisping Lin 11946ef445a4SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, \ 11956ef445a4SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 11966ef445a4SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 11976ef445a4SHisping Lin TEEC_Operation TeecOperation = {0}; 11986ef445a4SHisping Lin 11996ef445a4SHisping Lin OpteeClientApiLibInitialize(); 12006ef445a4SHisping Lin 12016ef445a4SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 12026ef445a4SHisping Lin 12036ef445a4SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 12046ef445a4SHisping Lin &TeecSession, 12056ef445a4SHisping Lin TeecUuid, 12066ef445a4SHisping Lin TEEC_LOGIN_PUBLIC, 12076ef445a4SHisping Lin NULL, 12086ef445a4SHisping Lin NULL, 12096ef445a4SHisping Lin &ErrorOrigin); 12106ef445a4SHisping Lin 12116ef445a4SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 12126ef445a4SHisping Lin 12136ef445a4SHisping Lin SharedMem0.size = length * sizeof(uint32_t); 12146ef445a4SHisping Lin SharedMem0.flags = 0; 12156ef445a4SHisping Lin 12166ef445a4SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 12176ef445a4SHisping Lin 12186ef445a4SHisping Lin memcpy(SharedMem0.buffer, buf, SharedMem0.size); 12196ef445a4SHisping Lin 12206ef445a4SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 12216ef445a4SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 12226ef445a4SHisping Lin 12236ef445a4SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 12246ef445a4SHisping Lin TEEC_NONE, 12256ef445a4SHisping Lin TEEC_NONE, 12266ef445a4SHisping Lin TEEC_NONE); 12276ef445a4SHisping Lin 12286ef445a4SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 12296ef445a4SHisping Lin 1, 12306ef445a4SHisping Lin &TeecOperation, 12316ef445a4SHisping Lin &ErrorOrigin); 12326ef445a4SHisping Lin 12336ef445a4SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 12346ef445a4SHisping Lin TEEC_CloseSession(&TeecSession); 12356ef445a4SHisping Lin TEEC_FinalizeContext(&TeecContext); 12366ef445a4SHisping Lin 12376ef445a4SHisping Lin return TeecResult; 12386ef445a4SHisping Lin } 123916539616SHisping Lin 124016539616SHisping Lin uint32_t notify_optee_rpmb_ta(void) 124116539616SHisping Lin { 124216539616SHisping Lin TEEC_Result TeecResult; 124316539616SHisping Lin TEEC_Context TeecContext; 124416539616SHisping Lin TEEC_Session TeecSession; 124516539616SHisping Lin uint32_t ErrorOrigin; 124616539616SHisping Lin TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 124716539616SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 124816539616SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 124916539616SHisping Lin TEEC_Operation TeecOperation = {0}; 125016539616SHisping Lin 125116539616SHisping Lin OpteeClientApiLibInitialize(); 125216539616SHisping Lin 125316539616SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 125416539616SHisping Lin 125516539616SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 125616539616SHisping Lin &TeecSession, 125716539616SHisping Lin TeecUuid, 125816539616SHisping Lin TEEC_LOGIN_PUBLIC, 125916539616SHisping Lin NULL, 126016539616SHisping Lin NULL, 126116539616SHisping Lin &ErrorOrigin); 126216539616SHisping Lin 126316539616SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE, 126416539616SHisping Lin TEEC_NONE, 126516539616SHisping Lin TEEC_NONE, 126616539616SHisping Lin TEEC_NONE); 126716539616SHisping Lin 126816539616SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 126916539616SHisping Lin 2, 127016539616SHisping Lin &TeecOperation, 127116539616SHisping Lin &ErrorOrigin); 127216539616SHisping Lin 127316539616SHisping Lin TEEC_CloseSession(&TeecSession); 127416539616SHisping Lin TEEC_FinalizeContext(&TeecContext); 127516539616SHisping Lin 127616539616SHisping Lin return TeecResult; 127716539616SHisping Lin } 127816539616SHisping Lin 127916539616SHisping Lin uint32_t notify_optee_efuse_ta(void) 128016539616SHisping Lin { 128116539616SHisping Lin TEEC_Result TeecResult; 128216539616SHisping Lin TEEC_Context TeecContext; 128316539616SHisping Lin TEEC_Session TeecSession; 128416539616SHisping Lin uint32_t ErrorOrigin; 128516539616SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, \ 128616539616SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 128716539616SHisping Lin 128816539616SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 128916539616SHisping Lin TEEC_Operation TeecOperation = {0}; 129016539616SHisping Lin 129116539616SHisping Lin OpteeClientApiLibInitialize(); 129216539616SHisping Lin 129316539616SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 129416539616SHisping Lin 129516539616SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 129616539616SHisping Lin &TeecSession, 129716539616SHisping Lin TeecUuid, 129816539616SHisping Lin TEEC_LOGIN_PUBLIC, 129916539616SHisping Lin NULL, 130016539616SHisping Lin NULL, 130116539616SHisping Lin &ErrorOrigin); 130216539616SHisping Lin 130316539616SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE, 130416539616SHisping Lin TEEC_NONE, 130516539616SHisping Lin TEEC_NONE, 130616539616SHisping Lin TEEC_NONE); 130716539616SHisping Lin 130816539616SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 130916539616SHisping Lin 2, 131016539616SHisping Lin &TeecOperation, 131116539616SHisping Lin &ErrorOrigin); 131216539616SHisping Lin 131316539616SHisping Lin TEEC_CloseSession(&TeecSession); 131416539616SHisping Lin TEEC_FinalizeContext(&TeecContext); 131516539616SHisping Lin 131616539616SHisping Lin return TeecResult; 131716539616SHisping Lin } 131816539616SHisping Lin 131916539616SHisping Lin uint32_t trusty_notify_optee_uboot_end(void) 132016539616SHisping Lin { 132116539616SHisping Lin TEEC_Result res; 132216539616SHisping Lin res = notify_optee_rpmb_ta(); 132316539616SHisping Lin res |= notify_optee_efuse_ta(); 132416539616SHisping Lin return res; 132516539616SHisping Lin } 13262cd27853SHisping Lin 13272cd27853SHisping Lin uint32_t trusty_read_vbootkey_hash(uint32_t *buf, uint32_t length) 13282cd27853SHisping Lin { 13292cd27853SHisping Lin TEEC_Result TeecResult; 13302cd27853SHisping Lin TEEC_Context TeecContext; 13312cd27853SHisping Lin TEEC_Session TeecSession; 13322cd27853SHisping Lin uint32_t ErrorOrigin; 13332cd27853SHisping Lin 13342cd27853SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, \ 13352cd27853SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 13362cd27853SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 13372cd27853SHisping Lin TEEC_Operation TeecOperation = {0}; 13382cd27853SHisping Lin 13392cd27853SHisping Lin OpteeClientApiLibInitialize(); 13402cd27853SHisping Lin 13412cd27853SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 13422cd27853SHisping Lin 13432cd27853SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 13442cd27853SHisping Lin &TeecSession, 13452cd27853SHisping Lin TeecUuid, 13462cd27853SHisping Lin TEEC_LOGIN_PUBLIC, 13472cd27853SHisping Lin NULL, 13482cd27853SHisping Lin NULL, 13492cd27853SHisping Lin &ErrorOrigin); 13502cd27853SHisping Lin 13512cd27853SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 13522cd27853SHisping Lin 13532cd27853SHisping Lin SharedMem0.size = length * sizeof(uint32_t); 13542cd27853SHisping Lin SharedMem0.flags = 0; 13552cd27853SHisping Lin 13562cd27853SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 13572cd27853SHisping Lin 13582cd27853SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 13592cd27853SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 13602cd27853SHisping Lin 13612cd27853SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT, 13622cd27853SHisping Lin TEEC_NONE, 13632cd27853SHisping Lin TEEC_NONE, 13642cd27853SHisping Lin TEEC_NONE); 13652cd27853SHisping Lin 13662cd27853SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 13672cd27853SHisping Lin 3, 13682cd27853SHisping Lin &TeecOperation, 13692cd27853SHisping Lin &ErrorOrigin); 13702cd27853SHisping Lin 13712cd27853SHisping Lin if (TeecResult == TEEC_SUCCESS) 13722cd27853SHisping Lin memcpy(buf, SharedMem0.buffer, SharedMem0.size); 13732cd27853SHisping Lin 13742cd27853SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 13752cd27853SHisping Lin TEEC_CloseSession(&TeecSession); 13762cd27853SHisping Lin TEEC_FinalizeContext(&TeecContext); 13772cd27853SHisping Lin 13782cd27853SHisping Lin return TeecResult; 13792cd27853SHisping Lin } 13802cd27853SHisping Lin uint32_t trusty_write_vbootkey_hash(uint32_t *buf, uint32_t length) 13812cd27853SHisping Lin { 13822cd27853SHisping Lin TEEC_Result TeecResult; 13832cd27853SHisping Lin TEEC_Context TeecContext; 13842cd27853SHisping Lin TEEC_Session TeecSession; 13852cd27853SHisping Lin uint32_t ErrorOrigin; 13862cd27853SHisping Lin 13872cd27853SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, \ 13882cd27853SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 13892cd27853SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 13902cd27853SHisping Lin TEEC_Operation TeecOperation = {0}; 13912cd27853SHisping Lin 13922cd27853SHisping Lin OpteeClientApiLibInitialize(); 13932cd27853SHisping Lin 13942cd27853SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 13952cd27853SHisping Lin 13962cd27853SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 13972cd27853SHisping Lin &TeecSession, 13982cd27853SHisping Lin TeecUuid, 13992cd27853SHisping Lin TEEC_LOGIN_PUBLIC, 14002cd27853SHisping Lin NULL, 14012cd27853SHisping Lin NULL, 14022cd27853SHisping Lin &ErrorOrigin); 14032cd27853SHisping Lin 14042cd27853SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 14052cd27853SHisping Lin 14062cd27853SHisping Lin SharedMem0.size = length * sizeof(uint32_t); 14072cd27853SHisping Lin SharedMem0.flags = 0; 14082cd27853SHisping Lin 14092cd27853SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 14102cd27853SHisping Lin 14112cd27853SHisping Lin memcpy(SharedMem0.buffer, buf, SharedMem0.size); 14122cd27853SHisping Lin 14132cd27853SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 14142cd27853SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 14152cd27853SHisping Lin 14162cd27853SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 14172cd27853SHisping Lin TEEC_NONE, 14182cd27853SHisping Lin TEEC_NONE, 14192cd27853SHisping Lin TEEC_NONE); 14202cd27853SHisping Lin 14212cd27853SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 14222cd27853SHisping Lin 4, 14232cd27853SHisping Lin &TeecOperation, 14242cd27853SHisping Lin &ErrorOrigin); 14252cd27853SHisping Lin 14262cd27853SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 14272cd27853SHisping Lin TEEC_CloseSession(&TeecSession); 14282cd27853SHisping Lin TEEC_FinalizeContext(&TeecContext); 14292cd27853SHisping Lin 14302cd27853SHisping Lin return TeecResult; 14312cd27853SHisping Lin } 1432095e2a82SHisping Lin 1433468df3b2SHisping Lin uint32_t trusty_read_vbootkey_enable_flag(uint8_t *flag) 1434468df3b2SHisping Lin { 1435468df3b2SHisping Lin TEEC_Result TeecResult; 1436468df3b2SHisping Lin TEEC_Context TeecContext; 1437468df3b2SHisping Lin TEEC_Session TeecSession; 1438468df3b2SHisping Lin uint32_t ErrorOrigin; 1439468df3b2SHisping Lin uint32_t bootflag; 1440468df3b2SHisping Lin 1441468df3b2SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, \ 1442468df3b2SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 1443468df3b2SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 1444468df3b2SHisping Lin TEEC_Operation TeecOperation = {0}; 1445468df3b2SHisping Lin 1446468df3b2SHisping Lin OpteeClientApiLibInitialize(); 1447468df3b2SHisping Lin 1448468df3b2SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1449468df3b2SHisping Lin 1450468df3b2SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 1451468df3b2SHisping Lin &TeecSession, 1452468df3b2SHisping Lin TeecUuid, 1453468df3b2SHisping Lin TEEC_LOGIN_PUBLIC, 1454468df3b2SHisping Lin NULL, 1455468df3b2SHisping Lin NULL, 1456468df3b2SHisping Lin &ErrorOrigin); 1457468df3b2SHisping Lin 1458468df3b2SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 1459468df3b2SHisping Lin 1460468df3b2SHisping Lin SharedMem0.size = 1 * sizeof(uint32_t); 1461468df3b2SHisping Lin SharedMem0.flags = 0; 1462468df3b2SHisping Lin 1463468df3b2SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 1464468df3b2SHisping Lin 1465468df3b2SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 1466468df3b2SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 1467468df3b2SHisping Lin 1468468df3b2SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT, 1469468df3b2SHisping Lin TEEC_NONE, 1470468df3b2SHisping Lin TEEC_NONE, 1471468df3b2SHisping Lin TEEC_NONE); 1472468df3b2SHisping Lin 1473468df3b2SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 1474468df3b2SHisping Lin 5, 1475468df3b2SHisping Lin &TeecOperation, 1476468df3b2SHisping Lin &ErrorOrigin); 1477468df3b2SHisping Lin 1478468df3b2SHisping Lin if (TeecResult == TEEC_SUCCESS) { 1479468df3b2SHisping Lin memcpy(&bootflag, SharedMem0.buffer, SharedMem0.size); 1480468df3b2SHisping Lin if (bootflag == 0x000000FF) 1481468df3b2SHisping Lin *flag = 1; 1482468df3b2SHisping Lin } 1483468df3b2SHisping Lin 1484468df3b2SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 1485468df3b2SHisping Lin TEEC_CloseSession(&TeecSession); 1486468df3b2SHisping Lin TEEC_FinalizeContext(&TeecContext); 1487468df3b2SHisping Lin 1488468df3b2SHisping Lin return TeecResult; 1489468df3b2SHisping Lin } 1490468df3b2SHisping Lin 1491095e2a82SHisping Lin uint32_t trusty_read_permanent_attributes_flag(uint8_t *attributes) 1492095e2a82SHisping Lin { 1493095e2a82SHisping Lin TEEC_Result TeecResult; 1494095e2a82SHisping Lin TEEC_Context TeecContext; 1495095e2a82SHisping Lin TEEC_Session TeecSession; 1496095e2a82SHisping Lin uint32_t ErrorOrigin; 1497095e2a82SHisping Lin TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6, 1498095e2a82SHisping Lin { 0xa8, 0x69, 0x9c, 0xe6, 0x88, 0x6c, 0x5d, 0x5d } }; 1499095e2a82SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 1500095e2a82SHisping Lin TEEC_Operation TeecOperation = {0}; 15013251364cSHisping Lin struct blk_desc *dev_desc; 15023251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 15036651d4c0SJason Zhu if (!dev_desc) { 15046651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 15056651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 15066651d4c0SJason Zhu } 1507095e2a82SHisping Lin 1508095e2a82SHisping Lin debug("testmm start\n"); 1509095e2a82SHisping Lin OpteeClientApiLibInitialize(); 1510095e2a82SHisping Lin 1511095e2a82SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1512095e2a82SHisping Lin 15133251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 15143251364cSHisping Lin TEEC_NONE, 15153251364cSHisping Lin TEEC_NONE, 15163251364cSHisping Lin TEEC_NONE); 15173251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 15183251364cSHisping Lin TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0; 15193251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 15203251364cSHisping Lin TeecOperation.params[0].value.a = 0; 15213251364cSHisping Lin #endif 15223251364cSHisping Lin 1523095e2a82SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 1524095e2a82SHisping Lin &TeecSession, 1525095e2a82SHisping Lin TeecUuid, 1526095e2a82SHisping Lin TEEC_LOGIN_PUBLIC, 1527095e2a82SHisping Lin NULL, 15283251364cSHisping Lin &TeecOperation, 1529095e2a82SHisping Lin &ErrorOrigin); 1530095e2a82SHisping Lin 1531095e2a82SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 1532095e2a82SHisping Lin 1533095e2a82SHisping Lin SharedMem0.size = sizeof("attributes_flag"); 1534095e2a82SHisping Lin SharedMem0.flags = 0; 1535095e2a82SHisping Lin 1536095e2a82SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 1537095e2a82SHisping Lin 1538095e2a82SHisping Lin memcpy(SharedMem0.buffer, "attributes_flag", SharedMem0.size); 1539095e2a82SHisping Lin 1540095e2a82SHisping Lin TEEC_SharedMemory SharedMem1 = {0}; 1541095e2a82SHisping Lin 1542095e2a82SHisping Lin SharedMem1.size = 1; 1543095e2a82SHisping Lin SharedMem1.flags = 0; 1544095e2a82SHisping Lin 1545095e2a82SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 1546095e2a82SHisping Lin 1547095e2a82SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 1548095e2a82SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 1549095e2a82SHisping Lin 1550095e2a82SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 1551095e2a82SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem1.size; 1552095e2a82SHisping Lin 1553095e2a82SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 1554095e2a82SHisping Lin TEEC_MEMREF_TEMP_INOUT, 1555095e2a82SHisping Lin TEEC_NONE, 1556095e2a82SHisping Lin TEEC_NONE); 1557095e2a82SHisping Lin 1558095e2a82SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 1559095e2a82SHisping Lin 142, 1560095e2a82SHisping Lin &TeecOperation, 1561095e2a82SHisping Lin &ErrorOrigin); 1562095e2a82SHisping Lin if (TeecResult == TEEC_SUCCESS) 1563095e2a82SHisping Lin memcpy(attributes, SharedMem1.buffer, SharedMem1.size); 1564095e2a82SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 1565095e2a82SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem1); 1566095e2a82SHisping Lin TEEC_CloseSession(&TeecSession); 1567095e2a82SHisping Lin TEEC_FinalizeContext(&TeecContext); 1568095e2a82SHisping Lin debug("testmm end\n"); 1569095e2a82SHisping Lin 1570095e2a82SHisping Lin return TeecResult; 1571095e2a82SHisping Lin } 1572095e2a82SHisping Lin 1573095e2a82SHisping Lin uint32_t trusty_write_permanent_attributes_flag(uint8_t attributes) 1574095e2a82SHisping Lin { 1575095e2a82SHisping Lin TEEC_Result TeecResult; 1576095e2a82SHisping Lin TEEC_Context TeecContext; 1577095e2a82SHisping Lin TEEC_Session TeecSession; 1578095e2a82SHisping Lin uint32_t ErrorOrigin; 1579095e2a82SHisping Lin TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6, 1580095e2a82SHisping Lin { 0xa8, 0x69, 0x9c, 0xe6, 0x88, 0x6c, 0x5d, 0x5d } }; 1581095e2a82SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 1582095e2a82SHisping Lin TEEC_Operation TeecOperation = {0}; 15833251364cSHisping Lin struct blk_desc *dev_desc; 15843251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 15856651d4c0SJason Zhu if (!dev_desc) { 15866651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 15876651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 15886651d4c0SJason Zhu } 1589095e2a82SHisping Lin 1590095e2a82SHisping Lin debug("testmm start\n"); 1591095e2a82SHisping Lin OpteeClientApiLibInitialize(); 1592095e2a82SHisping Lin 1593095e2a82SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1594095e2a82SHisping Lin 15953251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 15963251364cSHisping Lin TEEC_NONE, 15973251364cSHisping Lin TEEC_NONE, 15983251364cSHisping Lin TEEC_NONE); 15993251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 16003251364cSHisping Lin TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0; 16013251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 16023251364cSHisping Lin TeecOperation.params[0].value.a = 0; 16033251364cSHisping Lin #endif 16043251364cSHisping Lin 1605095e2a82SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 1606095e2a82SHisping Lin &TeecSession, 1607095e2a82SHisping Lin TeecUuid, 1608095e2a82SHisping Lin TEEC_LOGIN_PUBLIC, 1609095e2a82SHisping Lin NULL, 16103251364cSHisping Lin &TeecOperation, 1611095e2a82SHisping Lin &ErrorOrigin); 1612095e2a82SHisping Lin 1613095e2a82SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 1614095e2a82SHisping Lin 1615095e2a82SHisping Lin SharedMem0.size = sizeof("attributes_flag"); 1616095e2a82SHisping Lin SharedMem0.flags = 0; 1617095e2a82SHisping Lin 1618095e2a82SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 1619095e2a82SHisping Lin 1620095e2a82SHisping Lin memcpy(SharedMem0.buffer, "attributes_flag", SharedMem0.size); 1621095e2a82SHisping Lin 1622095e2a82SHisping Lin TEEC_SharedMemory SharedMem1 = {0}; 1623095e2a82SHisping Lin 1624095e2a82SHisping Lin SharedMem1.size = 1; 1625095e2a82SHisping Lin SharedMem1.flags = 0; 1626095e2a82SHisping Lin 1627095e2a82SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 1628095e2a82SHisping Lin 1629095e2a82SHisping Lin memcpy(SharedMem1.buffer, (char *)&attributes, SharedMem1.size); 1630095e2a82SHisping Lin 1631095e2a82SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 1632095e2a82SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 1633095e2a82SHisping Lin 1634095e2a82SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 1635095e2a82SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem1.size; 1636095e2a82SHisping Lin 1637095e2a82SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 1638095e2a82SHisping Lin TEEC_MEMREF_TEMP_INOUT, 1639095e2a82SHisping Lin TEEC_NONE, 1640095e2a82SHisping Lin TEEC_NONE); 1641095e2a82SHisping Lin 1642095e2a82SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 1643095e2a82SHisping Lin 141, 1644095e2a82SHisping Lin &TeecOperation, 1645095e2a82SHisping Lin &ErrorOrigin); 1646095e2a82SHisping Lin 1647095e2a82SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 1648095e2a82SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem1); 1649095e2a82SHisping Lin TEEC_CloseSession(&TeecSession); 1650095e2a82SHisping Lin TEEC_FinalizeContext(&TeecContext); 1651095e2a82SHisping Lin debug("testmm end\n"); 1652095e2a82SHisping Lin 1653095e2a82SHisping Lin return TeecResult; 1654095e2a82SHisping Lin } 16554aa61755SAndy Ye 16564aa61755SAndy Ye uint32_t trusty_attest_dh(uint8_t *dh, uint32_t *dh_size) 16574aa61755SAndy Ye { 16584aa61755SAndy Ye TEEC_Result TeecResult; 16594aa61755SAndy Ye TEEC_Context TeecContext; 16604aa61755SAndy Ye TEEC_Session TeecSession; 16614aa61755SAndy Ye uint32_t ErrorOrigin; 16624aa61755SAndy Ye TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6, 16634aa61755SAndy Ye { 0xa8, 0x69, 0x9c, 0xe6, 16644aa61755SAndy Ye 0x88, 0x6c, 0x5d, 0x5d 16654aa61755SAndy Ye } 16664aa61755SAndy Ye }; 16674aa61755SAndy Ye TEEC_UUID *TeecUuid = &tempuuid; 16684aa61755SAndy Ye TEEC_Operation TeecOperation = {0}; 16693251364cSHisping Lin struct blk_desc *dev_desc; 16703251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 16716651d4c0SJason Zhu if (!dev_desc) { 16726651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 16736651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 16746651d4c0SJason Zhu } 16754aa61755SAndy Ye 16764aa61755SAndy Ye OpteeClientApiLibInitialize(); 16774aa61755SAndy Ye 16784aa61755SAndy Ye TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 16794aa61755SAndy Ye 16803251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 16813251364cSHisping Lin TEEC_NONE, 16823251364cSHisping Lin TEEC_NONE, 16833251364cSHisping Lin TEEC_NONE); 16843251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 16853251364cSHisping Lin TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0; 16863251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 16873251364cSHisping Lin TeecOperation.params[0].value.a = 0; 16883251364cSHisping Lin #endif 16893251364cSHisping Lin 16904aa61755SAndy Ye TeecResult = TEEC_OpenSession(&TeecContext, 16914aa61755SAndy Ye &TeecSession, 16924aa61755SAndy Ye TeecUuid, 16934aa61755SAndy Ye TEEC_LOGIN_PUBLIC, 16944aa61755SAndy Ye NULL, 16953251364cSHisping Lin &TeecOperation, 16964aa61755SAndy Ye &ErrorOrigin); 16974aa61755SAndy Ye 16984aa61755SAndy Ye TEEC_SharedMemory SharedMem0 = {0}; 16994aa61755SAndy Ye 17004aa61755SAndy Ye SharedMem0.size = *dh_size; 17014aa61755SAndy Ye SharedMem0.flags = 0; 17024aa61755SAndy Ye 17034aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 17044aa61755SAndy Ye 17054aa61755SAndy Ye TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 17064aa61755SAndy Ye TeecOperation.params[0].tmpref.size = SharedMem0.size; 17074aa61755SAndy Ye 17084aa61755SAndy Ye TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, 17094aa61755SAndy Ye TEEC_NONE, 17104aa61755SAndy Ye TEEC_NONE, 17114aa61755SAndy Ye TEEC_NONE); 17124aa61755SAndy Ye 17134aa61755SAndy Ye TeecResult = TEEC_InvokeCommand(&TeecSession, 17144aa61755SAndy Ye 143, 17154aa61755SAndy Ye &TeecOperation, 17164aa61755SAndy Ye &ErrorOrigin); 17174aa61755SAndy Ye 17184aa61755SAndy Ye *dh_size = TeecOperation.params[0].tmpref.size; 17194aa61755SAndy Ye memcpy(dh, SharedMem0.buffer, SharedMem0.size); 17204aa61755SAndy Ye 17214aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem0); 17224aa61755SAndy Ye 17234aa61755SAndy Ye TEEC_CloseSession(&TeecSession); 17244aa61755SAndy Ye TeecResult = TEEC_FinalizeContext(&TeecContext); 17254aa61755SAndy Ye 17264aa61755SAndy Ye return TeecResult; 17274aa61755SAndy Ye } 17284aa61755SAndy Ye 17294aa61755SAndy Ye uint32_t trusty_attest_uuid(uint8_t *uuid, uint32_t *uuid_size) 17304aa61755SAndy Ye { 17314aa61755SAndy Ye TEEC_Result TeecResult; 17324aa61755SAndy Ye TEEC_Context TeecContext; 17334aa61755SAndy Ye TEEC_Session TeecSession; 17344aa61755SAndy Ye uint32_t ErrorOrigin; 17354aa61755SAndy Ye TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6, 17364aa61755SAndy Ye { 0xa8, 0x69, 0x9c, 0xe6, 17374aa61755SAndy Ye 0x88, 0x6c, 0x5d, 0x5d 17384aa61755SAndy Ye } 17394aa61755SAndy Ye }; 17404aa61755SAndy Ye TEEC_UUID *TeecUuid = &tempuuid; 17414aa61755SAndy Ye TEEC_Operation TeecOperation = {0}; 17423251364cSHisping Lin struct blk_desc *dev_desc; 17433251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 17446651d4c0SJason Zhu if (!dev_desc) { 17456651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 17466651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 17476651d4c0SJason Zhu } 17484aa61755SAndy Ye 17494aa61755SAndy Ye OpteeClientApiLibInitialize(); 17504aa61755SAndy Ye 17514aa61755SAndy Ye TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 17524aa61755SAndy Ye 17533251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 17543251364cSHisping Lin TEEC_NONE, 17553251364cSHisping Lin TEEC_NONE, 17563251364cSHisping Lin TEEC_NONE); 17573251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 17583251364cSHisping Lin TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0; 17593251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 17603251364cSHisping Lin TeecOperation.params[0].value.a = 0; 17613251364cSHisping Lin #endif 17623251364cSHisping Lin 17634aa61755SAndy Ye TeecResult = TEEC_OpenSession(&TeecContext, 17644aa61755SAndy Ye &TeecSession, 17654aa61755SAndy Ye TeecUuid, 17664aa61755SAndy Ye TEEC_LOGIN_PUBLIC, 17674aa61755SAndy Ye NULL, 17683251364cSHisping Lin &TeecOperation, 17694aa61755SAndy Ye &ErrorOrigin); 17704aa61755SAndy Ye 17714aa61755SAndy Ye TEEC_SharedMemory SharedMem0 = {0}; 17724aa61755SAndy Ye 17734aa61755SAndy Ye SharedMem0.size = *uuid_size; 17744aa61755SAndy Ye SharedMem0.flags = 0; 17754aa61755SAndy Ye 17764aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 17774aa61755SAndy Ye 17784aa61755SAndy Ye TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 17794aa61755SAndy Ye TeecOperation.params[0].tmpref.size = SharedMem0.size; 17804aa61755SAndy Ye 17814aa61755SAndy Ye TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, 17824aa61755SAndy Ye TEEC_NONE, 17834aa61755SAndy Ye TEEC_NONE, 17844aa61755SAndy Ye TEEC_NONE); 17854aa61755SAndy Ye 17864aa61755SAndy Ye TeecResult = TEEC_InvokeCommand(&TeecSession, 17874aa61755SAndy Ye 144, 17884aa61755SAndy Ye &TeecOperation, 17894aa61755SAndy Ye &ErrorOrigin); 17904aa61755SAndy Ye 17914aa61755SAndy Ye *uuid_size = TeecOperation.params[0].tmpref.size; 17924aa61755SAndy Ye memcpy(uuid, SharedMem0.buffer, SharedMem0.size); 17934aa61755SAndy Ye 17944aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem0); 17954aa61755SAndy Ye 17964aa61755SAndy Ye TEEC_CloseSession(&TeecSession); 17974aa61755SAndy Ye TeecResult = TEEC_FinalizeContext(&TeecContext); 17984aa61755SAndy Ye 17994aa61755SAndy Ye return TeecResult; 18004aa61755SAndy Ye } 18014aa61755SAndy Ye 18024aa61755SAndy Ye uint32_t trusty_attest_get_ca(uint8_t *operation_start, 18034aa61755SAndy Ye uint32_t *operation_size, 18044aa61755SAndy Ye uint8_t *out, 18054aa61755SAndy Ye uint32_t *out_len) 18064aa61755SAndy Ye { 18074aa61755SAndy Ye TEEC_Result TeecResult; 18084aa61755SAndy Ye TEEC_Context TeecContext; 18094aa61755SAndy Ye TEEC_Session TeecSession; 18104aa61755SAndy Ye uint32_t ErrorOrigin; 18114aa61755SAndy Ye 18124aa61755SAndy Ye OpteeClientApiLibInitialize(); 18134aa61755SAndy Ye 18144aa61755SAndy Ye TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6, 18154aa61755SAndy Ye { 0xa8, 0x69, 0x9c, 0xe6, 18164aa61755SAndy Ye 0x88, 0x6c, 0x5d, 0x5d 18174aa61755SAndy Ye } 18184aa61755SAndy Ye }; 18194aa61755SAndy Ye 18204aa61755SAndy Ye TEEC_UUID *TeecUuid = &tempuuid; 18214aa61755SAndy Ye TEEC_Operation TeecOperation = {0}; 18223251364cSHisping Lin struct blk_desc *dev_desc; 18233251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 18246651d4c0SJason Zhu if (!dev_desc) { 18256651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 18266651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 18276651d4c0SJason Zhu } 18284aa61755SAndy Ye 18294aa61755SAndy Ye OpteeClientApiLibInitialize(); 18304aa61755SAndy Ye 18314aa61755SAndy Ye TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 18324aa61755SAndy Ye 18333251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 18343251364cSHisping Lin TEEC_NONE, 18353251364cSHisping Lin TEEC_NONE, 18363251364cSHisping Lin TEEC_NONE); 18373251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 18383251364cSHisping Lin TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0; 18393251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 18403251364cSHisping Lin TeecOperation.params[0].value.a = 0; 18413251364cSHisping Lin #endif 18423251364cSHisping Lin 18434aa61755SAndy Ye TeecResult = TEEC_OpenSession(&TeecContext, 18444aa61755SAndy Ye &TeecSession, 18454aa61755SAndy Ye TeecUuid, 18464aa61755SAndy Ye TEEC_LOGIN_PUBLIC, 18474aa61755SAndy Ye NULL, 18483251364cSHisping Lin &TeecOperation, 18494aa61755SAndy Ye &ErrorOrigin); 18504aa61755SAndy Ye 18514aa61755SAndy Ye TEEC_SharedMemory SharedMem0 = {0}; 18524aa61755SAndy Ye 18534aa61755SAndy Ye SharedMem0.size = *operation_size; 18544aa61755SAndy Ye SharedMem0.flags = 0; 18554aa61755SAndy Ye 18564aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 18574aa61755SAndy Ye 18584aa61755SAndy Ye memcpy(SharedMem0.buffer, operation_start, SharedMem0.size); 18594aa61755SAndy Ye 18604aa61755SAndy Ye TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 18614aa61755SAndy Ye TeecOperation.params[0].tmpref.size = SharedMem0.size; 18624aa61755SAndy Ye 18634aa61755SAndy Ye TEEC_SharedMemory SharedMem1 = {0}; 18644aa61755SAndy Ye 18654aa61755SAndy Ye SharedMem1.size = *out_len; 18664aa61755SAndy Ye SharedMem1.flags = 0; 18674aa61755SAndy Ye 18684aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 18694aa61755SAndy Ye 18704aa61755SAndy Ye TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 18714aa61755SAndy Ye TeecOperation.params[1].tmpref.size = SharedMem1.size; 18724aa61755SAndy Ye 18734aa61755SAndy Ye TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, 18744aa61755SAndy Ye TEEC_MEMREF_TEMP_INOUT, 18754aa61755SAndy Ye TEEC_NONE, 18764aa61755SAndy Ye TEEC_NONE); 18774aa61755SAndy Ye 18784aa61755SAndy Ye TeecResult = TEEC_InvokeCommand(&TeecSession, 18794aa61755SAndy Ye 145, 18804aa61755SAndy Ye &TeecOperation, 18814aa61755SAndy Ye &ErrorOrigin); 18824aa61755SAndy Ye 18834aa61755SAndy Ye *out_len = TeecOperation.params[1].tmpref.size; 18844aa61755SAndy Ye memcpy(out, SharedMem1.buffer, SharedMem1.size); 18854aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem0); 18864aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem1); 18874aa61755SAndy Ye 18884aa61755SAndy Ye return TeecResult; 18894aa61755SAndy Ye } 18904aa61755SAndy Ye 18914aa61755SAndy Ye uint32_t trusty_attest_set_ca(uint8_t *ca_response, uint32_t *ca_response_size) 18924aa61755SAndy Ye { 18934aa61755SAndy Ye TEEC_Result TeecResult; 18944aa61755SAndy Ye TEEC_Context TeecContext; 18954aa61755SAndy Ye TEEC_Session TeecSession; 18964aa61755SAndy Ye uint32_t ErrorOrigin; 18974aa61755SAndy Ye TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6, 18984aa61755SAndy Ye { 0xa8, 0x69, 0x9c, 0xe6, 18994aa61755SAndy Ye 0x88, 0x6c, 0x5d, 0x5d 19004aa61755SAndy Ye } 19014aa61755SAndy Ye }; 19024aa61755SAndy Ye TEEC_UUID *TeecUuid = &tempuuid; 19034aa61755SAndy Ye TEEC_Operation TeecOperation = {0}; 19043251364cSHisping Lin struct blk_desc *dev_desc; 19053251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 19066651d4c0SJason Zhu if (!dev_desc) { 19076651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 19086651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 19096651d4c0SJason Zhu } 19104aa61755SAndy Ye 19114aa61755SAndy Ye TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 19124aa61755SAndy Ye 19133251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 19143251364cSHisping Lin TEEC_NONE, 19153251364cSHisping Lin TEEC_NONE, 19163251364cSHisping Lin TEEC_NONE); 19173251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 19183251364cSHisping Lin TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0; 19193251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 19203251364cSHisping Lin TeecOperation.params[0].value.a = 0; 19213251364cSHisping Lin #endif 19223251364cSHisping Lin 19234aa61755SAndy Ye TeecResult = TEEC_OpenSession(&TeecContext, 19244aa61755SAndy Ye &TeecSession, 19254aa61755SAndy Ye TeecUuid, 19264aa61755SAndy Ye TEEC_LOGIN_PUBLIC, 19274aa61755SAndy Ye NULL, 19283251364cSHisping Lin &TeecOperation, 19294aa61755SAndy Ye &ErrorOrigin); 19304aa61755SAndy Ye 19314aa61755SAndy Ye TEEC_SharedMemory SharedMem0 = {0}; 19324aa61755SAndy Ye 19334aa61755SAndy Ye SharedMem0.size = *ca_response_size; 19344aa61755SAndy Ye SharedMem0.flags = 0; 19354aa61755SAndy Ye 19364aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 19374aa61755SAndy Ye 19384aa61755SAndy Ye memcpy(SharedMem0.buffer, ca_response, SharedMem0.size); 19394aa61755SAndy Ye 19404aa61755SAndy Ye TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 19414aa61755SAndy Ye TeecOperation.params[0].tmpref.size = SharedMem0.size; 19424aa61755SAndy Ye 19434aa61755SAndy Ye TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, 19444aa61755SAndy Ye TEEC_NONE, 19454aa61755SAndy Ye TEEC_NONE, 19464aa61755SAndy Ye TEEC_NONE); 19474aa61755SAndy Ye 19484aa61755SAndy Ye TeecResult = TEEC_InvokeCommand(&TeecSession, 19494aa61755SAndy Ye 146, 19504aa61755SAndy Ye &TeecOperation, 19514aa61755SAndy Ye &ErrorOrigin); 19524aa61755SAndy Ye 19534aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem0); 19544aa61755SAndy Ye 19554aa61755SAndy Ye TEEC_CloseSession(&TeecSession); 19564aa61755SAndy Ye TeecResult = TEEC_FinalizeContext(&TeecContext); 19574aa61755SAndy Ye 19584aa61755SAndy Ye return TeecResult; 19594aa61755SAndy Ye } 196078ef5fbdSqiujian 196178ef5fbdSqiujian TEEC_Result trusty_write_oem_unlock(uint8_t unlock) 196278ef5fbdSqiujian { 196378ef5fbdSqiujian char *file = "oem.unlock"; 196478ef5fbdSqiujian TEEC_Result ret; 196578ef5fbdSqiujian 196678ef5fbdSqiujian ret = write_to_keymaster((uint8_t *)file, strlen(file), 196778ef5fbdSqiujian (uint8_t *)&unlock, 1); 196878ef5fbdSqiujian return ret; 196978ef5fbdSqiujian } 197078ef5fbdSqiujian 197178ef5fbdSqiujian TEEC_Result trusty_read_oem_unlock(uint8_t *unlock) 197278ef5fbdSqiujian { 197378ef5fbdSqiujian char *file = "oem.unlock"; 197478ef5fbdSqiujian TEEC_Result ret; 197578ef5fbdSqiujian 197678ef5fbdSqiujian ret = read_from_keymaster((uint8_t *)file, strlen(file), 197778ef5fbdSqiujian unlock, 1); 197878ef5fbdSqiujian 197978ef5fbdSqiujian if (ret == TEE_ERROR_ITEM_NOT_FOUND) { 198078ef5fbdSqiujian debug("init oem unlock status 0"); 198178ef5fbdSqiujian ret = trusty_write_oem_unlock(0); 198278ef5fbdSqiujian } 198378ef5fbdSqiujian 198478ef5fbdSqiujian return ret; 198578ef5fbdSqiujian } 1986