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