xref: /rk3399_rockchip-uboot/cmd/optee.c (revision 28386b6dc69ba6ece0345798f08ef0aed9fb0691)
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