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