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