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
test_secure_storage_default(void)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
test_secure_storage_security_partition(void)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