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