xref: /rk3399_rockchip-uboot/cmd/optee.c (revision 4454e90b43786bac3a0d4c3bfddeafddf794d6c0)
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 	OpteeClientApiLibInitialize();
34 
35 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
36 
37 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
38 						    TEEC_NONE,
39 						    TEEC_NONE,
40 						    TEEC_NONE);
41 	/*0 nand or emmc "security" partition , 1 rpmb*/
42 	TeecOperation.params[0].value.a =
43 		(dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0;
44 
45 	TeecResult = TEEC_OpenSession(&TeecContext,
46 				      &TeecSession,
47 				      TeecUuid,
48 				      TEEC_LOGIN_PUBLIC,
49 				      NULL,
50 				      &TeecOperation,
51 				      &ErrorOrigin);
52 	if (TeecResult != TEEC_SUCCESS) {
53 		printf("%s TEEC_OpenSession fail!\n", __func__);
54 		return -1;
55 	}
56 
57 	TEEC_SharedMemory SharedMem0 = {0};
58 
59 	SharedMem0.size = sizeof("filename_test_secure_storage_default");
60 	SharedMem0.flags = 0;
61 
62 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
63 	if (TeecResult != TEEC_SUCCESS) {
64 		printf("%s TEEC_AllocateSharedMemory fail!\n", __func__);
65 		return -1;
66 	}
67 
68 	memcpy(SharedMem0.buffer,
69 	       "filename_test_secure_storage_default",
70 	       SharedMem0.size);
71 
72 	TEEC_SharedMemory SharedMem1 = {0};
73 
74 	SharedMem1.size = 1024 * 8;
75 	SharedMem1.flags = 0;
76 
77 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
78 	if (TeecResult != TEEC_SUCCESS) {
79 		printf("%s TEEC_AllocateSharedMemory fail!\n", __func__);
80 		return -1;
81 	}
82 
83 	memset(SharedMem1.buffer, 'a', SharedMem1.size);
84 
85 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
86 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
87 
88 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
89 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
90 
91 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
92 						    TEEC_MEMREF_TEMP_INOUT,
93 						    TEEC_NONE,
94 						    TEEC_NONE);
95 
96 	TeecResult = TEEC_InvokeCommand(&TeecSession,//write data
97 					1,
98 					&TeecOperation,
99 					&ErrorOrigin);
100 	if (TeecResult != TEEC_SUCCESS) {
101 		printf("%s TEEC_InvokeCommand fail!\n", __func__);
102 		return -1;
103 	}
104 
105 	TEEC_SharedMemory SharedMem2 = {0};
106 
107 	SharedMem2.size = 1024 * 8;
108 	SharedMem2.flags = 0;
109 
110 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem2);
111 	if (TeecResult != TEEC_SUCCESS) {
112 		printf("%s TEEC_AllocateSharedMemory fail!\n", __func__);
113 		return -1;
114 	}
115 
116 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
117 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
118 
119 	TeecOperation.params[1].tmpref.buffer = SharedMem2.buffer;
120 	TeecOperation.params[1].tmpref.size = SharedMem2.size;
121 
122 	TeecResult = TEEC_InvokeCommand(&TeecSession,//read data
123 					0,
124 					&TeecOperation,
125 					&ErrorOrigin);
126 	if (TeecResult != TEEC_SUCCESS) {
127 		printf("%s TEEC_InvokeCommand fail!\n", __func__);
128 		return -1;
129 	}
130 	if (memcmp(SharedMem1.buffer, SharedMem2.buffer,
131 	    SharedMem1.size) != 0) {
132 		printf("error! %s read not equal to write!\n", __func__);
133 		return -1;
134 	}
135 
136 	TEEC_ReleaseSharedMemory(&SharedMem0);
137 	TEEC_ReleaseSharedMemory(&SharedMem1);
138 	TEEC_ReleaseSharedMemory(&SharedMem2);
139 
140 	TEEC_CloseSession(&TeecSession);
141 
142 	TEEC_FinalizeContext(&TeecContext);
143 
144 	debug("%s end\n", __func__);
145 	return 0;
146 }
147 
148 int test_secure_storage_security_partition(void)
149 {
150 	TEEC_Result TeecResult;
151 	TEEC_Context TeecContext;
152 	TEEC_Session TeecSession;
153 	uint32_t ErrorOrigin;
154 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
155 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
156 	TEEC_UUID *TeecUuid = &tempuuid;
157 	TEEC_Operation TeecOperation = {0};
158 	struct blk_desc *dev_desc;
159 
160 	dev_desc = rockchip_get_bootdev();
161 	if (!dev_desc) {
162 		printf("%s: dev_desc is NULL!\n", __func__);
163 		return -1;
164 	}
165 
166 	debug("%s start\n", __func__);
167 	OpteeClientApiLibInitialize();
168 
169 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
170 
171 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
172 						    TEEC_NONE,
173 						    TEEC_NONE,
174 						    TEEC_NONE);
175 	/*0 nand or emmc "security" partition , 1 rpmb*/
176 	TeecOperation.params[0].value.a = 0;//use security partition
177 
178 	TeecResult = TEEC_OpenSession(&TeecContext,
179 				      &TeecSession,
180 				      TeecUuid,
181 				      TEEC_LOGIN_PUBLIC,
182 				      NULL,
183 				      &TeecOperation,
184 				      &ErrorOrigin);
185 	if (TeecResult != TEEC_SUCCESS) {
186 		printf("%s TEEC_OpenSession fail!\n", __func__);
187 		return -1;
188 	}
189 
190 	TEEC_SharedMemory SharedMem0 = {0};
191 
192 	SharedMem0.size = sizeof("filename_test_secure_storage_security_partition");
193 	SharedMem0.flags = 0;
194 
195 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
196 	if (TeecResult != TEEC_SUCCESS) {
197 		printf("%s TEEC_AllocateSharedMemory fail!\n", __func__);
198 		return -1;
199 	}
200 
201 	memcpy(SharedMem0.buffer,
202 	       "filename_test_secure_storage_security_partition",
203 	       SharedMem0.size);
204 
205 	TEEC_SharedMemory SharedMem1 = {0};
206 
207 	SharedMem1.size = 1024 * 8;
208 	SharedMem1.flags = 0;
209 
210 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
211 	if (TeecResult != TEEC_SUCCESS) {
212 		printf("%s TEEC_AllocateSharedMemory fail!\n", __func__);
213 		return -1;
214 	}
215 
216 	memset(SharedMem1.buffer, 'b', SharedMem1.size);
217 
218 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
219 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
220 
221 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
222 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
223 
224 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
225 						    TEEC_MEMREF_TEMP_INOUT,
226 						    TEEC_NONE,
227 						    TEEC_NONE);
228 
229 	TeecResult = TEEC_InvokeCommand(&TeecSession,//write data
230 					1,
231 					&TeecOperation,
232 					&ErrorOrigin);
233 	if (TeecResult != TEEC_SUCCESS) {
234 		printf("%s TEEC_InvokeCommand fail!\n", __func__);
235 		return -1;
236 	}
237 
238 	TEEC_SharedMemory SharedMem2 = {0};
239 
240 	SharedMem2.size = 1024 * 8;
241 	SharedMem2.flags = 0;
242 
243 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem2);
244 	if (TeecResult != TEEC_SUCCESS) {
245 		printf("%s TEEC_AllocateSharedMemory fail!\n", __func__);
246 		return -1;
247 	}
248 
249 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
250 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
251 
252 	TeecOperation.params[1].tmpref.buffer = SharedMem2.buffer;
253 	TeecOperation.params[1].tmpref.size = SharedMem2.size;
254 
255 	TeecResult = TEEC_InvokeCommand(&TeecSession,//read data
256 					0,
257 					&TeecOperation,
258 					&ErrorOrigin);
259 	if (TeecResult != TEEC_SUCCESS) {
260 		printf("%s TEEC_InvokeCommand fail!\n", __func__);
261 		return -1;
262 	}
263 	if (memcmp(SharedMem1.buffer, SharedMem2.buffer,
264 	    SharedMem1.size) != 0) {
265 		printf("error! %s read not equal to write!\n", __func__);
266 		return -1;
267 	}
268 
269 	TEEC_ReleaseSharedMemory(&SharedMem0);
270 	TEEC_ReleaseSharedMemory(&SharedMem1);
271 	TEEC_ReleaseSharedMemory(&SharedMem2);
272 
273 	TEEC_CloseSession(&TeecSession);
274 
275 	TEEC_FinalizeContext(&TeecContext);
276 
277 	debug("%s end\n", __func__);
278 	return 0;
279 }
280