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