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