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