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