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