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> 14*1e8c0e44STony Xu #include <attestation_key.h> 15a7df4868Stony.xu 16a7df4868Stony.xu #define BOOT_FROM_EMMC (1 << 1) 17f18b06fbSTony Xu #define WIDEVINE_TAG "KBOX" 18f18b06fbSTony Xu #define ATTESTATION_TAG "ATTE" 19a7df4868Stony.xu 20a7df4868Stony.xu uint32_t rk_send_keybox_to_ta(uint8_t *filename, uint32_t filename_size, 21a7df4868Stony.xu TEEC_UUID uuid, 22a7df4868Stony.xu uint8_t *key, uint32_t key_size, 23a7df4868Stony.xu uint8_t *data, uint32_t data_size) 24a7df4868Stony.xu { 25a7df4868Stony.xu TEEC_Result TeecResult; 26a7df4868Stony.xu TEEC_Context TeecContext; 27a7df4868Stony.xu TEEC_Session TeecSession; 28a7df4868Stony.xu uint32_t ErrorOrigin; 29a7df4868Stony.xu 30a7df4868Stony.xu TEEC_UUID *TeecUuid = &uuid; 31a7df4868Stony.xu TEEC_Operation TeecOperation = {0}; 32a7df4868Stony.xu 33a7df4868Stony.xu struct blk_desc *dev_desc; 34a7df4868Stony.xu 35a7df4868Stony.xu dev_desc = rockchip_get_bootdev(); 36a7df4868Stony.xu if (!dev_desc) { 37a7df4868Stony.xu printf("%s: dev_desc is NULL!\n", __func__); 38a7df4868Stony.xu return -TEEC_ERROR_GENERIC; 39a7df4868Stony.xu } 40a7df4868Stony.xu 41a7df4868Stony.xu OpteeClientApiLibInitialize(); 42a7df4868Stony.xu TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 43a7df4868Stony.xu TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 44a7df4868Stony.xu TEEC_NONE, 45a7df4868Stony.xu TEEC_NONE, 46a7df4868Stony.xu TEEC_NONE); 47a7df4868Stony.xu 48a7df4868Stony.xu /* 0 nand or emmc "security" partition , 1 rpmb */ 49a7df4868Stony.xu TeecOperation.params[0].value.a = 50a7df4868Stony.xu (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0; 51a7df4868Stony.xu #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 52a7df4868Stony.xu TeecOperation.params[0].value.a = 0; 53a7df4868Stony.xu #endif 54a7df4868Stony.xu TeecResult = TEEC_OpenSession(&TeecContext, 55a7df4868Stony.xu &TeecSession, 56a7df4868Stony.xu TeecUuid, 57a7df4868Stony.xu TEEC_LOGIN_PUBLIC, 58a7df4868Stony.xu NULL, 59a7df4868Stony.xu &TeecOperation, 60a7df4868Stony.xu &ErrorOrigin); 61a7df4868Stony.xu 62a7df4868Stony.xu TEEC_SharedMemory SharedMem0 = {0}; 63a7df4868Stony.xu 64a7df4868Stony.xu SharedMem0.size = filename_size; 65a7df4868Stony.xu SharedMem0.flags = 0; 66a7df4868Stony.xu 67a7df4868Stony.xu TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 68a7df4868Stony.xu 69a7df4868Stony.xu memcpy(SharedMem0.buffer, filename, SharedMem0.size); 70a7df4868Stony.xu 71a7df4868Stony.xu TEEC_SharedMemory SharedMem1 = {0}; 72a7df4868Stony.xu 73a7df4868Stony.xu SharedMem1.size = key_size; 74a7df4868Stony.xu SharedMem1.flags = 0; 75a7df4868Stony.xu 76a7df4868Stony.xu TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 77a7df4868Stony.xu 78a7df4868Stony.xu memcpy(SharedMem1.buffer, key, SharedMem1.size); 79a7df4868Stony.xu 80a7df4868Stony.xu TEEC_SharedMemory SharedMem2 = {0}; 81a7df4868Stony.xu 82a7df4868Stony.xu SharedMem2.size = data_size; 83a7df4868Stony.xu SharedMem2.flags = 0; 84a7df4868Stony.xu 85a7df4868Stony.xu TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem2); 86a7df4868Stony.xu 87a7df4868Stony.xu memcpy(SharedMem2.buffer, data, SharedMem2.size); 88a7df4868Stony.xu 89a7df4868Stony.xu TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 90a7df4868Stony.xu TeecOperation.params[0].tmpref.size = SharedMem0.size; 91a7df4868Stony.xu 92a7df4868Stony.xu TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 93a7df4868Stony.xu TeecOperation.params[1].tmpref.size = SharedMem1.size; 94a7df4868Stony.xu 95a7df4868Stony.xu TeecOperation.params[2].tmpref.buffer = SharedMem2.buffer; 96a7df4868Stony.xu TeecOperation.params[2].tmpref.size = SharedMem2.size; 97a7df4868Stony.xu 98a7df4868Stony.xu TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 99a7df4868Stony.xu TEEC_MEMREF_TEMP_INPUT, 100a7df4868Stony.xu TEEC_MEMREF_TEMP_INOUT, 101a7df4868Stony.xu TEEC_NONE); 102a7df4868Stony.xu 103a7df4868Stony.xu printf("check: does keybox exised in secure storage...\n"); 104a7df4868Stony.xu TeecResult = TEEC_InvokeCommand(&TeecSession, 105a7df4868Stony.xu 122, 106a7df4868Stony.xu &TeecOperation, 107a7df4868Stony.xu &ErrorOrigin); 108a7df4868Stony.xu if (TeecResult != TEEC_SUCCESS) { 109a7df4868Stony.xu printf("no keybox in secure storage, write keybox to secure storage\n"); 110a7df4868Stony.xu TeecResult = TEEC_InvokeCommand(&TeecSession, 111a7df4868Stony.xu 121, 112a7df4868Stony.xu &TeecOperation, 113a7df4868Stony.xu &ErrorOrigin); 114a7df4868Stony.xu if (TeecResult != TEEC_SUCCESS) { 115a7df4868Stony.xu printf("send data to TA failed with code 0x%x\n", TeecResult); 116a7df4868Stony.xu } else { 117a7df4868Stony.xu printf("send data to TA success with code 0x%x\n", TeecResult); 118a7df4868Stony.xu } 119a7df4868Stony.xu } 120a7df4868Stony.xu TEEC_ReleaseSharedMemory(&SharedMem0); 121a7df4868Stony.xu TEEC_ReleaseSharedMemory(&SharedMem1); 122a7df4868Stony.xu TEEC_ReleaseSharedMemory(&SharedMem2); 123a7df4868Stony.xu 124a7df4868Stony.xu TEEC_CloseSession(&TeecSession); 125a7df4868Stony.xu TEEC_FinalizeContext(&TeecContext); 126a7df4868Stony.xu 127a7df4868Stony.xu return TeecResult; 128a7df4868Stony.xu } 129a7df4868Stony.xu 130a7df4868Stony.xu int write_keybox_to_secure_storage(uint8_t *uboot_data, uint32_t len) 131a7df4868Stony.xu { 132a7df4868Stony.xu uint32_t key_size; 133a7df4868Stony.xu uint32_t data_size; 134f18b06fbSTony Xu uint32_t object_id; 135f18b06fbSTony Xu int rc = 0; 136a7df4868Stony.xu 137f18b06fbSTony Xu if (memcmp(uboot_data, WIDEVINE_TAG, 4) == 0) { 138f18b06fbSTony Xu /* widevine keybox */ 139*1e8c0e44STony Xu TEEC_Result ret; 140*1e8c0e44STony Xu 141a7df4868Stony.xu TEEC_UUID widevine_uuid = { 0xc11fe8ac, 0xb997, 0x48cf, 142a7df4868Stony.xu { 0xa2, 0x8d, 0xe2, 0xa5, 0x5e, 0x52, 0x40, 0xef} }; 143f18b06fbSTony Xu object_id = 101; 144f18b06fbSTony Xu 145f18b06fbSTony Xu key_size = *(uboot_data + 4); 146f18b06fbSTony Xu data_size = *(uboot_data + 8); 147f18b06fbSTony Xu 148f18b06fbSTony Xu ret = rk_send_keybox_to_ta((uint8_t *)&object_id, 149f18b06fbSTony Xu sizeof(uint32_t), 150f18b06fbSTony Xu widevine_uuid, 151f18b06fbSTony Xu uboot_data + 12, 152f18b06fbSTony Xu key_size, 153f18b06fbSTony Xu uboot_data + 12 + key_size, 154f18b06fbSTony Xu data_size); 155f18b06fbSTony Xu if (ret == TEEC_SUCCESS) { 156f18b06fbSTony Xu rc = 0; 157f18b06fbSTony Xu printf("write widevine keybox to secure storage success\n"); 158a7df4868Stony.xu } else { 159f18b06fbSTony Xu rc = -EIO; 160f18b06fbSTony Xu printf("write widevine keybox to secure storage fail\n"); 161f18b06fbSTony Xu } 162f18b06fbSTony Xu } else if (memcmp(uboot_data, ATTESTATION_TAG, 4) == 0) { 163f18b06fbSTony Xu /* attestation key */ 164*1e8c0e44STony Xu atap_result ret; 165f18b06fbSTony Xu 166*1e8c0e44STony Xu ret = write_attestation_key_to_secure_storage(uboot_data, len); 167*1e8c0e44STony Xu if (ret == ATAP_RESULT_OK) { 168*1e8c0e44STony Xu rc = 0; 169*1e8c0e44STony Xu printf("write attestation key to secure storage success\n"); 170*1e8c0e44STony Xu } else { 171*1e8c0e44STony Xu rc = -EIO; 172*1e8c0e44STony Xu printf("write attestation key to secure storage fail\n"); 173a7df4868Stony.xu } 174*1e8c0e44STony Xu } 175f18b06fbSTony Xu return rc; 176a7df4868Stony.xu } 177ae8ec5e1SHisping Lin 178ae8ec5e1SHisping Lin void test_optee(void) 179ae8ec5e1SHisping Lin { 180ae8ec5e1SHisping Lin TEEC_Result TeecResult; 181ae8ec5e1SHisping Lin TEEC_Context TeecContext; 182ae8ec5e1SHisping Lin TEEC_Session TeecSession; 183ae8ec5e1SHisping Lin uint32_t ErrorOrigin; 184a7df4868Stony.xu TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, \ 185ae8ec5e1SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 186ae8ec5e1SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 187ae8ec5e1SHisping Lin TEEC_Operation TeecOperation = {0}; 1883251364cSHisping Lin struct blk_desc *dev_desc; 1893251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 1906651d4c0SJason Zhu if (!dev_desc) { 1916651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 1926651d4c0SJason Zhu return; 1936651d4c0SJason Zhu } 194ae8ec5e1SHisping Lin 195ae8ec5e1SHisping Lin debug("testmm start\n"); 196ae8ec5e1SHisping Lin OpteeClientApiLibInitialize(); 197ae8ec5e1SHisping Lin 198ae8ec5e1SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 199ae8ec5e1SHisping Lin 2003251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 2013251364cSHisping Lin TEEC_NONE, 2023251364cSHisping Lin TEEC_NONE, 2033251364cSHisping Lin TEEC_NONE); 2043251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 2053251364cSHisping Lin TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0; 2063251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 2073251364cSHisping Lin TeecOperation.params[0].value.a = 0; 2083251364cSHisping Lin #endif 2093251364cSHisping Lin 210ae8ec5e1SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 211ae8ec5e1SHisping Lin &TeecSession, 212ae8ec5e1SHisping Lin TeecUuid, 213ae8ec5e1SHisping Lin TEEC_LOGIN_PUBLIC, 214ae8ec5e1SHisping Lin NULL, 2153251364cSHisping Lin &TeecOperation, 216ae8ec5e1SHisping Lin &ErrorOrigin); 217ae8ec5e1SHisping Lin 218ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 219ae8ec5e1SHisping Lin 220ae8ec5e1SHisping Lin SharedMem0.size = sizeof("filename_test"); 221ae8ec5e1SHisping Lin SharedMem0.flags = 0; 222ae8ec5e1SHisping Lin 223ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 224ae8ec5e1SHisping Lin 225ae8ec5e1SHisping Lin memcpy(SharedMem0.buffer, "filename_test", SharedMem0.size); 226ae8ec5e1SHisping Lin 227ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem1 = {0}; 228ae8ec5e1SHisping Lin 229ae8ec5e1SHisping Lin SharedMem1.size = 32; 230ae8ec5e1SHisping Lin SharedMem1.flags = 0; 231ae8ec5e1SHisping Lin 232ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 233ae8ec5e1SHisping Lin 234ae8ec5e1SHisping Lin memset(SharedMem1.buffer, 'a', SharedMem1.size); 235ae8ec5e1SHisping Lin 236ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 237ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 238ae8ec5e1SHisping Lin 239ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 240ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem1.size; 241ae8ec5e1SHisping Lin 242ae8ec5e1SHisping Lin 243ae8ec5e1SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 244ae8ec5e1SHisping Lin TEEC_MEMREF_TEMP_INOUT, 245ae8ec5e1SHisping Lin TEEC_NONE, 246ae8ec5e1SHisping Lin TEEC_NONE); 247ae8ec5e1SHisping Lin 248ae8ec5e1SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 249ae8ec5e1SHisping Lin 1, 250ae8ec5e1SHisping Lin &TeecOperation, 251ae8ec5e1SHisping Lin &ErrorOrigin); 252ae8ec5e1SHisping Lin 253ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 254ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem1); 255ae8ec5e1SHisping Lin 256ae8ec5e1SHisping Lin TEEC_CloseSession(&TeecSession); 257ae8ec5e1SHisping Lin 25846b2a054SHisping Lin TEEC_FinalizeContext(&TeecContext); 259ae8ec5e1SHisping Lin 260ae8ec5e1SHisping Lin debug("testmm end\n"); 261ae8ec5e1SHisping Lin debug("TeecResult %x\n", TeecResult); 262ae8ec5e1SHisping Lin } 263ae8ec5e1SHisping Lin 264ae8ec5e1SHisping Lin static uint8_t b2hs_add_base(uint8_t in) 265ae8ec5e1SHisping Lin { 266ae8ec5e1SHisping Lin if (in > 9) 267ae8ec5e1SHisping Lin return in + 55; 268ae8ec5e1SHisping Lin else 269ae8ec5e1SHisping Lin return in + 48; 270ae8ec5e1SHisping Lin } 271ae8ec5e1SHisping Lin 272ae8ec5e1SHisping Lin uint32_t b2hs(uint8_t *b, uint8_t *hs, uint32_t blen, uint32_t hslen) 273ae8ec5e1SHisping Lin { 274ae8ec5e1SHisping Lin uint32_t i = 0; 275ae8ec5e1SHisping Lin 276ae8ec5e1SHisping Lin if (blen * 2 + 1 > hslen) 277ae8ec5e1SHisping Lin return 0; 278ae8ec5e1SHisping Lin 279ae8ec5e1SHisping Lin for (; i < blen; i++) { 280ae8ec5e1SHisping Lin hs[i * 2 + 1] = b2hs_add_base(b[i] & 0xf); 281ae8ec5e1SHisping Lin hs[i * 2] = b2hs_add_base(b[i] >> 4); 282ae8ec5e1SHisping Lin } 283ae8ec5e1SHisping Lin hs[blen * 2] = 0; 284ae8ec5e1SHisping Lin 285ae8ec5e1SHisping Lin return blen * 2; 286ae8ec5e1SHisping Lin } 287ae8ec5e1SHisping Lin 288ae8ec5e1SHisping Lin 289ae8ec5e1SHisping Lin uint32_t trusty_read_rollback_index(uint32_t slot, uint64_t *value) 290ae8ec5e1SHisping Lin { 291ae8ec5e1SHisping Lin TEEC_Result TeecResult; 292ae8ec5e1SHisping Lin TEEC_Context TeecContext; 293ae8ec5e1SHisping Lin TEEC_Session TeecSession; 294ae8ec5e1SHisping Lin uint32_t ErrorOrigin; 295ae8ec5e1SHisping Lin TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 296ae8ec5e1SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 297ae8ec5e1SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 298ae8ec5e1SHisping Lin TEEC_Operation TeecOperation = {0}; 299ae8ec5e1SHisping Lin uint8_t hs[9]; 300ae8ec5e1SHisping Lin 3013251364cSHisping Lin struct blk_desc *dev_desc; 3023251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 3036651d4c0SJason Zhu if (!dev_desc) { 3046651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 3056651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 3066651d4c0SJason Zhu } 3073251364cSHisping Lin 308ae8ec5e1SHisping Lin b2hs((uint8_t *)&slot, hs, 4, 9); 309ae8ec5e1SHisping Lin debug("testmm start\n"); 310ae8ec5e1SHisping Lin OpteeClientApiLibInitialize(); 311ae8ec5e1SHisping Lin 312ae8ec5e1SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 313ae8ec5e1SHisping Lin 3143251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 3153251364cSHisping Lin TEEC_NONE, 3163251364cSHisping Lin TEEC_NONE, 3173251364cSHisping Lin TEEC_NONE); 3183251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 3193251364cSHisping Lin TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0; 3203251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 3213251364cSHisping Lin TeecOperation.params[0].value.a = 0; 3223251364cSHisping Lin #endif 3233251364cSHisping Lin 324ae8ec5e1SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 325ae8ec5e1SHisping Lin &TeecSession, 326ae8ec5e1SHisping Lin TeecUuid, 327ae8ec5e1SHisping Lin TEEC_LOGIN_PUBLIC, 328ae8ec5e1SHisping Lin NULL, 3293251364cSHisping Lin &TeecOperation, 330f303baf0SHisping Lin 331ae8ec5e1SHisping Lin &ErrorOrigin); 332ae8ec5e1SHisping Lin 333ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 334ae8ec5e1SHisping Lin 335ae8ec5e1SHisping Lin SharedMem0.size = 8; 336ae8ec5e1SHisping Lin SharedMem0.flags = 0; 337ae8ec5e1SHisping Lin 338ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 339ae8ec5e1SHisping Lin 340ae8ec5e1SHisping Lin memcpy(SharedMem0.buffer, hs, SharedMem0.size); 341ae8ec5e1SHisping Lin 342ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem1 = {0}; 343ae8ec5e1SHisping Lin 344ae8ec5e1SHisping Lin SharedMem1.size = 8; 345ae8ec5e1SHisping Lin SharedMem1.flags = 0; 346ae8ec5e1SHisping Lin 347ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 348ae8ec5e1SHisping Lin 349ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 350ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 351ae8ec5e1SHisping Lin 352ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 353ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem1.size; 354ae8ec5e1SHisping Lin 355ae8ec5e1SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 356ae8ec5e1SHisping Lin TEEC_MEMREF_TEMP_INOUT, 357ae8ec5e1SHisping Lin TEEC_NONE, 358ae8ec5e1SHisping Lin TEEC_NONE); 359ae8ec5e1SHisping Lin 360ae8ec5e1SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 361ae8ec5e1SHisping Lin 0, 362ae8ec5e1SHisping Lin &TeecOperation, 363ae8ec5e1SHisping Lin &ErrorOrigin); 36446b2a054SHisping Lin if (TeecResult == TEEC_SUCCESS) 365ae8ec5e1SHisping Lin memcpy((char *)value, SharedMem1.buffer, SharedMem1.size); 366ae8ec5e1SHisping Lin 367ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 368ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem1); 369ae8ec5e1SHisping Lin 370ae8ec5e1SHisping Lin TEEC_CloseSession(&TeecSession); 371ae8ec5e1SHisping Lin 37246b2a054SHisping Lin TEEC_FinalizeContext(&TeecContext); 373ae8ec5e1SHisping Lin 374ae8ec5e1SHisping Lin debug("testmm end\n"); 375ae8ec5e1SHisping Lin return TeecResult; 376ae8ec5e1SHisping Lin } 377ae8ec5e1SHisping Lin 378ae8ec5e1SHisping Lin uint32_t trusty_write_rollback_index(uint32_t slot, uint64_t value) 379ae8ec5e1SHisping Lin { 380ae8ec5e1SHisping Lin TEEC_Result TeecResult; 381ae8ec5e1SHisping Lin TEEC_Context TeecContext; 382ae8ec5e1SHisping Lin TEEC_Session TeecSession; 383ae8ec5e1SHisping Lin uint32_t ErrorOrigin; 384ae8ec5e1SHisping Lin TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 385ae8ec5e1SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 386ae8ec5e1SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 387ae8ec5e1SHisping Lin TEEC_Operation TeecOperation = {0}; 388ae8ec5e1SHisping Lin uint8_t hs[9]; 3893251364cSHisping Lin struct blk_desc *dev_desc; 3903251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 3916651d4c0SJason Zhu if (!dev_desc) { 3926651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 3936651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 3946651d4c0SJason Zhu } 3953251364cSHisping Lin 396ae8ec5e1SHisping Lin b2hs((uint8_t *)&slot, hs, 4, 9); 397ae8ec5e1SHisping Lin OpteeClientApiLibInitialize(); 398ae8ec5e1SHisping Lin 399ae8ec5e1SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 400ae8ec5e1SHisping Lin 4013251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 4023251364cSHisping Lin TEEC_NONE, 4033251364cSHisping Lin TEEC_NONE, 4043251364cSHisping Lin TEEC_NONE); 4053251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 4063251364cSHisping Lin TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0; 4073251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 4083251364cSHisping Lin TeecOperation.params[0].value.a = 0; 4093251364cSHisping Lin #endif 4103251364cSHisping Lin 411ae8ec5e1SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 412ae8ec5e1SHisping Lin &TeecSession, 413ae8ec5e1SHisping Lin TeecUuid, 414ae8ec5e1SHisping Lin TEEC_LOGIN_PUBLIC, 415ae8ec5e1SHisping Lin NULL, 4163251364cSHisping Lin &TeecOperation, 417ae8ec5e1SHisping Lin &ErrorOrigin); 418ae8ec5e1SHisping Lin 419ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 420ae8ec5e1SHisping Lin 421ae8ec5e1SHisping Lin SharedMem0.size = 8; 422ae8ec5e1SHisping Lin SharedMem0.flags = 0; 423ae8ec5e1SHisping Lin 424ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 425ae8ec5e1SHisping Lin 426ae8ec5e1SHisping Lin memcpy(SharedMem0.buffer, hs, SharedMem0.size); 427ae8ec5e1SHisping Lin 428ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem1 = {0}; 429ae8ec5e1SHisping Lin 430ae8ec5e1SHisping Lin SharedMem1.size = 8; 431ae8ec5e1SHisping Lin SharedMem1.flags = 0; 432ae8ec5e1SHisping Lin 433ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 434ae8ec5e1SHisping Lin 435ae8ec5e1SHisping Lin memcpy(SharedMem1.buffer, (char *)&value, SharedMem1.size); 436ae8ec5e1SHisping Lin 437ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 438ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 439ae8ec5e1SHisping Lin 440ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 441ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem1.size; 442ae8ec5e1SHisping Lin 443ae8ec5e1SHisping Lin 444ae8ec5e1SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 445ae8ec5e1SHisping Lin TEEC_MEMREF_TEMP_INOUT, 446ae8ec5e1SHisping Lin TEEC_NONE, 447ae8ec5e1SHisping Lin TEEC_NONE); 448ae8ec5e1SHisping Lin 449ae8ec5e1SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 450ae8ec5e1SHisping Lin 1, 451ae8ec5e1SHisping Lin &TeecOperation, 452ae8ec5e1SHisping Lin &ErrorOrigin); 453ae8ec5e1SHisping Lin 454ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 455ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem1); 456ae8ec5e1SHisping Lin 457ae8ec5e1SHisping Lin TEEC_CloseSession(&TeecSession); 458ae8ec5e1SHisping Lin 45946b2a054SHisping Lin TEEC_FinalizeContext(&TeecContext); 460ae8ec5e1SHisping Lin 461ae8ec5e1SHisping Lin debug("testmm end\n"); 462ae8ec5e1SHisping Lin 463ae8ec5e1SHisping Lin return TeecResult; 464ae8ec5e1SHisping Lin } 465ae8ec5e1SHisping Lin 466ae8ec5e1SHisping Lin uint32_t trusty_read_permanent_attributes(uint8_t *attributes, uint32_t size) 467ae8ec5e1SHisping Lin { 468ae8ec5e1SHisping Lin TEEC_Result TeecResult; 469ae8ec5e1SHisping Lin TEEC_Context TeecContext; 470ae8ec5e1SHisping Lin TEEC_Session TeecSession; 471ae8ec5e1SHisping Lin uint32_t ErrorOrigin; 47299830019SHisping Lin TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 47399830019SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 474ae8ec5e1SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 475ae8ec5e1SHisping Lin TEEC_Operation TeecOperation = {0}; 4763251364cSHisping Lin struct blk_desc *dev_desc; 4773251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 4786651d4c0SJason Zhu if (!dev_desc) { 4796651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 4806651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 4816651d4c0SJason Zhu } 482ae8ec5e1SHisping Lin 483ae8ec5e1SHisping Lin debug("testmm start\n"); 484ae8ec5e1SHisping Lin OpteeClientApiLibInitialize(); 485ae8ec5e1SHisping Lin 486ae8ec5e1SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 487ae8ec5e1SHisping Lin 4883251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 4893251364cSHisping Lin TEEC_NONE, 4903251364cSHisping Lin TEEC_NONE, 4913251364cSHisping Lin TEEC_NONE); 4923251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 4933251364cSHisping Lin TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0; 4943251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 4953251364cSHisping Lin TeecOperation.params[0].value.a = 0; 4963251364cSHisping Lin #endif 4973251364cSHisping Lin 498ae8ec5e1SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 499ae8ec5e1SHisping Lin &TeecSession, 500ae8ec5e1SHisping Lin TeecUuid, 501ae8ec5e1SHisping Lin TEEC_LOGIN_PUBLIC, 502ae8ec5e1SHisping Lin NULL, 5033251364cSHisping Lin &TeecOperation, 504ae8ec5e1SHisping Lin &ErrorOrigin); 505ae8ec5e1SHisping Lin 506ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 507ae8ec5e1SHisping Lin 508ae8ec5e1SHisping Lin SharedMem0.size = sizeof("attributes"); 509ae8ec5e1SHisping Lin SharedMem0.flags = 0; 510ae8ec5e1SHisping Lin 511ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 512ae8ec5e1SHisping Lin 513ae8ec5e1SHisping Lin memcpy(SharedMem0.buffer, "attributes", SharedMem0.size); 514ae8ec5e1SHisping Lin 515ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem1 = {0}; 516ae8ec5e1SHisping Lin 517ae8ec5e1SHisping Lin SharedMem1.size = size; 518ae8ec5e1SHisping Lin SharedMem1.flags = 0; 519ae8ec5e1SHisping Lin 520ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 521ae8ec5e1SHisping Lin 522ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 523ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 524ae8ec5e1SHisping Lin 525ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 526ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem1.size; 527ae8ec5e1SHisping Lin 528ae8ec5e1SHisping Lin 529ae8ec5e1SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 530ae8ec5e1SHisping Lin TEEC_MEMREF_TEMP_INOUT, 531ae8ec5e1SHisping Lin TEEC_NONE, 532ae8ec5e1SHisping Lin TEEC_NONE); 533ae8ec5e1SHisping Lin 534ae8ec5e1SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 53599830019SHisping Lin 0, 536ae8ec5e1SHisping Lin &TeecOperation, 537ae8ec5e1SHisping Lin &ErrorOrigin); 53846b2a054SHisping Lin if (TeecResult == TEEC_SUCCESS) 539ae8ec5e1SHisping Lin memcpy(attributes, SharedMem1.buffer, SharedMem1.size); 540ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 541ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem1); 542ae8ec5e1SHisping Lin TEEC_CloseSession(&TeecSession); 54346b2a054SHisping Lin TEEC_FinalizeContext(&TeecContext); 544ae8ec5e1SHisping Lin debug("testmm end\n"); 545ae8ec5e1SHisping Lin 546ae8ec5e1SHisping Lin return TeecResult; 547ae8ec5e1SHisping Lin } 548ae8ec5e1SHisping Lin 549ae8ec5e1SHisping Lin uint32_t trusty_write_permanent_attributes(uint8_t *attributes, uint32_t size) 550ae8ec5e1SHisping Lin { 551ae8ec5e1SHisping Lin TEEC_Result TeecResult; 552ae8ec5e1SHisping Lin TEEC_Context TeecContext; 553ae8ec5e1SHisping Lin TEEC_Session TeecSession; 554ae8ec5e1SHisping Lin uint32_t ErrorOrigin; 55599830019SHisping Lin TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 55699830019SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 557ae8ec5e1SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 558ae8ec5e1SHisping Lin TEEC_Operation TeecOperation = {0}; 5593251364cSHisping Lin struct blk_desc *dev_desc; 5603251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 5616651d4c0SJason Zhu if (!dev_desc) { 5626651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 5636651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 5646651d4c0SJason Zhu } 565ae8ec5e1SHisping Lin 566ae8ec5e1SHisping Lin debug("testmm start\n"); 567ae8ec5e1SHisping Lin OpteeClientApiLibInitialize(); 568ae8ec5e1SHisping Lin 569ae8ec5e1SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 570ae8ec5e1SHisping Lin 5713251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 5723251364cSHisping Lin TEEC_NONE, 5733251364cSHisping Lin TEEC_NONE, 5743251364cSHisping Lin TEEC_NONE); 5753251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 5763251364cSHisping Lin TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0; 5773251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 5783251364cSHisping Lin TeecOperation.params[0].value.a = 0; 5793251364cSHisping Lin #endif 5803251364cSHisping Lin 581ae8ec5e1SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 582ae8ec5e1SHisping Lin &TeecSession, 583ae8ec5e1SHisping Lin TeecUuid, 584ae8ec5e1SHisping Lin TEEC_LOGIN_PUBLIC, 585ae8ec5e1SHisping Lin NULL, 5863251364cSHisping Lin &TeecOperation, 587ae8ec5e1SHisping Lin &ErrorOrigin); 588ae8ec5e1SHisping Lin 589ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 590ae8ec5e1SHisping Lin 591ae8ec5e1SHisping Lin SharedMem0.size = sizeof("attributes"); 592ae8ec5e1SHisping Lin SharedMem0.flags = 0; 593ae8ec5e1SHisping Lin 594ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 595ae8ec5e1SHisping Lin 596ae8ec5e1SHisping Lin memcpy(SharedMem0.buffer, "attributes", SharedMem0.size); 597ae8ec5e1SHisping Lin 598ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem1 = {0}; 599ae8ec5e1SHisping Lin 600ae8ec5e1SHisping Lin SharedMem1.size = size; 601ae8ec5e1SHisping Lin SharedMem1.flags = 0; 602ae8ec5e1SHisping Lin 603ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 604ae8ec5e1SHisping Lin 605ae8ec5e1SHisping Lin memcpy(SharedMem1.buffer, attributes, SharedMem1.size); 606ae8ec5e1SHisping Lin 607ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 608ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 609ae8ec5e1SHisping Lin 610ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 611ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem1.size; 612ae8ec5e1SHisping Lin 613ae8ec5e1SHisping Lin 614ae8ec5e1SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 615ae8ec5e1SHisping Lin TEEC_MEMREF_TEMP_INOUT, 616ae8ec5e1SHisping Lin TEEC_NONE, 617ae8ec5e1SHisping Lin TEEC_NONE); 618ae8ec5e1SHisping Lin 619ae8ec5e1SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 62099830019SHisping Lin 1, 621ae8ec5e1SHisping Lin &TeecOperation, 622ae8ec5e1SHisping Lin &ErrorOrigin); 623ae8ec5e1SHisping Lin 624ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 625ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem1); 626ae8ec5e1SHisping Lin TEEC_CloseSession(&TeecSession); 62746b2a054SHisping Lin TEEC_FinalizeContext(&TeecContext); 628ae8ec5e1SHisping Lin debug("testmm end\n"); 629ae8ec5e1SHisping Lin 630ae8ec5e1SHisping Lin return TeecResult; 631ae8ec5e1SHisping Lin } 632ae8ec5e1SHisping Lin 633ae8ec5e1SHisping Lin uint32_t trusty_read_lock_state(uint8_t *lock_state) 634ae8ec5e1SHisping Lin { 635ae8ec5e1SHisping Lin TEEC_Result TeecResult; 636ae8ec5e1SHisping Lin TEEC_Context TeecContext; 637ae8ec5e1SHisping Lin TEEC_Session TeecSession; 638ae8ec5e1SHisping Lin uint32_t ErrorOrigin; 639ae8ec5e1SHisping Lin TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 640ae8ec5e1SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 641ae8ec5e1SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 642ae8ec5e1SHisping Lin TEEC_Operation TeecOperation = {0}; 6433251364cSHisping Lin struct blk_desc *dev_desc; 6443251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 6456651d4c0SJason Zhu if (!dev_desc) { 6466651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 6476651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 6486651d4c0SJason Zhu } 649ae8ec5e1SHisping Lin 650ae8ec5e1SHisping Lin debug("testmm start\n"); 651ae8ec5e1SHisping Lin OpteeClientApiLibInitialize(); 652ae8ec5e1SHisping Lin 653ae8ec5e1SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 654ae8ec5e1SHisping Lin 6553251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 6563251364cSHisping Lin TEEC_NONE, 6573251364cSHisping Lin TEEC_NONE, 6583251364cSHisping Lin TEEC_NONE); 6593251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 6603251364cSHisping Lin TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0; 6613251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 6623251364cSHisping Lin TeecOperation.params[0].value.a = 0; 6633251364cSHisping Lin #endif 664ae8ec5e1SHisping Lin 665ae8ec5e1SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 666ae8ec5e1SHisping Lin &TeecSession, 667ae8ec5e1SHisping Lin TeecUuid, 668ae8ec5e1SHisping Lin TEEC_LOGIN_PUBLIC, 669ae8ec5e1SHisping Lin NULL, 6703251364cSHisping Lin &TeecOperation, 671ae8ec5e1SHisping Lin &ErrorOrigin); 672ae8ec5e1SHisping Lin 673ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 674ae8ec5e1SHisping Lin 675ae8ec5e1SHisping Lin SharedMem0.size = sizeof("lock_state"); 676ae8ec5e1SHisping Lin SharedMem0.flags = 0; 677ae8ec5e1SHisping Lin 678ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 679ae8ec5e1SHisping Lin 680ae8ec5e1SHisping Lin memcpy(SharedMem0.buffer, "lock_state", SharedMem0.size); 681ae8ec5e1SHisping Lin 682ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem1 = {0}; 683ae8ec5e1SHisping Lin 684ae8ec5e1SHisping Lin SharedMem1.size = 1; 685ae8ec5e1SHisping Lin SharedMem1.flags = 0; 686ae8ec5e1SHisping Lin 687ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 688ae8ec5e1SHisping Lin 689ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 690ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 691ae8ec5e1SHisping Lin 692ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 693ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem1.size; 694ae8ec5e1SHisping Lin 695ae8ec5e1SHisping Lin 696ae8ec5e1SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 697ae8ec5e1SHisping Lin TEEC_MEMREF_TEMP_INOUT, 698ae8ec5e1SHisping Lin TEEC_NONE, 699ae8ec5e1SHisping Lin TEEC_NONE); 700ae8ec5e1SHisping Lin 701ae8ec5e1SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 702ae8ec5e1SHisping Lin 0, 703ae8ec5e1SHisping Lin &TeecOperation, 704ae8ec5e1SHisping Lin &ErrorOrigin); 70546b2a054SHisping Lin if (TeecResult == TEEC_SUCCESS) 706ae8ec5e1SHisping Lin memcpy(lock_state, SharedMem1.buffer, SharedMem1.size); 707ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 708ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem1); 709ae8ec5e1SHisping Lin TEEC_CloseSession(&TeecSession); 71046b2a054SHisping Lin TEEC_FinalizeContext(&TeecContext); 711ae8ec5e1SHisping Lin debug("testmm end\n"); 712ae8ec5e1SHisping Lin 713ae8ec5e1SHisping Lin return TeecResult; 714ae8ec5e1SHisping Lin } 715ae8ec5e1SHisping Lin 716ae8ec5e1SHisping Lin uint32_t trusty_write_lock_state(uint8_t lock_state) 717ae8ec5e1SHisping Lin { 718ae8ec5e1SHisping Lin TEEC_Result TeecResult; 719ae8ec5e1SHisping Lin TEEC_Context TeecContext; 720ae8ec5e1SHisping Lin TEEC_Session TeecSession; 721ae8ec5e1SHisping Lin uint32_t ErrorOrigin; 722ae8ec5e1SHisping Lin TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 723ae8ec5e1SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 724ae8ec5e1SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 725ae8ec5e1SHisping Lin TEEC_Operation TeecOperation = {0}; 7263251364cSHisping Lin struct blk_desc *dev_desc; 7273251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 7286651d4c0SJason Zhu if (!dev_desc) { 7296651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 7306651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 7316651d4c0SJason Zhu } 732ae8ec5e1SHisping Lin 733ae8ec5e1SHisping Lin debug("testmm start\n"); 734ae8ec5e1SHisping Lin OpteeClientApiLibInitialize(); 735ae8ec5e1SHisping Lin 736ae8ec5e1SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 737ae8ec5e1SHisping Lin 7383251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 7393251364cSHisping Lin TEEC_NONE, 7403251364cSHisping Lin TEEC_NONE, 7413251364cSHisping Lin TEEC_NONE); 7423251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 7433251364cSHisping Lin TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0; 7443251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 7453251364cSHisping Lin TeecOperation.params[0].value.a = 0; 7463251364cSHisping Lin #endif 7473251364cSHisping Lin 748ae8ec5e1SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 749ae8ec5e1SHisping Lin &TeecSession, 750ae8ec5e1SHisping Lin TeecUuid, 751ae8ec5e1SHisping Lin TEEC_LOGIN_PUBLIC, 752ae8ec5e1SHisping Lin NULL, 7533251364cSHisping Lin &TeecOperation, 754ae8ec5e1SHisping Lin &ErrorOrigin); 755ae8ec5e1SHisping Lin 756ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 757ae8ec5e1SHisping Lin 758ae8ec5e1SHisping Lin SharedMem0.size = sizeof("lock_state"); 759ae8ec5e1SHisping Lin SharedMem0.flags = 0; 760ae8ec5e1SHisping Lin 761ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 762ae8ec5e1SHisping Lin 763ae8ec5e1SHisping Lin memcpy(SharedMem0.buffer, "lock_state", SharedMem0.size); 764ae8ec5e1SHisping Lin 765ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem1 = {0}; 766ae8ec5e1SHisping Lin 767ae8ec5e1SHisping Lin SharedMem1.size = 1; 768ae8ec5e1SHisping Lin SharedMem1.flags = 0; 769ae8ec5e1SHisping Lin 770ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 771ae8ec5e1SHisping Lin 772ae8ec5e1SHisping Lin memcpy(SharedMem1.buffer, &lock_state, SharedMem1.size); 773ae8ec5e1SHisping Lin 774ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 775ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 776ae8ec5e1SHisping Lin 777ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 778ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem1.size; 779ae8ec5e1SHisping Lin 780ae8ec5e1SHisping Lin 781ae8ec5e1SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 782ae8ec5e1SHisping Lin TEEC_MEMREF_TEMP_INOUT, 783ae8ec5e1SHisping Lin TEEC_NONE, 784ae8ec5e1SHisping Lin TEEC_NONE); 785ae8ec5e1SHisping Lin 786ae8ec5e1SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 787ae8ec5e1SHisping Lin 1, 788ae8ec5e1SHisping Lin &TeecOperation, 789ae8ec5e1SHisping Lin &ErrorOrigin); 790ae8ec5e1SHisping Lin 791ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 792ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem1); 793ae8ec5e1SHisping Lin TEEC_CloseSession(&TeecSession); 79446b2a054SHisping Lin TEEC_FinalizeContext(&TeecContext); 795ae8ec5e1SHisping Lin debug("testmm end\n"); 796ae8ec5e1SHisping Lin 797ae8ec5e1SHisping Lin return TeecResult; 798ae8ec5e1SHisping Lin } 799ae8ec5e1SHisping Lin 800ae8ec5e1SHisping Lin uint32_t trusty_read_flash_lock_state(uint8_t *flash_lock_state) 801ae8ec5e1SHisping Lin { 802ae8ec5e1SHisping Lin TEEC_Result TeecResult; 803ae8ec5e1SHisping Lin TEEC_Context TeecContext; 804ae8ec5e1SHisping Lin TEEC_Session TeecSession; 805ae8ec5e1SHisping Lin uint32_t ErrorOrigin; 806ae8ec5e1SHisping Lin TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 807ae8ec5e1SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 808ae8ec5e1SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 809ae8ec5e1SHisping Lin TEEC_Operation TeecOperation = {0}; 8103251364cSHisping Lin struct blk_desc *dev_desc; 8113251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 8126651d4c0SJason Zhu if (!dev_desc) { 8136651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 8146651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 8156651d4c0SJason Zhu } 816ae8ec5e1SHisping Lin 817ae8ec5e1SHisping Lin debug("testmm start\n"); 818ae8ec5e1SHisping Lin OpteeClientApiLibInitialize(); 819ae8ec5e1SHisping Lin 820ae8ec5e1SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 821ae8ec5e1SHisping Lin 8223251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 8233251364cSHisping Lin TEEC_NONE, 8243251364cSHisping Lin TEEC_NONE, 8253251364cSHisping Lin TEEC_NONE); 8263251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 8273251364cSHisping Lin TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0; 8283251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 8293251364cSHisping Lin TeecOperation.params[0].value.a = 0; 8303251364cSHisping Lin #endif 831ae8ec5e1SHisping Lin 832ae8ec5e1SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 833ae8ec5e1SHisping Lin &TeecSession, 834ae8ec5e1SHisping Lin TeecUuid, 835ae8ec5e1SHisping Lin TEEC_LOGIN_PUBLIC, 836ae8ec5e1SHisping Lin NULL, 8373251364cSHisping Lin &TeecOperation, 838ae8ec5e1SHisping Lin &ErrorOrigin); 839ae8ec5e1SHisping Lin 840ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 841ae8ec5e1SHisping Lin 842ae8ec5e1SHisping Lin SharedMem0.size = sizeof("flash_lock_state"); 843ae8ec5e1SHisping Lin SharedMem0.flags = 0; 844ae8ec5e1SHisping Lin 845ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 846ae8ec5e1SHisping Lin 847ae8ec5e1SHisping Lin memcpy(SharedMem0.buffer, "flash_lock_state", SharedMem0.size); 848ae8ec5e1SHisping Lin 849ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem1 = {0}; 850ae8ec5e1SHisping Lin 851ae8ec5e1SHisping Lin SharedMem1.size = 1; 852ae8ec5e1SHisping Lin SharedMem1.flags = 0; 853ae8ec5e1SHisping Lin 854ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 855ae8ec5e1SHisping Lin 856ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 857ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 858ae8ec5e1SHisping Lin 859ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 860ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem1.size; 861ae8ec5e1SHisping Lin 862ae8ec5e1SHisping Lin 863ae8ec5e1SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 864ae8ec5e1SHisping Lin TEEC_MEMREF_TEMP_INOUT, 865ae8ec5e1SHisping Lin TEEC_NONE, 866ae8ec5e1SHisping Lin TEEC_NONE); 867ae8ec5e1SHisping Lin 868ae8ec5e1SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 869ae8ec5e1SHisping Lin 0, 870ae8ec5e1SHisping Lin &TeecOperation, 871ae8ec5e1SHisping Lin &ErrorOrigin); 87246b2a054SHisping Lin if (TeecResult == TEEC_SUCCESS) 873ae8ec5e1SHisping Lin memcpy(flash_lock_state, SharedMem1.buffer, SharedMem1.size); 874ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 875ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem1); 876ae8ec5e1SHisping Lin TEEC_CloseSession(&TeecSession); 87746b2a054SHisping Lin TEEC_FinalizeContext(&TeecContext); 878ae8ec5e1SHisping Lin debug("testmm end\n"); 879ae8ec5e1SHisping Lin 880ae8ec5e1SHisping Lin return TeecResult; 881ae8ec5e1SHisping Lin } 882ae8ec5e1SHisping Lin 883ae8ec5e1SHisping Lin 884ae8ec5e1SHisping Lin uint32_t trusty_write_flash_lock_state(uint8_t flash_lock_state) 885ae8ec5e1SHisping Lin { 886ae8ec5e1SHisping Lin TEEC_Result TeecResult; 887ae8ec5e1SHisping Lin TEEC_Context TeecContext; 888ae8ec5e1SHisping Lin TEEC_Session TeecSession; 889ae8ec5e1SHisping Lin uint32_t ErrorOrigin; 890ae8ec5e1SHisping Lin TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 891ae8ec5e1SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 892ae8ec5e1SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 893ae8ec5e1SHisping Lin TEEC_Operation TeecOperation = {0}; 8943251364cSHisping Lin struct blk_desc *dev_desc; 8953251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 8966651d4c0SJason Zhu if (!dev_desc) { 8976651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 8986651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 8996651d4c0SJason Zhu } 900ae8ec5e1SHisping Lin 901ae8ec5e1SHisping Lin debug("testmm start\n"); 902ae8ec5e1SHisping Lin OpteeClientApiLibInitialize(); 903ae8ec5e1SHisping Lin 904ae8ec5e1SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 905ae8ec5e1SHisping Lin 9063251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 9073251364cSHisping Lin TEEC_NONE, 9083251364cSHisping Lin TEEC_NONE, 9093251364cSHisping Lin TEEC_NONE); 9103251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 9113251364cSHisping Lin TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0; 9123251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 9133251364cSHisping Lin TeecOperation.params[0].value.a = 0; 9143251364cSHisping Lin #endif 9153251364cSHisping Lin 916ae8ec5e1SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 917ae8ec5e1SHisping Lin &TeecSession, 918ae8ec5e1SHisping Lin TeecUuid, 919ae8ec5e1SHisping Lin TEEC_LOGIN_PUBLIC, 920ae8ec5e1SHisping Lin NULL, 9213251364cSHisping Lin &TeecOperation, 922ae8ec5e1SHisping Lin &ErrorOrigin); 923ae8ec5e1SHisping Lin 924ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 925ae8ec5e1SHisping Lin 926ae8ec5e1SHisping Lin SharedMem0.size = sizeof("flash_lock_state"); 927ae8ec5e1SHisping Lin SharedMem0.flags = 0; 928ae8ec5e1SHisping Lin 929ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 930ae8ec5e1SHisping Lin 931ae8ec5e1SHisping Lin memcpy(SharedMem0.buffer, "flash_lock_state", SharedMem0.size); 932ae8ec5e1SHisping Lin 933ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem1 = {0}; 934ae8ec5e1SHisping Lin 935ae8ec5e1SHisping Lin SharedMem1.size = 1; 936ae8ec5e1SHisping Lin SharedMem1.flags = 0; 937ae8ec5e1SHisping Lin 938ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 939ae8ec5e1SHisping Lin 940ae8ec5e1SHisping Lin memcpy(SharedMem1.buffer, &flash_lock_state, SharedMem1.size); 941ae8ec5e1SHisping Lin 942ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 943ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 944ae8ec5e1SHisping Lin 945ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 946ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem1.size; 947ae8ec5e1SHisping Lin 948ae8ec5e1SHisping Lin 949ae8ec5e1SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 950ae8ec5e1SHisping Lin TEEC_MEMREF_TEMP_INOUT, 951ae8ec5e1SHisping Lin TEEC_NONE, 952ae8ec5e1SHisping Lin TEEC_NONE); 953ae8ec5e1SHisping Lin 954ae8ec5e1SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 955ae8ec5e1SHisping Lin 1, 956ae8ec5e1SHisping Lin &TeecOperation, 957ae8ec5e1SHisping Lin &ErrorOrigin); 958ae8ec5e1SHisping Lin 959ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 960ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem1); 961ae8ec5e1SHisping Lin TEEC_CloseSession(&TeecSession); 96246b2a054SHisping Lin TEEC_FinalizeContext(&TeecContext); 963ae8ec5e1SHisping Lin debug("testmm end\n"); 964ae8ec5e1SHisping Lin 965ae8ec5e1SHisping Lin return TeecResult; 966ae8ec5e1SHisping Lin } 967ae8ec5e1SHisping Lin 96878ef5fbdSqiujian TEEC_Result read_from_keymaster(uint8_t *filename, 96978ef5fbdSqiujian uint32_t filename_size, 97078ef5fbdSqiujian uint8_t *data, 97178ef5fbdSqiujian uint32_t size) 97278ef5fbdSqiujian { 97378ef5fbdSqiujian TEEC_Result TeecResult; 97478ef5fbdSqiujian TEEC_Context TeecContext; 97578ef5fbdSqiujian TEEC_Session TeecSession; 97678ef5fbdSqiujian uint32_t ErrorOrigin; 97799830019SHisping Lin TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 97899830019SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 97978ef5fbdSqiujian TEEC_UUID *TeecUuid = &tempuuid; 98078ef5fbdSqiujian TEEC_Operation TeecOperation = {0}; 98178ef5fbdSqiujian struct blk_desc *dev_desc; 98278ef5fbdSqiujian dev_desc = rockchip_get_bootdev(); 9836651d4c0SJason Zhu if (!dev_desc) { 9846651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 9856651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 9866651d4c0SJason Zhu } 98778ef5fbdSqiujian 98878ef5fbdSqiujian debug("read_from_keymaster start\n"); 98978ef5fbdSqiujian OpteeClientApiLibInitialize(); 99078ef5fbdSqiujian 99178ef5fbdSqiujian TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 99278ef5fbdSqiujian 99378ef5fbdSqiujian TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 99478ef5fbdSqiujian TEEC_NONE, 99578ef5fbdSqiujian TEEC_NONE, 99678ef5fbdSqiujian TEEC_NONE); 99778ef5fbdSqiujian /*0 nand or emmc "security" partition , 1 rpmb*/ 99878ef5fbdSqiujian TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0; 99978ef5fbdSqiujian #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 100078ef5fbdSqiujian TeecOperation.params[0].value.a = 0; 100178ef5fbdSqiujian #endif 100278ef5fbdSqiujian 100378ef5fbdSqiujian TeecResult = TEEC_OpenSession(&TeecContext, 100478ef5fbdSqiujian &TeecSession, 100578ef5fbdSqiujian TeecUuid, 100678ef5fbdSqiujian TEEC_LOGIN_PUBLIC, 100778ef5fbdSqiujian NULL, 100878ef5fbdSqiujian &TeecOperation, 100978ef5fbdSqiujian &ErrorOrigin); 101078ef5fbdSqiujian 101178ef5fbdSqiujian TEEC_SharedMemory SharedMem0 = {0}; 101278ef5fbdSqiujian 101378ef5fbdSqiujian SharedMem0.size = filename_size; 101478ef5fbdSqiujian SharedMem0.flags = 0; 101578ef5fbdSqiujian 101678ef5fbdSqiujian TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 101778ef5fbdSqiujian 101878ef5fbdSqiujian memcpy(SharedMem0.buffer, filename, SharedMem0.size); 101978ef5fbdSqiujian 102078ef5fbdSqiujian TEEC_SharedMemory SharedMem1 = {0}; 102178ef5fbdSqiujian 102278ef5fbdSqiujian SharedMem1.size = size; 102378ef5fbdSqiujian SharedMem1.flags = 0; 102478ef5fbdSqiujian 102578ef5fbdSqiujian TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 102678ef5fbdSqiujian 102778ef5fbdSqiujian TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 102878ef5fbdSqiujian TeecOperation.params[0].tmpref.size = SharedMem0.size; 102978ef5fbdSqiujian 103078ef5fbdSqiujian TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 103178ef5fbdSqiujian TeecOperation.params[1].tmpref.size = SharedMem1.size; 103278ef5fbdSqiujian 103378ef5fbdSqiujian 103478ef5fbdSqiujian TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 103578ef5fbdSqiujian TEEC_MEMREF_TEMP_INOUT, 103678ef5fbdSqiujian TEEC_NONE, 103778ef5fbdSqiujian TEEC_NONE); 103878ef5fbdSqiujian 103978ef5fbdSqiujian TeecResult = TEEC_InvokeCommand(&TeecSession, 104099830019SHisping Lin 0, 104178ef5fbdSqiujian &TeecOperation, 104278ef5fbdSqiujian &ErrorOrigin); 104378ef5fbdSqiujian if (TeecResult == TEEC_SUCCESS) 104478ef5fbdSqiujian memcpy(data, SharedMem1.buffer, SharedMem1.size); 104578ef5fbdSqiujian TEEC_ReleaseSharedMemory(&SharedMem0); 104678ef5fbdSqiujian TEEC_ReleaseSharedMemory(&SharedMem1); 104778ef5fbdSqiujian TEEC_CloseSession(&TeecSession); 104878ef5fbdSqiujian TEEC_FinalizeContext(&TeecContext); 104978ef5fbdSqiujian debug("read_from_keymaster end\n"); 105078ef5fbdSqiujian 105178ef5fbdSqiujian return TeecResult; 105278ef5fbdSqiujian } 105378ef5fbdSqiujian 1054ae8ec5e1SHisping Lin uint32_t write_to_keymaster(uint8_t *filename, 1055ae8ec5e1SHisping Lin uint32_t filename_size, 1056ae8ec5e1SHisping Lin uint8_t *data, 1057ae8ec5e1SHisping Lin uint32_t data_size) 1058ae8ec5e1SHisping Lin { 1059ae8ec5e1SHisping Lin TEEC_Result TeecResult; 1060ae8ec5e1SHisping Lin TEEC_Context TeecContext; 1061ae8ec5e1SHisping Lin TEEC_Session TeecSession; 1062ae8ec5e1SHisping Lin uint32_t ErrorOrigin; 106399830019SHisping Lin TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 106499830019SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 1065ae8ec5e1SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 1066ae8ec5e1SHisping Lin TEEC_Operation TeecOperation = {0}; 10673251364cSHisping Lin struct blk_desc *dev_desc; 10683251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 10696651d4c0SJason Zhu if (!dev_desc) { 10706651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 10716651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 10726651d4c0SJason Zhu } 1073ae8ec5e1SHisping Lin 1074ae8ec5e1SHisping Lin debug("write_to_keymaster\n"); 1075ae8ec5e1SHisping Lin OpteeClientApiLibInitialize(); 1076ae8ec5e1SHisping Lin 1077ae8ec5e1SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1078ae8ec5e1SHisping Lin 10793251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 10803251364cSHisping Lin TEEC_NONE, 10813251364cSHisping Lin TEEC_NONE, 10823251364cSHisping Lin TEEC_NONE); 10833251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 10843251364cSHisping Lin TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0; 10853251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 10863251364cSHisping Lin TeecOperation.params[0].value.a = 0; 10873251364cSHisping Lin #endif 10883251364cSHisping Lin 1089ae8ec5e1SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 1090ae8ec5e1SHisping Lin &TeecSession, 1091ae8ec5e1SHisping Lin TeecUuid, 1092ae8ec5e1SHisping Lin TEEC_LOGIN_PUBLIC, 1093ae8ec5e1SHisping Lin NULL, 10943251364cSHisping Lin &TeecOperation, 1095ae8ec5e1SHisping Lin &ErrorOrigin); 1096ae8ec5e1SHisping Lin 1097ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 1098ae8ec5e1SHisping Lin 1099ae8ec5e1SHisping Lin SharedMem0.size = filename_size; 1100ae8ec5e1SHisping Lin SharedMem0.flags = 0; 1101ae8ec5e1SHisping Lin 1102ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 1103ae8ec5e1SHisping Lin 1104ae8ec5e1SHisping Lin memcpy(SharedMem0.buffer, filename, SharedMem0.size); 1105ae8ec5e1SHisping Lin 1106ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem1 = {0}; 1107ae8ec5e1SHisping Lin 1108ae8ec5e1SHisping Lin SharedMem1.size = data_size; 1109ae8ec5e1SHisping Lin SharedMem1.flags = 0; 1110ae8ec5e1SHisping Lin 1111ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 1112ae8ec5e1SHisping Lin 1113ae8ec5e1SHisping Lin memcpy(SharedMem1.buffer, data, SharedMem1.size); 1114ae8ec5e1SHisping Lin 1115ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 1116ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 1117ae8ec5e1SHisping Lin 1118ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 1119ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem1.size; 1120ae8ec5e1SHisping Lin 1121ae8ec5e1SHisping Lin 1122ae8ec5e1SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 1123ae8ec5e1SHisping Lin TEEC_MEMREF_TEMP_INOUT, 1124ae8ec5e1SHisping Lin TEEC_NONE, 1125ae8ec5e1SHisping Lin TEEC_NONE); 1126ae8ec5e1SHisping Lin 1127ae8ec5e1SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 112899830019SHisping Lin 1, 1129ae8ec5e1SHisping Lin &TeecOperation, 1130ae8ec5e1SHisping Lin &ErrorOrigin); 1131ae8ec5e1SHisping Lin 1132ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 1133ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem1); 1134ae8ec5e1SHisping Lin TEEC_CloseSession(&TeecSession); 113546b2a054SHisping Lin TEEC_FinalizeContext(&TeecContext); 113678ef5fbdSqiujian debug("write_to_keymaster end\n"); 1137ae8ec5e1SHisping Lin debug("TeecResult %x\n", TeecResult); 1138ae8ec5e1SHisping Lin 1139ae8ec5e1SHisping Lin return TeecResult; 1140ae8ec5e1SHisping Lin } 11416ef445a4SHisping Lin 11426ef445a4SHisping Lin uint32_t trusty_read_attribute_hash(uint32_t *buf, uint32_t length) 11436ef445a4SHisping Lin { 11446ef445a4SHisping Lin TEEC_Result TeecResult; 11456ef445a4SHisping Lin TEEC_Context TeecContext; 11466ef445a4SHisping Lin TEEC_Session TeecSession; 11476ef445a4SHisping Lin uint32_t ErrorOrigin; 11486ef445a4SHisping Lin 11496ef445a4SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, \ 11506ef445a4SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 11516ef445a4SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 11526ef445a4SHisping Lin TEEC_Operation TeecOperation = {0}; 11536ef445a4SHisping Lin 11546ef445a4SHisping Lin OpteeClientApiLibInitialize(); 11556ef445a4SHisping Lin 11566ef445a4SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 11576ef445a4SHisping Lin 11586ef445a4SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 11596ef445a4SHisping Lin &TeecSession, 11606ef445a4SHisping Lin TeecUuid, 11616ef445a4SHisping Lin TEEC_LOGIN_PUBLIC, 11626ef445a4SHisping Lin NULL, 11636ef445a4SHisping Lin NULL, 11646ef445a4SHisping Lin &ErrorOrigin); 11656ef445a4SHisping Lin 11666ef445a4SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 11676ef445a4SHisping Lin 11686ef445a4SHisping Lin SharedMem0.size = length * sizeof(uint32_t); 11696ef445a4SHisping Lin SharedMem0.flags = 0; 11706ef445a4SHisping Lin 11716ef445a4SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 11726ef445a4SHisping Lin 11736ef445a4SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 11746ef445a4SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 11756ef445a4SHisping Lin 11766ef445a4SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT, 11776ef445a4SHisping Lin TEEC_NONE, 11786ef445a4SHisping Lin TEEC_NONE, 11796ef445a4SHisping Lin TEEC_NONE); 11806ef445a4SHisping Lin 11816ef445a4SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 11826ef445a4SHisping Lin 0, 11836ef445a4SHisping Lin &TeecOperation, 11846ef445a4SHisping Lin &ErrorOrigin); 11856ef445a4SHisping Lin 11866ef445a4SHisping Lin if (TeecResult == TEEC_SUCCESS) 11876ef445a4SHisping Lin memcpy(buf, SharedMem0.buffer, SharedMem0.size); 11886ef445a4SHisping Lin 11896ef445a4SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 11906ef445a4SHisping Lin TEEC_CloseSession(&TeecSession); 11916ef445a4SHisping Lin TEEC_FinalizeContext(&TeecContext); 11926ef445a4SHisping Lin 11936ef445a4SHisping Lin return TeecResult; 11946ef445a4SHisping Lin } 11956ef445a4SHisping Lin 11966ef445a4SHisping Lin uint32_t trusty_write_attribute_hash(uint32_t *buf, uint32_t length) 11976ef445a4SHisping Lin { 11986ef445a4SHisping Lin TEEC_Result TeecResult; 11996ef445a4SHisping Lin TEEC_Context TeecContext; 12006ef445a4SHisping Lin TEEC_Session TeecSession; 12016ef445a4SHisping Lin uint32_t ErrorOrigin; 12026ef445a4SHisping Lin 12036ef445a4SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, \ 12046ef445a4SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 12056ef445a4SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 12066ef445a4SHisping Lin TEEC_Operation TeecOperation = {0}; 12076ef445a4SHisping Lin 12086ef445a4SHisping Lin OpteeClientApiLibInitialize(); 12096ef445a4SHisping Lin 12106ef445a4SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 12116ef445a4SHisping Lin 12126ef445a4SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 12136ef445a4SHisping Lin &TeecSession, 12146ef445a4SHisping Lin TeecUuid, 12156ef445a4SHisping Lin TEEC_LOGIN_PUBLIC, 12166ef445a4SHisping Lin NULL, 12176ef445a4SHisping Lin NULL, 12186ef445a4SHisping Lin &ErrorOrigin); 12196ef445a4SHisping Lin 12206ef445a4SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 12216ef445a4SHisping Lin 12226ef445a4SHisping Lin SharedMem0.size = length * sizeof(uint32_t); 12236ef445a4SHisping Lin SharedMem0.flags = 0; 12246ef445a4SHisping Lin 12256ef445a4SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 12266ef445a4SHisping Lin 12276ef445a4SHisping Lin memcpy(SharedMem0.buffer, buf, SharedMem0.size); 12286ef445a4SHisping Lin 12296ef445a4SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 12306ef445a4SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 12316ef445a4SHisping Lin 12326ef445a4SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 12336ef445a4SHisping Lin TEEC_NONE, 12346ef445a4SHisping Lin TEEC_NONE, 12356ef445a4SHisping Lin TEEC_NONE); 12366ef445a4SHisping Lin 12376ef445a4SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 12386ef445a4SHisping Lin 1, 12396ef445a4SHisping Lin &TeecOperation, 12406ef445a4SHisping Lin &ErrorOrigin); 12416ef445a4SHisping Lin 12426ef445a4SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 12436ef445a4SHisping Lin TEEC_CloseSession(&TeecSession); 12446ef445a4SHisping Lin TEEC_FinalizeContext(&TeecContext); 12456ef445a4SHisping Lin 12466ef445a4SHisping Lin return TeecResult; 12476ef445a4SHisping Lin } 124816539616SHisping Lin 124916539616SHisping Lin uint32_t notify_optee_rpmb_ta(void) 125016539616SHisping Lin { 125116539616SHisping Lin TEEC_Result TeecResult; 125216539616SHisping Lin TEEC_Context TeecContext; 125316539616SHisping Lin TEEC_Session TeecSession; 125416539616SHisping Lin uint32_t ErrorOrigin; 125516539616SHisping Lin TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 125616539616SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 125716539616SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 125816539616SHisping Lin TEEC_Operation TeecOperation = {0}; 125916539616SHisping Lin 126016539616SHisping Lin OpteeClientApiLibInitialize(); 126116539616SHisping Lin 126216539616SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 126316539616SHisping Lin 126416539616SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 126516539616SHisping Lin &TeecSession, 126616539616SHisping Lin TeecUuid, 126716539616SHisping Lin TEEC_LOGIN_PUBLIC, 126816539616SHisping Lin NULL, 126916539616SHisping Lin NULL, 127016539616SHisping Lin &ErrorOrigin); 127116539616SHisping Lin 127216539616SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE, 127316539616SHisping Lin TEEC_NONE, 127416539616SHisping Lin TEEC_NONE, 127516539616SHisping Lin TEEC_NONE); 127616539616SHisping Lin 127716539616SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 127816539616SHisping Lin 2, 127916539616SHisping Lin &TeecOperation, 128016539616SHisping Lin &ErrorOrigin); 128116539616SHisping Lin 128216539616SHisping Lin TEEC_CloseSession(&TeecSession); 128316539616SHisping Lin TEEC_FinalizeContext(&TeecContext); 128416539616SHisping Lin 128516539616SHisping Lin return TeecResult; 128616539616SHisping Lin } 128716539616SHisping Lin 128816539616SHisping Lin uint32_t notify_optee_efuse_ta(void) 128916539616SHisping Lin { 129016539616SHisping Lin TEEC_Result TeecResult; 129116539616SHisping Lin TEEC_Context TeecContext; 129216539616SHisping Lin TEEC_Session TeecSession; 129316539616SHisping Lin uint32_t ErrorOrigin; 129416539616SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, \ 129516539616SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 129616539616SHisping Lin 129716539616SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 129816539616SHisping Lin TEEC_Operation TeecOperation = {0}; 129916539616SHisping Lin 130016539616SHisping Lin OpteeClientApiLibInitialize(); 130116539616SHisping Lin 130216539616SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 130316539616SHisping Lin 130416539616SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 130516539616SHisping Lin &TeecSession, 130616539616SHisping Lin TeecUuid, 130716539616SHisping Lin TEEC_LOGIN_PUBLIC, 130816539616SHisping Lin NULL, 130916539616SHisping Lin NULL, 131016539616SHisping Lin &ErrorOrigin); 131116539616SHisping Lin 131216539616SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE, 131316539616SHisping Lin TEEC_NONE, 131416539616SHisping Lin TEEC_NONE, 131516539616SHisping Lin TEEC_NONE); 131616539616SHisping Lin 131716539616SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 131816539616SHisping Lin 2, 131916539616SHisping Lin &TeecOperation, 132016539616SHisping Lin &ErrorOrigin); 132116539616SHisping Lin 132216539616SHisping Lin TEEC_CloseSession(&TeecSession); 132316539616SHisping Lin TEEC_FinalizeContext(&TeecContext); 132416539616SHisping Lin 132516539616SHisping Lin return TeecResult; 132616539616SHisping Lin } 132716539616SHisping Lin 132816539616SHisping Lin uint32_t trusty_notify_optee_uboot_end(void) 132916539616SHisping Lin { 133016539616SHisping Lin TEEC_Result res; 133116539616SHisping Lin res = notify_optee_rpmb_ta(); 133216539616SHisping Lin res |= notify_optee_efuse_ta(); 133316539616SHisping Lin return res; 133416539616SHisping Lin } 13352cd27853SHisping Lin 13362cd27853SHisping Lin uint32_t trusty_read_vbootkey_hash(uint32_t *buf, uint32_t length) 13372cd27853SHisping Lin { 13382cd27853SHisping Lin TEEC_Result TeecResult; 13392cd27853SHisping Lin TEEC_Context TeecContext; 13402cd27853SHisping Lin TEEC_Session TeecSession; 13412cd27853SHisping Lin uint32_t ErrorOrigin; 13422cd27853SHisping Lin 13432cd27853SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, \ 13442cd27853SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 13452cd27853SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 13462cd27853SHisping Lin TEEC_Operation TeecOperation = {0}; 13472cd27853SHisping Lin 13482cd27853SHisping Lin OpteeClientApiLibInitialize(); 13492cd27853SHisping Lin 13502cd27853SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 13512cd27853SHisping Lin 13522cd27853SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 13532cd27853SHisping Lin &TeecSession, 13542cd27853SHisping Lin TeecUuid, 13552cd27853SHisping Lin TEEC_LOGIN_PUBLIC, 13562cd27853SHisping Lin NULL, 13572cd27853SHisping Lin NULL, 13582cd27853SHisping Lin &ErrorOrigin); 13592cd27853SHisping Lin 13602cd27853SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 13612cd27853SHisping Lin 13622cd27853SHisping Lin SharedMem0.size = length * sizeof(uint32_t); 13632cd27853SHisping Lin SharedMem0.flags = 0; 13642cd27853SHisping Lin 13652cd27853SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 13662cd27853SHisping Lin 13672cd27853SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 13682cd27853SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 13692cd27853SHisping Lin 13702cd27853SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT, 13712cd27853SHisping Lin TEEC_NONE, 13722cd27853SHisping Lin TEEC_NONE, 13732cd27853SHisping Lin TEEC_NONE); 13742cd27853SHisping Lin 13752cd27853SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 13762cd27853SHisping Lin 3, 13772cd27853SHisping Lin &TeecOperation, 13782cd27853SHisping Lin &ErrorOrigin); 13792cd27853SHisping Lin 13802cd27853SHisping Lin if (TeecResult == TEEC_SUCCESS) 13812cd27853SHisping Lin memcpy(buf, SharedMem0.buffer, SharedMem0.size); 13822cd27853SHisping Lin 13832cd27853SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 13842cd27853SHisping Lin TEEC_CloseSession(&TeecSession); 13852cd27853SHisping Lin TEEC_FinalizeContext(&TeecContext); 13862cd27853SHisping Lin 13872cd27853SHisping Lin return TeecResult; 13882cd27853SHisping Lin } 13892cd27853SHisping Lin uint32_t trusty_write_vbootkey_hash(uint32_t *buf, uint32_t length) 13902cd27853SHisping Lin { 13912cd27853SHisping Lin TEEC_Result TeecResult; 13922cd27853SHisping Lin TEEC_Context TeecContext; 13932cd27853SHisping Lin TEEC_Session TeecSession; 13942cd27853SHisping Lin uint32_t ErrorOrigin; 13952cd27853SHisping Lin 13962cd27853SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, \ 13972cd27853SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 13982cd27853SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 13992cd27853SHisping Lin TEEC_Operation TeecOperation = {0}; 14002cd27853SHisping Lin 14012cd27853SHisping Lin OpteeClientApiLibInitialize(); 14022cd27853SHisping Lin 14032cd27853SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 14042cd27853SHisping Lin 14052cd27853SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 14062cd27853SHisping Lin &TeecSession, 14072cd27853SHisping Lin TeecUuid, 14082cd27853SHisping Lin TEEC_LOGIN_PUBLIC, 14092cd27853SHisping Lin NULL, 14102cd27853SHisping Lin NULL, 14112cd27853SHisping Lin &ErrorOrigin); 14122cd27853SHisping Lin 14132cd27853SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 14142cd27853SHisping Lin 14152cd27853SHisping Lin SharedMem0.size = length * sizeof(uint32_t); 14162cd27853SHisping Lin SharedMem0.flags = 0; 14172cd27853SHisping Lin 14182cd27853SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 14192cd27853SHisping Lin 14202cd27853SHisping Lin memcpy(SharedMem0.buffer, buf, SharedMem0.size); 14212cd27853SHisping Lin 14222cd27853SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 14232cd27853SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 14242cd27853SHisping Lin 14252cd27853SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 14262cd27853SHisping Lin TEEC_NONE, 14272cd27853SHisping Lin TEEC_NONE, 14282cd27853SHisping Lin TEEC_NONE); 14292cd27853SHisping Lin 14302cd27853SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 14312cd27853SHisping Lin 4, 14322cd27853SHisping Lin &TeecOperation, 14332cd27853SHisping Lin &ErrorOrigin); 14342cd27853SHisping Lin 14352cd27853SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 14362cd27853SHisping Lin TEEC_CloseSession(&TeecSession); 14372cd27853SHisping Lin TEEC_FinalizeContext(&TeecContext); 14382cd27853SHisping Lin 14392cd27853SHisping Lin return TeecResult; 14402cd27853SHisping Lin } 1441095e2a82SHisping Lin 1442468df3b2SHisping Lin uint32_t trusty_read_vbootkey_enable_flag(uint8_t *flag) 1443468df3b2SHisping Lin { 1444468df3b2SHisping Lin TEEC_Result TeecResult; 1445468df3b2SHisping Lin TEEC_Context TeecContext; 1446468df3b2SHisping Lin TEEC_Session TeecSession; 1447468df3b2SHisping Lin uint32_t ErrorOrigin; 1448468df3b2SHisping Lin uint32_t bootflag; 1449468df3b2SHisping Lin 1450468df3b2SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, \ 1451468df3b2SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 1452468df3b2SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 1453468df3b2SHisping Lin TEEC_Operation TeecOperation = {0}; 1454468df3b2SHisping Lin 1455468df3b2SHisping Lin OpteeClientApiLibInitialize(); 1456468df3b2SHisping Lin 1457468df3b2SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1458468df3b2SHisping Lin 1459468df3b2SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 1460468df3b2SHisping Lin &TeecSession, 1461468df3b2SHisping Lin TeecUuid, 1462468df3b2SHisping Lin TEEC_LOGIN_PUBLIC, 1463468df3b2SHisping Lin NULL, 1464468df3b2SHisping Lin NULL, 1465468df3b2SHisping Lin &ErrorOrigin); 1466468df3b2SHisping Lin 1467468df3b2SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 1468468df3b2SHisping Lin 1469468df3b2SHisping Lin SharedMem0.size = 1 * sizeof(uint32_t); 1470468df3b2SHisping Lin SharedMem0.flags = 0; 1471468df3b2SHisping Lin 1472468df3b2SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 1473468df3b2SHisping Lin 1474468df3b2SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 1475468df3b2SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 1476468df3b2SHisping Lin 1477468df3b2SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT, 1478468df3b2SHisping Lin TEEC_NONE, 1479468df3b2SHisping Lin TEEC_NONE, 1480468df3b2SHisping Lin TEEC_NONE); 1481468df3b2SHisping Lin 1482468df3b2SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 1483468df3b2SHisping Lin 5, 1484468df3b2SHisping Lin &TeecOperation, 1485468df3b2SHisping Lin &ErrorOrigin); 1486468df3b2SHisping Lin 1487468df3b2SHisping Lin if (TeecResult == TEEC_SUCCESS) { 1488468df3b2SHisping Lin memcpy(&bootflag, SharedMem0.buffer, SharedMem0.size); 1489468df3b2SHisping Lin if (bootflag == 0x000000FF) 1490468df3b2SHisping Lin *flag = 1; 1491468df3b2SHisping Lin } 1492468df3b2SHisping Lin 1493468df3b2SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 1494468df3b2SHisping Lin TEEC_CloseSession(&TeecSession); 1495468df3b2SHisping Lin TEEC_FinalizeContext(&TeecContext); 1496468df3b2SHisping Lin 1497468df3b2SHisping Lin return TeecResult; 1498468df3b2SHisping Lin } 1499468df3b2SHisping Lin 1500095e2a82SHisping Lin uint32_t trusty_read_permanent_attributes_flag(uint8_t *attributes) 1501095e2a82SHisping Lin { 1502095e2a82SHisping Lin TEEC_Result TeecResult; 1503095e2a82SHisping Lin TEEC_Context TeecContext; 1504095e2a82SHisping Lin TEEC_Session TeecSession; 1505095e2a82SHisping Lin uint32_t ErrorOrigin; 150699830019SHisping Lin TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 150799830019SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 1508095e2a82SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 1509095e2a82SHisping Lin TEEC_Operation TeecOperation = {0}; 15103251364cSHisping Lin struct blk_desc *dev_desc; 15113251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 15126651d4c0SJason Zhu if (!dev_desc) { 15136651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 15146651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 15156651d4c0SJason Zhu } 1516095e2a82SHisping Lin 1517095e2a82SHisping Lin debug("testmm start\n"); 1518095e2a82SHisping Lin OpteeClientApiLibInitialize(); 1519095e2a82SHisping Lin 1520095e2a82SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1521095e2a82SHisping Lin 15223251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 15233251364cSHisping Lin TEEC_NONE, 15243251364cSHisping Lin TEEC_NONE, 15253251364cSHisping Lin TEEC_NONE); 15263251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 15273251364cSHisping Lin TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0; 15283251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 15293251364cSHisping Lin TeecOperation.params[0].value.a = 0; 15303251364cSHisping Lin #endif 15313251364cSHisping Lin 1532095e2a82SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 1533095e2a82SHisping Lin &TeecSession, 1534095e2a82SHisping Lin TeecUuid, 1535095e2a82SHisping Lin TEEC_LOGIN_PUBLIC, 1536095e2a82SHisping Lin NULL, 15373251364cSHisping Lin &TeecOperation, 1538095e2a82SHisping Lin &ErrorOrigin); 1539095e2a82SHisping Lin 1540095e2a82SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 1541095e2a82SHisping Lin 1542095e2a82SHisping Lin SharedMem0.size = sizeof("attributes_flag"); 1543095e2a82SHisping Lin SharedMem0.flags = 0; 1544095e2a82SHisping Lin 1545095e2a82SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 1546095e2a82SHisping Lin 1547095e2a82SHisping Lin memcpy(SharedMem0.buffer, "attributes_flag", SharedMem0.size); 1548095e2a82SHisping Lin 1549095e2a82SHisping Lin TEEC_SharedMemory SharedMem1 = {0}; 1550095e2a82SHisping Lin 1551095e2a82SHisping Lin SharedMem1.size = 1; 1552095e2a82SHisping Lin SharedMem1.flags = 0; 1553095e2a82SHisping Lin 1554095e2a82SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 1555095e2a82SHisping Lin 1556095e2a82SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 1557095e2a82SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 1558095e2a82SHisping Lin 1559095e2a82SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 1560095e2a82SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem1.size; 1561095e2a82SHisping Lin 1562095e2a82SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 1563095e2a82SHisping Lin TEEC_MEMREF_TEMP_INOUT, 1564095e2a82SHisping Lin TEEC_NONE, 1565095e2a82SHisping Lin TEEC_NONE); 1566095e2a82SHisping Lin 1567095e2a82SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 156899830019SHisping Lin 0, 1569095e2a82SHisping Lin &TeecOperation, 1570095e2a82SHisping Lin &ErrorOrigin); 1571095e2a82SHisping Lin if (TeecResult == TEEC_SUCCESS) 1572095e2a82SHisping Lin memcpy(attributes, SharedMem1.buffer, SharedMem1.size); 1573095e2a82SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 1574095e2a82SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem1); 1575095e2a82SHisping Lin TEEC_CloseSession(&TeecSession); 1576095e2a82SHisping Lin TEEC_FinalizeContext(&TeecContext); 1577095e2a82SHisping Lin debug("testmm end\n"); 1578095e2a82SHisping Lin 1579095e2a82SHisping Lin return TeecResult; 1580095e2a82SHisping Lin } 1581095e2a82SHisping Lin 1582095e2a82SHisping Lin uint32_t trusty_write_permanent_attributes_flag(uint8_t attributes) 1583095e2a82SHisping Lin { 1584095e2a82SHisping Lin TEEC_Result TeecResult; 1585095e2a82SHisping Lin TEEC_Context TeecContext; 1586095e2a82SHisping Lin TEEC_Session TeecSession; 1587095e2a82SHisping Lin uint32_t ErrorOrigin; 158899830019SHisping Lin TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 158999830019SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 1590095e2a82SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 1591095e2a82SHisping Lin TEEC_Operation TeecOperation = {0}; 15923251364cSHisping Lin struct blk_desc *dev_desc; 15933251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 15946651d4c0SJason Zhu if (!dev_desc) { 15956651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 15966651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 15976651d4c0SJason Zhu } 1598095e2a82SHisping Lin 1599095e2a82SHisping Lin debug("testmm start\n"); 1600095e2a82SHisping Lin OpteeClientApiLibInitialize(); 1601095e2a82SHisping Lin 1602095e2a82SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1603095e2a82SHisping Lin 16043251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 16053251364cSHisping Lin TEEC_NONE, 16063251364cSHisping Lin TEEC_NONE, 16073251364cSHisping Lin TEEC_NONE); 16083251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 16093251364cSHisping Lin TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0; 16103251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 16113251364cSHisping Lin TeecOperation.params[0].value.a = 0; 16123251364cSHisping Lin #endif 16133251364cSHisping Lin 1614095e2a82SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 1615095e2a82SHisping Lin &TeecSession, 1616095e2a82SHisping Lin TeecUuid, 1617095e2a82SHisping Lin TEEC_LOGIN_PUBLIC, 1618095e2a82SHisping Lin NULL, 16193251364cSHisping Lin &TeecOperation, 1620095e2a82SHisping Lin &ErrorOrigin); 1621095e2a82SHisping Lin 1622095e2a82SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 1623095e2a82SHisping Lin 1624095e2a82SHisping Lin SharedMem0.size = sizeof("attributes_flag"); 1625095e2a82SHisping Lin SharedMem0.flags = 0; 1626095e2a82SHisping Lin 1627095e2a82SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 1628095e2a82SHisping Lin 1629095e2a82SHisping Lin memcpy(SharedMem0.buffer, "attributes_flag", SharedMem0.size); 1630095e2a82SHisping Lin 1631095e2a82SHisping Lin TEEC_SharedMemory SharedMem1 = {0}; 1632095e2a82SHisping Lin 1633095e2a82SHisping Lin SharedMem1.size = 1; 1634095e2a82SHisping Lin SharedMem1.flags = 0; 1635095e2a82SHisping Lin 1636095e2a82SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 1637095e2a82SHisping Lin 1638095e2a82SHisping Lin memcpy(SharedMem1.buffer, (char *)&attributes, SharedMem1.size); 1639095e2a82SHisping Lin 1640095e2a82SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 1641095e2a82SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 1642095e2a82SHisping Lin 1643095e2a82SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 1644095e2a82SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem1.size; 1645095e2a82SHisping Lin 1646095e2a82SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 1647095e2a82SHisping Lin TEEC_MEMREF_TEMP_INOUT, 1648095e2a82SHisping Lin TEEC_NONE, 1649095e2a82SHisping Lin TEEC_NONE); 1650095e2a82SHisping Lin 1651095e2a82SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 165299830019SHisping Lin 1, 1653095e2a82SHisping Lin &TeecOperation, 1654095e2a82SHisping Lin &ErrorOrigin); 1655095e2a82SHisping Lin 1656095e2a82SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 1657095e2a82SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem1); 1658095e2a82SHisping Lin TEEC_CloseSession(&TeecSession); 1659095e2a82SHisping Lin TEEC_FinalizeContext(&TeecContext); 1660095e2a82SHisping Lin debug("testmm end\n"); 1661095e2a82SHisping Lin 1662095e2a82SHisping Lin return TeecResult; 1663095e2a82SHisping Lin } 16644aa61755SAndy Ye 16654aa61755SAndy Ye uint32_t trusty_attest_dh(uint8_t *dh, uint32_t *dh_size) 16664aa61755SAndy Ye { 16674aa61755SAndy Ye TEEC_Result TeecResult; 16684aa61755SAndy Ye TEEC_Context TeecContext; 16694aa61755SAndy Ye TEEC_Session TeecSession; 16704aa61755SAndy Ye uint32_t ErrorOrigin; 16714aa61755SAndy Ye TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6, 16724aa61755SAndy Ye { 0xa8, 0x69, 0x9c, 0xe6, 16734aa61755SAndy Ye 0x88, 0x6c, 0x5d, 0x5d 16744aa61755SAndy Ye } 16754aa61755SAndy Ye }; 16764aa61755SAndy Ye TEEC_UUID *TeecUuid = &tempuuid; 16774aa61755SAndy Ye TEEC_Operation TeecOperation = {0}; 16783251364cSHisping Lin struct blk_desc *dev_desc; 16793251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 16806651d4c0SJason Zhu if (!dev_desc) { 16816651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 16826651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 16836651d4c0SJason Zhu } 16844aa61755SAndy Ye 16854aa61755SAndy Ye OpteeClientApiLibInitialize(); 16864aa61755SAndy Ye 16874aa61755SAndy Ye TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 16884aa61755SAndy Ye 16893251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 16903251364cSHisping Lin TEEC_NONE, 16913251364cSHisping Lin TEEC_NONE, 16923251364cSHisping Lin TEEC_NONE); 16933251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 16943251364cSHisping Lin TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0; 16953251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 16963251364cSHisping Lin TeecOperation.params[0].value.a = 0; 16973251364cSHisping Lin #endif 16983251364cSHisping Lin 16994aa61755SAndy Ye TeecResult = TEEC_OpenSession(&TeecContext, 17004aa61755SAndy Ye &TeecSession, 17014aa61755SAndy Ye TeecUuid, 17024aa61755SAndy Ye TEEC_LOGIN_PUBLIC, 17034aa61755SAndy Ye NULL, 17043251364cSHisping Lin &TeecOperation, 17054aa61755SAndy Ye &ErrorOrigin); 17064aa61755SAndy Ye 17074aa61755SAndy Ye TEEC_SharedMemory SharedMem0 = {0}; 17084aa61755SAndy Ye 17094aa61755SAndy Ye SharedMem0.size = *dh_size; 17104aa61755SAndy Ye SharedMem0.flags = 0; 17114aa61755SAndy Ye 17124aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 17134aa61755SAndy Ye 17144aa61755SAndy Ye TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 17154aa61755SAndy Ye TeecOperation.params[0].tmpref.size = SharedMem0.size; 17164aa61755SAndy Ye 17174aa61755SAndy Ye TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, 17184aa61755SAndy Ye TEEC_NONE, 17194aa61755SAndy Ye TEEC_NONE, 17204aa61755SAndy Ye TEEC_NONE); 17214aa61755SAndy Ye 17224aa61755SAndy Ye TeecResult = TEEC_InvokeCommand(&TeecSession, 17234aa61755SAndy Ye 143, 17244aa61755SAndy Ye &TeecOperation, 17254aa61755SAndy Ye &ErrorOrigin); 17264aa61755SAndy Ye 17274aa61755SAndy Ye *dh_size = TeecOperation.params[0].tmpref.size; 17284aa61755SAndy Ye memcpy(dh, SharedMem0.buffer, SharedMem0.size); 17294aa61755SAndy Ye 17304aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem0); 17314aa61755SAndy Ye 17324aa61755SAndy Ye TEEC_CloseSession(&TeecSession); 17334aa61755SAndy Ye TeecResult = TEEC_FinalizeContext(&TeecContext); 17344aa61755SAndy Ye 17354aa61755SAndy Ye return TeecResult; 17364aa61755SAndy Ye } 17374aa61755SAndy Ye 17384aa61755SAndy Ye uint32_t trusty_attest_uuid(uint8_t *uuid, uint32_t *uuid_size) 17394aa61755SAndy Ye { 17404aa61755SAndy Ye TEEC_Result TeecResult; 17414aa61755SAndy Ye TEEC_Context TeecContext; 17424aa61755SAndy Ye TEEC_Session TeecSession; 17434aa61755SAndy Ye uint32_t ErrorOrigin; 17444aa61755SAndy Ye TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6, 17454aa61755SAndy Ye { 0xa8, 0x69, 0x9c, 0xe6, 17464aa61755SAndy Ye 0x88, 0x6c, 0x5d, 0x5d 17474aa61755SAndy Ye } 17484aa61755SAndy Ye }; 17494aa61755SAndy Ye TEEC_UUID *TeecUuid = &tempuuid; 17504aa61755SAndy Ye TEEC_Operation TeecOperation = {0}; 17513251364cSHisping Lin struct blk_desc *dev_desc; 17523251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 17536651d4c0SJason Zhu if (!dev_desc) { 17546651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 17556651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 17566651d4c0SJason Zhu } 17574aa61755SAndy Ye 17584aa61755SAndy Ye OpteeClientApiLibInitialize(); 17594aa61755SAndy Ye 17604aa61755SAndy Ye TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 17614aa61755SAndy Ye 17623251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 17633251364cSHisping Lin TEEC_NONE, 17643251364cSHisping Lin TEEC_NONE, 17653251364cSHisping Lin TEEC_NONE); 17663251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 17673251364cSHisping Lin TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0; 17683251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 17693251364cSHisping Lin TeecOperation.params[0].value.a = 0; 17703251364cSHisping Lin #endif 17713251364cSHisping Lin 17724aa61755SAndy Ye TeecResult = TEEC_OpenSession(&TeecContext, 17734aa61755SAndy Ye &TeecSession, 17744aa61755SAndy Ye TeecUuid, 17754aa61755SAndy Ye TEEC_LOGIN_PUBLIC, 17764aa61755SAndy Ye NULL, 17773251364cSHisping Lin &TeecOperation, 17784aa61755SAndy Ye &ErrorOrigin); 17794aa61755SAndy Ye 17804aa61755SAndy Ye TEEC_SharedMemory SharedMem0 = {0}; 17814aa61755SAndy Ye 17824aa61755SAndy Ye SharedMem0.size = *uuid_size; 17834aa61755SAndy Ye SharedMem0.flags = 0; 17844aa61755SAndy Ye 17854aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 17864aa61755SAndy Ye 17874aa61755SAndy Ye TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 17884aa61755SAndy Ye TeecOperation.params[0].tmpref.size = SharedMem0.size; 17894aa61755SAndy Ye 17904aa61755SAndy Ye TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, 17914aa61755SAndy Ye TEEC_NONE, 17924aa61755SAndy Ye TEEC_NONE, 17934aa61755SAndy Ye TEEC_NONE); 17944aa61755SAndy Ye 17954aa61755SAndy Ye TeecResult = TEEC_InvokeCommand(&TeecSession, 17964aa61755SAndy Ye 144, 17974aa61755SAndy Ye &TeecOperation, 17984aa61755SAndy Ye &ErrorOrigin); 17994aa61755SAndy Ye 18004aa61755SAndy Ye *uuid_size = TeecOperation.params[0].tmpref.size; 18014aa61755SAndy Ye memcpy(uuid, SharedMem0.buffer, SharedMem0.size); 18024aa61755SAndy Ye 18034aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem0); 18044aa61755SAndy Ye 18054aa61755SAndy Ye TEEC_CloseSession(&TeecSession); 18064aa61755SAndy Ye TeecResult = TEEC_FinalizeContext(&TeecContext); 18074aa61755SAndy Ye 18084aa61755SAndy Ye return TeecResult; 18094aa61755SAndy Ye } 18104aa61755SAndy Ye 18114aa61755SAndy Ye uint32_t trusty_attest_get_ca(uint8_t *operation_start, 18124aa61755SAndy Ye uint32_t *operation_size, 18134aa61755SAndy Ye uint8_t *out, 18144aa61755SAndy Ye uint32_t *out_len) 18154aa61755SAndy Ye { 18164aa61755SAndy Ye TEEC_Result TeecResult; 18174aa61755SAndy Ye TEEC_Context TeecContext; 18184aa61755SAndy Ye TEEC_Session TeecSession; 18194aa61755SAndy Ye uint32_t ErrorOrigin; 18204aa61755SAndy Ye 18214aa61755SAndy Ye OpteeClientApiLibInitialize(); 18224aa61755SAndy Ye 18234aa61755SAndy Ye TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6, 18244aa61755SAndy Ye { 0xa8, 0x69, 0x9c, 0xe6, 18254aa61755SAndy Ye 0x88, 0x6c, 0x5d, 0x5d 18264aa61755SAndy Ye } 18274aa61755SAndy Ye }; 18284aa61755SAndy Ye 18294aa61755SAndy Ye TEEC_UUID *TeecUuid = &tempuuid; 18304aa61755SAndy Ye TEEC_Operation TeecOperation = {0}; 18313251364cSHisping Lin struct blk_desc *dev_desc; 18323251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 18336651d4c0SJason Zhu if (!dev_desc) { 18346651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 18356651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 18366651d4c0SJason Zhu } 18374aa61755SAndy Ye 18384aa61755SAndy Ye OpteeClientApiLibInitialize(); 18394aa61755SAndy Ye 18404aa61755SAndy Ye TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 18414aa61755SAndy Ye 18423251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 18433251364cSHisping Lin TEEC_NONE, 18443251364cSHisping Lin TEEC_NONE, 18453251364cSHisping Lin TEEC_NONE); 18463251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 18473251364cSHisping Lin TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0; 18483251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 18493251364cSHisping Lin TeecOperation.params[0].value.a = 0; 18503251364cSHisping Lin #endif 18513251364cSHisping Lin 18524aa61755SAndy Ye TeecResult = TEEC_OpenSession(&TeecContext, 18534aa61755SAndy Ye &TeecSession, 18544aa61755SAndy Ye TeecUuid, 18554aa61755SAndy Ye TEEC_LOGIN_PUBLIC, 18564aa61755SAndy Ye NULL, 18573251364cSHisping Lin &TeecOperation, 18584aa61755SAndy Ye &ErrorOrigin); 18594aa61755SAndy Ye 18604aa61755SAndy Ye TEEC_SharedMemory SharedMem0 = {0}; 18614aa61755SAndy Ye 18624aa61755SAndy Ye SharedMem0.size = *operation_size; 18634aa61755SAndy Ye SharedMem0.flags = 0; 18644aa61755SAndy Ye 18654aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 18664aa61755SAndy Ye 18674aa61755SAndy Ye memcpy(SharedMem0.buffer, operation_start, SharedMem0.size); 18684aa61755SAndy Ye 18694aa61755SAndy Ye TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 18704aa61755SAndy Ye TeecOperation.params[0].tmpref.size = SharedMem0.size; 18714aa61755SAndy Ye 18724aa61755SAndy Ye TEEC_SharedMemory SharedMem1 = {0}; 18734aa61755SAndy Ye 18744aa61755SAndy Ye SharedMem1.size = *out_len; 18754aa61755SAndy Ye SharedMem1.flags = 0; 18764aa61755SAndy Ye 18774aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 18784aa61755SAndy Ye 18794aa61755SAndy Ye TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 18804aa61755SAndy Ye TeecOperation.params[1].tmpref.size = SharedMem1.size; 18814aa61755SAndy Ye 18824aa61755SAndy Ye TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, 18834aa61755SAndy Ye TEEC_MEMREF_TEMP_INOUT, 18844aa61755SAndy Ye TEEC_NONE, 18854aa61755SAndy Ye TEEC_NONE); 18864aa61755SAndy Ye 18874aa61755SAndy Ye TeecResult = TEEC_InvokeCommand(&TeecSession, 18884aa61755SAndy Ye 145, 18894aa61755SAndy Ye &TeecOperation, 18904aa61755SAndy Ye &ErrorOrigin); 18914aa61755SAndy Ye 18924aa61755SAndy Ye *out_len = TeecOperation.params[1].tmpref.size; 18934aa61755SAndy Ye memcpy(out, SharedMem1.buffer, SharedMem1.size); 18944aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem0); 18954aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem1); 18964aa61755SAndy Ye 18974aa61755SAndy Ye return TeecResult; 18984aa61755SAndy Ye } 18994aa61755SAndy Ye 19004aa61755SAndy Ye uint32_t trusty_attest_set_ca(uint8_t *ca_response, uint32_t *ca_response_size) 19014aa61755SAndy Ye { 19024aa61755SAndy Ye TEEC_Result TeecResult; 19034aa61755SAndy Ye TEEC_Context TeecContext; 19044aa61755SAndy Ye TEEC_Session TeecSession; 19054aa61755SAndy Ye uint32_t ErrorOrigin; 19064aa61755SAndy Ye TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6, 19074aa61755SAndy Ye { 0xa8, 0x69, 0x9c, 0xe6, 19084aa61755SAndy Ye 0x88, 0x6c, 0x5d, 0x5d 19094aa61755SAndy Ye } 19104aa61755SAndy Ye }; 19114aa61755SAndy Ye TEEC_UUID *TeecUuid = &tempuuid; 19124aa61755SAndy Ye TEEC_Operation TeecOperation = {0}; 19133251364cSHisping Lin struct blk_desc *dev_desc; 19143251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 19156651d4c0SJason Zhu if (!dev_desc) { 19166651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 19176651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 19186651d4c0SJason Zhu } 19194aa61755SAndy Ye 19204aa61755SAndy Ye TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 19214aa61755SAndy Ye 19223251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 19233251364cSHisping Lin TEEC_NONE, 19243251364cSHisping Lin TEEC_NONE, 19253251364cSHisping Lin TEEC_NONE); 19263251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 19273251364cSHisping Lin TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0; 19283251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 19293251364cSHisping Lin TeecOperation.params[0].value.a = 0; 19303251364cSHisping Lin #endif 19313251364cSHisping Lin 19324aa61755SAndy Ye TeecResult = TEEC_OpenSession(&TeecContext, 19334aa61755SAndy Ye &TeecSession, 19344aa61755SAndy Ye TeecUuid, 19354aa61755SAndy Ye TEEC_LOGIN_PUBLIC, 19364aa61755SAndy Ye NULL, 19373251364cSHisping Lin &TeecOperation, 19384aa61755SAndy Ye &ErrorOrigin); 19394aa61755SAndy Ye 19404aa61755SAndy Ye TEEC_SharedMemory SharedMem0 = {0}; 19414aa61755SAndy Ye 19424aa61755SAndy Ye SharedMem0.size = *ca_response_size; 19434aa61755SAndy Ye SharedMem0.flags = 0; 19444aa61755SAndy Ye 19454aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 19464aa61755SAndy Ye 19474aa61755SAndy Ye memcpy(SharedMem0.buffer, ca_response, SharedMem0.size); 19484aa61755SAndy Ye 19494aa61755SAndy Ye TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 19504aa61755SAndy Ye TeecOperation.params[0].tmpref.size = SharedMem0.size; 19514aa61755SAndy Ye 19524aa61755SAndy Ye TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, 19534aa61755SAndy Ye TEEC_NONE, 19544aa61755SAndy Ye TEEC_NONE, 19554aa61755SAndy Ye TEEC_NONE); 19564aa61755SAndy Ye 19574aa61755SAndy Ye TeecResult = TEEC_InvokeCommand(&TeecSession, 19584aa61755SAndy Ye 146, 19594aa61755SAndy Ye &TeecOperation, 19604aa61755SAndy Ye &ErrorOrigin); 19614aa61755SAndy Ye 19624aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem0); 19634aa61755SAndy Ye 19644aa61755SAndy Ye TEEC_CloseSession(&TeecSession); 19654aa61755SAndy Ye TeecResult = TEEC_FinalizeContext(&TeecContext); 19664aa61755SAndy Ye 19674aa61755SAndy Ye return TeecResult; 19684aa61755SAndy Ye } 196978ef5fbdSqiujian 197078ef5fbdSqiujian TEEC_Result trusty_write_oem_unlock(uint8_t unlock) 197178ef5fbdSqiujian { 197278ef5fbdSqiujian char *file = "oem.unlock"; 197378ef5fbdSqiujian TEEC_Result ret; 197478ef5fbdSqiujian 197578ef5fbdSqiujian ret = write_to_keymaster((uint8_t *)file, strlen(file), 197678ef5fbdSqiujian (uint8_t *)&unlock, 1); 197778ef5fbdSqiujian return ret; 197878ef5fbdSqiujian } 197978ef5fbdSqiujian 198078ef5fbdSqiujian TEEC_Result trusty_read_oem_unlock(uint8_t *unlock) 198178ef5fbdSqiujian { 198278ef5fbdSqiujian char *file = "oem.unlock"; 198378ef5fbdSqiujian TEEC_Result ret; 198478ef5fbdSqiujian 198578ef5fbdSqiujian ret = read_from_keymaster((uint8_t *)file, strlen(file), 198678ef5fbdSqiujian unlock, 1); 198778ef5fbdSqiujian 198878ef5fbdSqiujian if (ret == TEE_ERROR_ITEM_NOT_FOUND) { 198978ef5fbdSqiujian debug("init oem unlock status 0"); 199078ef5fbdSqiujian ret = trusty_write_oem_unlock(0); 199178ef5fbdSqiujian } 199278ef5fbdSqiujian 199378ef5fbdSqiujian return ret; 199478ef5fbdSqiujian } 1995