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