1df99e580SHisping Lin /* SPDX-License-Identifier: GPL-2.0+ 2df99e580SHisping Lin * 3df99e580SHisping Lin * Copyright 2019, Rockchip Electronics Co., Ltd 4df99e580SHisping Lin * 5df99e580SHisping Lin */ 6df99e580SHisping Lin 7df99e580SHisping Lin #include <common.h> 8df99e580SHisping Lin #include <optee_include/OpteeClientApiLib.h> 9df99e580SHisping Lin #include <optee_include/tee_client_api.h> 10df99e580SHisping Lin #include <optee_include/tee_api_defines.h> 11df99e580SHisping Lin #include <boot_rkimg.h> 12df99e580SHisping Lin #include <stdlib.h> 13df99e580SHisping Lin 14df99e580SHisping Lin int test_secure_storage_default(void) 15df99e580SHisping Lin { 16df99e580SHisping Lin TEEC_Result TeecResult; 17df99e580SHisping Lin TEEC_Context TeecContext; 18df99e580SHisping Lin TEEC_Session TeecSession; 19df99e580SHisping Lin uint32_t ErrorOrigin; 20df99e580SHisping Lin TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 21df99e580SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 22df99e580SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 23df99e580SHisping Lin TEEC_Operation TeecOperation = {0}; 24df99e580SHisping Lin struct blk_desc *dev_desc; 25df99e580SHisping Lin 26df99e580SHisping Lin dev_desc = rockchip_get_bootdev(); 27df99e580SHisping Lin if (!dev_desc) { 28df99e580SHisping Lin printf("%s: dev_desc is NULL!\n", __func__); 29df99e580SHisping Lin return -1; 30df99e580SHisping Lin } 31df99e580SHisping Lin 32df99e580SHisping Lin debug("%s start\n", __func__); 33*f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 34*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 35*f4e1db95SHisping Lin return -1; 36df99e580SHisping Lin 37df99e580SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 38*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 39*f4e1db95SHisping Lin return -1; 40df99e580SHisping Lin 41df99e580SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 42df99e580SHisping Lin TEEC_NONE, 43df99e580SHisping Lin TEEC_NONE, 44df99e580SHisping Lin TEEC_NONE); 45df99e580SHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 46df99e580SHisping Lin TeecOperation.params[0].value.a = 47df99e580SHisping Lin (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0; 48df99e580SHisping Lin 49df99e580SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 50df99e580SHisping Lin &TeecSession, 51df99e580SHisping Lin TeecUuid, 52df99e580SHisping Lin TEEC_LOGIN_PUBLIC, 53df99e580SHisping Lin NULL, 54df99e580SHisping Lin &TeecOperation, 55df99e580SHisping Lin &ErrorOrigin); 56df99e580SHisping Lin if (TeecResult != TEEC_SUCCESS) { 57df99e580SHisping Lin printf("%s TEEC_OpenSession fail!\n", __func__); 58df99e580SHisping Lin return -1; 59df99e580SHisping Lin } 60df99e580SHisping Lin 61df99e580SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 62df99e580SHisping Lin 63df99e580SHisping Lin SharedMem0.size = sizeof("filename_test_secure_storage_default"); 64df99e580SHisping Lin SharedMem0.flags = 0; 65df99e580SHisping Lin 66df99e580SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 67df99e580SHisping Lin if (TeecResult != TEEC_SUCCESS) { 68df99e580SHisping Lin printf("%s TEEC_AllocateSharedMemory fail!\n", __func__); 69df99e580SHisping Lin return -1; 70df99e580SHisping Lin } 71df99e580SHisping Lin 72df99e580SHisping Lin memcpy(SharedMem0.buffer, 73df99e580SHisping Lin "filename_test_secure_storage_default", 74df99e580SHisping Lin SharedMem0.size); 75df99e580SHisping Lin 76df99e580SHisping Lin TEEC_SharedMemory SharedMem1 = {0}; 77df99e580SHisping Lin 78df99e580SHisping Lin SharedMem1.size = 1024 * 8; 79df99e580SHisping Lin SharedMem1.flags = 0; 80df99e580SHisping Lin 81df99e580SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 82df99e580SHisping Lin if (TeecResult != TEEC_SUCCESS) { 83df99e580SHisping Lin printf("%s TEEC_AllocateSharedMemory fail!\n", __func__); 84df99e580SHisping Lin return -1; 85df99e580SHisping Lin } 86df99e580SHisping Lin 87df99e580SHisping Lin memset(SharedMem1.buffer, 'a', SharedMem1.size); 88df99e580SHisping Lin 89df99e580SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 90df99e580SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 91df99e580SHisping Lin 92df99e580SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 93df99e580SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem1.size; 94df99e580SHisping Lin 95df99e580SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 96df99e580SHisping Lin TEEC_MEMREF_TEMP_INOUT, 97df99e580SHisping Lin TEEC_NONE, 98df99e580SHisping Lin TEEC_NONE); 99df99e580SHisping Lin 100df99e580SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession,//write data 101df99e580SHisping Lin 1, 102df99e580SHisping Lin &TeecOperation, 103df99e580SHisping Lin &ErrorOrigin); 104df99e580SHisping Lin if (TeecResult != TEEC_SUCCESS) { 105df99e580SHisping Lin printf("%s TEEC_InvokeCommand fail!\n", __func__); 106df99e580SHisping Lin return -1; 107df99e580SHisping Lin } 108df99e580SHisping Lin 109df99e580SHisping Lin TEEC_SharedMemory SharedMem2 = {0}; 110df99e580SHisping Lin 111df99e580SHisping Lin SharedMem2.size = 1024 * 8; 112df99e580SHisping Lin SharedMem2.flags = 0; 113df99e580SHisping Lin 114df99e580SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem2); 115df99e580SHisping Lin if (TeecResult != TEEC_SUCCESS) { 116df99e580SHisping Lin printf("%s TEEC_AllocateSharedMemory fail!\n", __func__); 117df99e580SHisping Lin return -1; 118df99e580SHisping Lin } 119df99e580SHisping Lin 120df99e580SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 121df99e580SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 122df99e580SHisping Lin 123df99e580SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem2.buffer; 124df99e580SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem2.size; 125df99e580SHisping Lin 126df99e580SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession,//read data 127df99e580SHisping Lin 0, 128df99e580SHisping Lin &TeecOperation, 129df99e580SHisping Lin &ErrorOrigin); 130df99e580SHisping Lin if (TeecResult != TEEC_SUCCESS) { 131df99e580SHisping Lin printf("%s TEEC_InvokeCommand fail!\n", __func__); 132df99e580SHisping Lin return -1; 133df99e580SHisping Lin } 134df99e580SHisping Lin if (memcmp(SharedMem1.buffer, SharedMem2.buffer, 135df99e580SHisping Lin SharedMem1.size) != 0) { 136df99e580SHisping Lin printf("error! %s read not equal to write!\n", __func__); 137df99e580SHisping Lin return -1; 138df99e580SHisping Lin } 139df99e580SHisping Lin 140df99e580SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 141df99e580SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem1); 142df99e580SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem2); 143df99e580SHisping Lin 144df99e580SHisping Lin TEEC_CloseSession(&TeecSession); 145df99e580SHisping Lin 146df99e580SHisping Lin TEEC_FinalizeContext(&TeecContext); 147df99e580SHisping Lin 148df99e580SHisping Lin debug("%s end\n", __func__); 149df99e580SHisping Lin return 0; 150df99e580SHisping Lin } 151df99e580SHisping Lin 152df99e580SHisping Lin int test_secure_storage_security_partition(void) 153df99e580SHisping Lin { 154df99e580SHisping Lin TEEC_Result TeecResult; 155df99e580SHisping Lin TEEC_Context TeecContext; 156df99e580SHisping Lin TEEC_Session TeecSession; 157df99e580SHisping Lin uint32_t ErrorOrigin; 158df99e580SHisping Lin TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 159df99e580SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 160df99e580SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 161df99e580SHisping Lin TEEC_Operation TeecOperation = {0}; 162df99e580SHisping Lin struct blk_desc *dev_desc; 163df99e580SHisping Lin 164df99e580SHisping Lin dev_desc = rockchip_get_bootdev(); 165df99e580SHisping Lin if (!dev_desc) { 166df99e580SHisping Lin printf("%s: dev_desc is NULL!\n", __func__); 167df99e580SHisping Lin return -1; 168df99e580SHisping Lin } 169df99e580SHisping Lin 170df99e580SHisping Lin debug("%s start\n", __func__); 171*f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 172*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 173*f4e1db95SHisping Lin return -1; 174df99e580SHisping Lin 175df99e580SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 176*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 177*f4e1db95SHisping Lin return -1; 178df99e580SHisping Lin 179df99e580SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 180df99e580SHisping Lin TEEC_NONE, 181df99e580SHisping Lin TEEC_NONE, 182df99e580SHisping Lin TEEC_NONE); 183df99e580SHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 184df99e580SHisping Lin TeecOperation.params[0].value.a = 0;//use security partition 185df99e580SHisping Lin 186df99e580SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 187df99e580SHisping Lin &TeecSession, 188df99e580SHisping Lin TeecUuid, 189df99e580SHisping Lin TEEC_LOGIN_PUBLIC, 190df99e580SHisping Lin NULL, 191df99e580SHisping Lin &TeecOperation, 192df99e580SHisping Lin &ErrorOrigin); 193df99e580SHisping Lin if (TeecResult != TEEC_SUCCESS) { 194df99e580SHisping Lin printf("%s TEEC_OpenSession fail!\n", __func__); 195df99e580SHisping Lin return -1; 196df99e580SHisping Lin } 197df99e580SHisping Lin 198df99e580SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 199df99e580SHisping Lin 200df99e580SHisping Lin SharedMem0.size = sizeof("filename_test_secure_storage_security_partition"); 201df99e580SHisping Lin SharedMem0.flags = 0; 202df99e580SHisping Lin 203df99e580SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 204df99e580SHisping Lin if (TeecResult != TEEC_SUCCESS) { 205df99e580SHisping Lin printf("%s TEEC_AllocateSharedMemory fail!\n", __func__); 206df99e580SHisping Lin return -1; 207df99e580SHisping Lin } 208df99e580SHisping Lin 209df99e580SHisping Lin memcpy(SharedMem0.buffer, 210df99e580SHisping Lin "filename_test_secure_storage_security_partition", 211df99e580SHisping Lin SharedMem0.size); 212df99e580SHisping Lin 213df99e580SHisping Lin TEEC_SharedMemory SharedMem1 = {0}; 214df99e580SHisping Lin 215df99e580SHisping Lin SharedMem1.size = 1024 * 8; 216df99e580SHisping Lin SharedMem1.flags = 0; 217df99e580SHisping Lin 218df99e580SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 219df99e580SHisping Lin if (TeecResult != TEEC_SUCCESS) { 220df99e580SHisping Lin printf("%s TEEC_AllocateSharedMemory fail!\n", __func__); 221df99e580SHisping Lin return -1; 222df99e580SHisping Lin } 223df99e580SHisping Lin 224df99e580SHisping Lin memset(SharedMem1.buffer, 'b', SharedMem1.size); 225df99e580SHisping Lin 226df99e580SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 227df99e580SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 228df99e580SHisping Lin 229df99e580SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 230df99e580SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem1.size; 231df99e580SHisping Lin 232df99e580SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 233df99e580SHisping Lin TEEC_MEMREF_TEMP_INOUT, 234df99e580SHisping Lin TEEC_NONE, 235df99e580SHisping Lin TEEC_NONE); 236df99e580SHisping Lin 237df99e580SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession,//write data 238df99e580SHisping Lin 1, 239df99e580SHisping Lin &TeecOperation, 240df99e580SHisping Lin &ErrorOrigin); 241df99e580SHisping Lin if (TeecResult != TEEC_SUCCESS) { 242df99e580SHisping Lin printf("%s TEEC_InvokeCommand fail!\n", __func__); 243df99e580SHisping Lin return -1; 244df99e580SHisping Lin } 245df99e580SHisping Lin 246df99e580SHisping Lin TEEC_SharedMemory SharedMem2 = {0}; 247df99e580SHisping Lin 248df99e580SHisping Lin SharedMem2.size = 1024 * 8; 249df99e580SHisping Lin SharedMem2.flags = 0; 250df99e580SHisping Lin 251df99e580SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem2); 252df99e580SHisping Lin if (TeecResult != TEEC_SUCCESS) { 253df99e580SHisping Lin printf("%s TEEC_AllocateSharedMemory fail!\n", __func__); 254df99e580SHisping Lin return -1; 255df99e580SHisping Lin } 256df99e580SHisping Lin 257df99e580SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 258df99e580SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 259df99e580SHisping Lin 260df99e580SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem2.buffer; 261df99e580SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem2.size; 262df99e580SHisping Lin 263df99e580SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession,//read data 264df99e580SHisping Lin 0, 265df99e580SHisping Lin &TeecOperation, 266df99e580SHisping Lin &ErrorOrigin); 267df99e580SHisping Lin if (TeecResult != TEEC_SUCCESS) { 268df99e580SHisping Lin printf("%s TEEC_InvokeCommand fail!\n", __func__); 269df99e580SHisping Lin return -1; 270df99e580SHisping Lin } 271df99e580SHisping Lin if (memcmp(SharedMem1.buffer, SharedMem2.buffer, 272df99e580SHisping Lin SharedMem1.size) != 0) { 273df99e580SHisping Lin printf("error! %s read not equal to write!\n", __func__); 274df99e580SHisping Lin return -1; 275df99e580SHisping Lin } 276df99e580SHisping Lin 277df99e580SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 278df99e580SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem1); 279df99e580SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem2); 280df99e580SHisping Lin 281df99e580SHisping Lin TEEC_CloseSession(&TeecSession); 282df99e580SHisping Lin 283df99e580SHisping Lin TEEC_FinalizeContext(&TeecContext); 284df99e580SHisping Lin 285df99e580SHisping Lin debug("%s end\n", __func__); 286df99e580SHisping Lin return 0; 287df99e580SHisping Lin } 288