xref: /OK3568_Linux_fs/u-boot/cmd/optee.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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