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