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