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