xref: /rk3399_rockchip-uboot/lib/optee_clientApi/OpteeClientInterface.c (revision 7504da7452a5213528b0ee492c2cb336bc2bc0ae)
1ae8ec5e1SHisping Lin /*
2ae8ec5e1SHisping Lin  * Copyright 2017, Rockchip Electronics Co., Ltd
3ae8ec5e1SHisping Lin  * hisping lin, <hisping.lin@rock-chips.com>
4ae8ec5e1SHisping Lin  *
5ae8ec5e1SHisping Lin  * SPDX-License-Identifier:	GPL-2.0+
6ae8ec5e1SHisping Lin  */
7ae8ec5e1SHisping Lin 
8ae8ec5e1SHisping Lin #include <common.h>
9ae8ec5e1SHisping Lin #include <optee_include/OpteeClientApiLib.h>
10ae8ec5e1SHisping Lin #include <optee_include/tee_client_api.h>
1178ef5fbdSqiujian #include <optee_include/tee_api_defines.h>
123251364cSHisping Lin #include <boot_rkimg.h>
13a7df4868Stony.xu #include <stdlib.h>
141e8c0e44STony Xu #include <attestation_key.h>
15a7df4868Stony.xu 
16a7df4868Stony.xu #define	BOOT_FROM_EMMC	(1 << 1)
17c7de5349SHisping Lin #define STORAGE_CMD_READ_ATTRIBUTE_HASH		0
18c7de5349SHisping Lin #define STORAGE_CMD_WRITE_ATTRIBUTE_HASH	1
19c7de5349SHisping Lin #define STORAGE_CMD_UBOOT_END_OTP		2
20c7de5349SHisping Lin #define STORAGE_CMD_READ_VBOOTKEY_HASH		3
21c7de5349SHisping Lin #define STORAGE_CMD_WRITE_VBOOTKEY_HASH		4
22c7de5349SHisping Lin #define STORAGE_CMD_READ_ENABLE_FLAG		5
231ef63c75SHisping Lin #define STORAGE_CMD_WRITE_TA_ENCRYPTION_KEY	9
24fbf29bfbSHisping Lin #define STORAGE_CMD_CHECK_SECURITY_LEVEL_FLAG	10
25f39d4289SHisping Lin #define STORAGE_CMD_WRITE_OEM_HUK		11
26ae8ec5e1SHisping Lin 
27ae8ec5e1SHisping Lin static uint8_t b2hs_add_base(uint8_t in)
28ae8ec5e1SHisping Lin {
29ae8ec5e1SHisping Lin 	if (in > 9)
30ae8ec5e1SHisping Lin 		return in + 55;
31ae8ec5e1SHisping Lin 	else
32ae8ec5e1SHisping Lin 		return in + 48;
33ae8ec5e1SHisping Lin }
34ae8ec5e1SHisping Lin 
35c7de5349SHisping Lin static uint32_t b2hs(uint8_t *b, uint8_t *hs, uint32_t blen, uint32_t hslen)
36ae8ec5e1SHisping Lin {
37ae8ec5e1SHisping Lin 	uint32_t i = 0;
38ae8ec5e1SHisping Lin 
39ae8ec5e1SHisping Lin 	if (blen * 2 + 1 > hslen)
40ae8ec5e1SHisping Lin 		return 0;
41ae8ec5e1SHisping Lin 
42ae8ec5e1SHisping Lin 	for (; i < blen; i++) {
43ae8ec5e1SHisping Lin 		hs[i * 2 + 1] = b2hs_add_base(b[i] & 0xf);
44ae8ec5e1SHisping Lin 		hs[i * 2] = b2hs_add_base(b[i] >> 4);
45ae8ec5e1SHisping Lin 	}
46ae8ec5e1SHisping Lin 	hs[blen * 2] = 0;
47ae8ec5e1SHisping Lin 
48ae8ec5e1SHisping Lin 	return blen * 2;
49ae8ec5e1SHisping Lin }
50ae8ec5e1SHisping Lin 
51c7de5349SHisping Lin static uint32_t trusty_base_write_security_data(char *filename,
52c7de5349SHisping Lin 						uint32_t filename_size,
53c7de5349SHisping Lin 						uint8_t *data,
54c7de5349SHisping Lin 						uint32_t data_size)
55ae8ec5e1SHisping Lin {
56ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
57ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
58ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
59ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
60ae8ec5e1SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
61ae8ec5e1SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
62ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
63ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
643251364cSHisping Lin 	struct blk_desc *dev_desc;
653251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
666651d4c0SJason Zhu 	if (!dev_desc) {
676651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
686651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
696651d4c0SJason Zhu 	}
703251364cSHisping Lin 
71f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
72f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
73f4e1db95SHisping Lin 		return TeecResult;
74ae8ec5e1SHisping Lin 
75ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
76f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
77f4e1db95SHisping Lin 		return TeecResult;
78ae8ec5e1SHisping Lin 
793251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
803251364cSHisping Lin 						    TEEC_NONE,
813251364cSHisping Lin 						    TEEC_NONE,
823251364cSHisping Lin 						    TEEC_NONE);
833251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
84b9a7e756SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)
85b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 1;
86b9a7e756SHisping Lin 	else
87b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 0;
883251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
893251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
903251364cSHisping Lin #endif
913251364cSHisping Lin 
92ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
93ae8ec5e1SHisping Lin 				&TeecSession,
94ae8ec5e1SHisping Lin 				TeecUuid,
95ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
96ae8ec5e1SHisping Lin 				NULL,
973251364cSHisping Lin 				&TeecOperation,
98ae8ec5e1SHisping Lin 				&ErrorOrigin);
99f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
100f4e1db95SHisping Lin 		return TeecResult;
101ae8ec5e1SHisping Lin 
102ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
103ae8ec5e1SHisping Lin 
104c7de5349SHisping Lin 	SharedMem0.size = filename_size;
105ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
106ae8ec5e1SHisping Lin 
107ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
108f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
109f4e1db95SHisping Lin 		goto exit;
110ae8ec5e1SHisping Lin 
111c7de5349SHisping Lin 	memcpy(SharedMem0.buffer, filename, SharedMem0.size);
112ae8ec5e1SHisping Lin 
113ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
114ae8ec5e1SHisping Lin 
115c7de5349SHisping Lin 	SharedMem1.size = data_size;
116c7de5349SHisping Lin 	SharedMem1.flags = 0;
117c7de5349SHisping Lin 
118c7de5349SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
119c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
120c7de5349SHisping Lin 		goto exit;
121c7de5349SHisping Lin 
122c7de5349SHisping Lin 	memcpy(SharedMem1.buffer, data, SharedMem1.size);
123c7de5349SHisping Lin 
124c7de5349SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
125c7de5349SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
126c7de5349SHisping Lin 
127c7de5349SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
128c7de5349SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
129c7de5349SHisping Lin 
130c7de5349SHisping Lin 
131c7de5349SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
132c7de5349SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
133c7de5349SHisping Lin 						TEEC_NONE,
134c7de5349SHisping Lin 						TEEC_NONE);
135c7de5349SHisping Lin 
136c7de5349SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
137c7de5349SHisping Lin 					1,
138c7de5349SHisping Lin 					&TeecOperation,
139c7de5349SHisping Lin 					&ErrorOrigin);
140c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
141c7de5349SHisping Lin 		goto exit;
142c7de5349SHisping Lin exit:
143c7de5349SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
144c7de5349SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
145c7de5349SHisping Lin 	TEEC_CloseSession(&TeecSession);
146c7de5349SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
147c7de5349SHisping Lin 
148c7de5349SHisping Lin 	return TeecResult;
149c7de5349SHisping Lin }
150c7de5349SHisping Lin 
151c7de5349SHisping Lin static uint32_t trusty_base_read_security_data(char *filename,
152c7de5349SHisping Lin 					       uint32_t filename_size,
153c7de5349SHisping Lin 					       uint8_t *data,
154c7de5349SHisping Lin 					       uint32_t data_size)
155c7de5349SHisping Lin {
156c7de5349SHisping Lin 	TEEC_Result TeecResult;
157c7de5349SHisping Lin 	TEEC_Context TeecContext;
158c7de5349SHisping Lin 	TEEC_Session TeecSession;
159c7de5349SHisping Lin 	uint32_t ErrorOrigin;
160c7de5349SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
161c7de5349SHisping Lin 			{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
162c7de5349SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
163c7de5349SHisping Lin 	TEEC_Operation TeecOperation = {0};
164c7de5349SHisping Lin 
165c7de5349SHisping Lin 	struct blk_desc *dev_desc;
166c7de5349SHisping Lin 	dev_desc = rockchip_get_bootdev();
167c7de5349SHisping Lin 	if (!dev_desc) {
168c7de5349SHisping Lin 		printf("%s: dev_desc is NULL!\n", __func__);
169c7de5349SHisping Lin 		return -TEEC_ERROR_GENERIC;
170c7de5349SHisping Lin 	}
171c7de5349SHisping Lin 
172c7de5349SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
173c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
174c7de5349SHisping Lin 		return TeecResult;
175c7de5349SHisping Lin 
176c7de5349SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
177c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
178c7de5349SHisping Lin 		return TeecResult;
179c7de5349SHisping Lin 
180c7de5349SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
181c7de5349SHisping Lin 						TEEC_NONE,
182c7de5349SHisping Lin 						TEEC_NONE,
183c7de5349SHisping Lin 						TEEC_NONE);
184c7de5349SHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
185c7de5349SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)
186c7de5349SHisping Lin 		TeecOperation.params[0].value.a = 1;
187c7de5349SHisping Lin 	else
188c7de5349SHisping Lin 		TeecOperation.params[0].value.a = 0;
189c7de5349SHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
190c7de5349SHisping Lin 	TeecOperation.params[0].value.a = 0;
191c7de5349SHisping Lin #endif
192c7de5349SHisping Lin 
193c7de5349SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
194c7de5349SHisping Lin 				&TeecSession,
195c7de5349SHisping Lin 				TeecUuid,
196c7de5349SHisping Lin 				TEEC_LOGIN_PUBLIC,
197c7de5349SHisping Lin 				NULL,
198c7de5349SHisping Lin 				&TeecOperation,
199c7de5349SHisping Lin 				&ErrorOrigin);
200c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
201c7de5349SHisping Lin 		return TeecResult;
202c7de5349SHisping Lin 
203c7de5349SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
204c7de5349SHisping Lin 
205c7de5349SHisping Lin 	SharedMem0.size = filename_size;
206c7de5349SHisping Lin 	SharedMem0.flags = 0;
207c7de5349SHisping Lin 
208c7de5349SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
209c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
210c7de5349SHisping Lin 		goto exit;
211c7de5349SHisping Lin 
212c7de5349SHisping Lin 	memcpy(SharedMem0.buffer, filename, SharedMem0.size);
213c7de5349SHisping Lin 
214c7de5349SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
215c7de5349SHisping Lin 
216c7de5349SHisping Lin 	SharedMem1.size = data_size;
217ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
218ae8ec5e1SHisping Lin 
219ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
220f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
221f4e1db95SHisping Lin 		goto exit;
222ae8ec5e1SHisping Lin 
223ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
224ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
225ae8ec5e1SHisping Lin 
226ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
227ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
228ae8ec5e1SHisping Lin 
229ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
230ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
231ae8ec5e1SHisping Lin 						TEEC_NONE,
232ae8ec5e1SHisping Lin 						TEEC_NONE);
233ae8ec5e1SHisping Lin 
234ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
235ae8ec5e1SHisping Lin 					0,
236ae8ec5e1SHisping Lin 					&TeecOperation,
237ae8ec5e1SHisping Lin 					&ErrorOrigin);
23846b2a054SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
239c7de5349SHisping Lin 		memcpy(data, SharedMem1.buffer, SharedMem1.size);
240f4e1db95SHisping Lin exit:
241ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
242ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
243ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
24446b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
245ae8ec5e1SHisping Lin 
246ae8ec5e1SHisping Lin 	return TeecResult;
247ae8ec5e1SHisping Lin }
248ae8ec5e1SHisping Lin 
249c7de5349SHisping Lin static uint32_t trusty_base_end_security_data(void)
250c7de5349SHisping Lin {
251c7de5349SHisping Lin 	TEEC_Result TeecResult;
252c7de5349SHisping Lin 	TEEC_Context TeecContext;
253c7de5349SHisping Lin 	TEEC_Session TeecSession;
254c7de5349SHisping Lin 	uint32_t ErrorOrigin;
255c7de5349SHisping Lin 	TEEC_UUID  tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
256c7de5349SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
257c7de5349SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
258c7de5349SHisping Lin 	TEEC_Operation TeecOperation = {0};
259c7de5349SHisping Lin 
260c7de5349SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
261c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
262c7de5349SHisping Lin 		return TeecResult;
263c7de5349SHisping Lin 
264c7de5349SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
265c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
266c7de5349SHisping Lin 		return TeecResult;
267c7de5349SHisping Lin 
268c7de5349SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
269c7de5349SHisping Lin 				&TeecSession,
270c7de5349SHisping Lin 				TeecUuid,
271c7de5349SHisping Lin 				TEEC_LOGIN_PUBLIC,
272c7de5349SHisping Lin 				NULL,
273c7de5349SHisping Lin 				NULL,
274c7de5349SHisping Lin 				&ErrorOrigin);
275c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
276c7de5349SHisping Lin 		return TeecResult;
277c7de5349SHisping Lin 
278c7de5349SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE,
279c7de5349SHisping Lin 						    TEEC_NONE,
280c7de5349SHisping Lin 						    TEEC_NONE,
281c7de5349SHisping Lin 						    TEEC_NONE);
282c7de5349SHisping Lin 
283c7de5349SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
284c7de5349SHisping Lin 					2,
285c7de5349SHisping Lin 					&TeecOperation,
286c7de5349SHisping Lin 					&ErrorOrigin);
287c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
288c7de5349SHisping Lin 		goto exit;
289c7de5349SHisping Lin exit:
290c7de5349SHisping Lin 	TEEC_CloseSession(&TeecSession);
291c7de5349SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
292c7de5349SHisping Lin 
293c7de5349SHisping Lin 	return TeecResult;
294c7de5349SHisping Lin }
295c7de5349SHisping Lin 
296c7de5349SHisping Lin uint32_t trusty_read_rollback_index(uint32_t slot, uint64_t *value)
297c7de5349SHisping Lin {
298c7de5349SHisping Lin 	char hs[9];
299c7de5349SHisping Lin 
300c7de5349SHisping Lin 	b2hs((uint8_t *)&slot, (uint8_t *)hs, 4, 9);
301c7de5349SHisping Lin 
302c7de5349SHisping Lin 	return trusty_base_read_security_data(hs, 8, (uint8_t *)value, 8);
303c7de5349SHisping Lin }
304c7de5349SHisping Lin 
305ae8ec5e1SHisping Lin uint32_t trusty_write_rollback_index(uint32_t slot, uint64_t value)
306ae8ec5e1SHisping Lin {
307c7de5349SHisping Lin 	char hs[9];
3083251364cSHisping Lin 
309c7de5349SHisping Lin 	b2hs((uint8_t *)&slot, (uint8_t *)hs, 4, 9);
310ae8ec5e1SHisping Lin 
311c7de5349SHisping Lin 	return trusty_base_write_security_data(hs, 8, (uint8_t *)&value, 8);
312ae8ec5e1SHisping Lin }
313ae8ec5e1SHisping Lin 
314ae8ec5e1SHisping Lin uint32_t trusty_read_permanent_attributes(uint8_t *attributes, uint32_t size)
315ae8ec5e1SHisping Lin {
316c7de5349SHisping Lin 	return trusty_base_read_security_data("attributes",
317c7de5349SHisping Lin 		sizeof("attributes"), attributes, size);
318ae8ec5e1SHisping Lin }
319ae8ec5e1SHisping Lin 
320ae8ec5e1SHisping Lin uint32_t trusty_write_permanent_attributes(uint8_t *attributes, uint32_t size)
321ae8ec5e1SHisping Lin {
322c7de5349SHisping Lin 	return trusty_base_write_security_data("attributes",
323c7de5349SHisping Lin 		sizeof("attributes"), attributes, size);
3246651d4c0SJason Zhu }
325ae8ec5e1SHisping Lin 
326c7de5349SHisping Lin uint32_t trusty_read_permanent_attributes_flag(uint8_t *attributes)
327c7de5349SHisping Lin {
328c7de5349SHisping Lin 	return trusty_base_read_security_data("attributes_flag",
329c7de5349SHisping Lin 		sizeof("attributes_flag"), attributes, 1);
330c7de5349SHisping Lin }
331ae8ec5e1SHisping Lin 
332c7de5349SHisping Lin uint32_t trusty_write_permanent_attributes_flag(uint8_t attributes)
333c7de5349SHisping Lin {
334c7de5349SHisping Lin 	return trusty_base_write_security_data("attributes_flag",
335c7de5349SHisping Lin 		sizeof("attributes_flag"), &attributes, 1);
336ae8ec5e1SHisping Lin }
337ae8ec5e1SHisping Lin 
338564654ebSJason Zhu uint32_t trusty_read_permanent_attributes_cer(uint8_t *attributes,
339564654ebSJason Zhu 					      uint32_t size)
340564654ebSJason Zhu {
341c7de5349SHisping Lin 	return trusty_base_read_security_data("rsacer",
342c7de5349SHisping Lin 		sizeof("rsacer"), attributes, size);
343564654ebSJason Zhu }
344564654ebSJason Zhu 
345564654ebSJason Zhu uint32_t trusty_write_permanent_attributes_cer(uint8_t *attributes,
346564654ebSJason Zhu 					       uint32_t size)
347564654ebSJason Zhu {
348c7de5349SHisping Lin 	return trusty_base_write_security_data("rsacer",
349c7de5349SHisping Lin 		sizeof("rsacer"), attributes, size);
350564654ebSJason Zhu }
351564654ebSJason Zhu 
352ae8ec5e1SHisping Lin uint32_t trusty_read_lock_state(uint8_t *lock_state)
353ae8ec5e1SHisping Lin {
354c7de5349SHisping Lin 	return trusty_base_read_security_data("lock_state",
355c7de5349SHisping Lin 		sizeof("lock_state"), lock_state, 1);
356ae8ec5e1SHisping Lin }
357ae8ec5e1SHisping Lin 
358ae8ec5e1SHisping Lin uint32_t trusty_write_lock_state(uint8_t lock_state)
359ae8ec5e1SHisping Lin {
360c7de5349SHisping Lin 	return trusty_base_write_security_data("lock_state",
361c7de5349SHisping Lin 		sizeof("lock_state"), &lock_state, 1);
362ae8ec5e1SHisping Lin }
363ae8ec5e1SHisping Lin 
364ae8ec5e1SHisping Lin uint32_t trusty_read_flash_lock_state(uint8_t *flash_lock_state)
365ae8ec5e1SHisping Lin {
366c7de5349SHisping Lin 	return trusty_base_read_security_data("flash_lock_state",
367c7de5349SHisping Lin 		sizeof("flash_lock_state"), flash_lock_state, 1);
368c7de5349SHisping Lin }
369c7de5349SHisping Lin 
370c7de5349SHisping Lin uint32_t trusty_write_flash_lock_state(uint8_t flash_lock_state)
371c7de5349SHisping Lin {
372c7de5349SHisping Lin 	return trusty_base_write_security_data("flash_lock_state",
373c7de5349SHisping Lin 		sizeof("flash_lock_state"), &flash_lock_state, 1);
374c7de5349SHisping Lin }
375c7de5349SHisping Lin 
376c7de5349SHisping Lin static uint32_t trusty_base_end_efuse_or_otp(void)
377c7de5349SHisping Lin {
378ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
379ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
380ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
381ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
382c7de5349SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
383c7de5349SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
384c7de5349SHisping Lin 
385ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
386ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
387ae8ec5e1SHisping Lin 
388f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
389f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
390f4e1db95SHisping Lin 		return TeecResult;
391ae8ec5e1SHisping Lin 
392ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
393f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
394f4e1db95SHisping Lin 		return TeecResult;
395ae8ec5e1SHisping Lin 
396ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
397ae8ec5e1SHisping Lin 				      &TeecSession,
398ae8ec5e1SHisping Lin 				      TeecUuid,
399ae8ec5e1SHisping Lin 				      TEEC_LOGIN_PUBLIC,
400ae8ec5e1SHisping Lin 				      NULL,
401c7de5349SHisping Lin 				      NULL,
402ae8ec5e1SHisping Lin 				      &ErrorOrigin);
403f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
404f4e1db95SHisping Lin 		return TeecResult;
405ae8ec5e1SHisping Lin 
406c7de5349SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE,
407c7de5349SHisping Lin 						    TEEC_NONE,
408ae8ec5e1SHisping Lin 						    TEEC_NONE,
409ae8ec5e1SHisping Lin 						    TEEC_NONE);
410ae8ec5e1SHisping Lin 
411ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
412c7de5349SHisping Lin 					STORAGE_CMD_UBOOT_END_OTP,
413ae8ec5e1SHisping Lin 					&TeecOperation,
414ae8ec5e1SHisping Lin 					&ErrorOrigin);
415c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
416c7de5349SHisping Lin 		goto exit;
417f4e1db95SHisping Lin exit:
418ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
41946b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
420ae8ec5e1SHisping Lin 
421ae8ec5e1SHisping Lin 	return TeecResult;
422ae8ec5e1SHisping Lin }
423ae8ec5e1SHisping Lin 
424c7de5349SHisping Lin static uint32_t trusty_base_efuse_or_otp_operation(uint32_t cmd,
425c7de5349SHisping Lin 						   uint8_t is_write,
426c7de5349SHisping Lin 						   uint32_t *buf,
427c7de5349SHisping Lin 						   uint32_t length)
428ae8ec5e1SHisping Lin {
429ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
430ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
431ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
432ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
433c7de5349SHisping Lin 
434c7de5349SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
435c7de5349SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
436ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
437ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
438ae8ec5e1SHisping Lin 
439f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
440f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
441f4e1db95SHisping Lin 		return TeecResult;
442ae8ec5e1SHisping Lin 
443ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
444f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
445f4e1db95SHisping Lin 		return TeecResult;
446ae8ec5e1SHisping Lin 
447ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
448ae8ec5e1SHisping Lin 				&TeecSession,
449ae8ec5e1SHisping Lin 				TeecUuid,
450ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
451ae8ec5e1SHisping Lin 				NULL,
452c7de5349SHisping Lin 				NULL,
453ae8ec5e1SHisping Lin 				&ErrorOrigin);
454f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
455f4e1db95SHisping Lin 		return TeecResult;
456ae8ec5e1SHisping Lin 
457ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
458ae8ec5e1SHisping Lin 
459c7de5349SHisping Lin 	SharedMem0.size = length * sizeof(uint32_t);
460ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
461ae8ec5e1SHisping Lin 
462ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
463f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
464f4e1db95SHisping Lin 		goto exit;
465ae8ec5e1SHisping Lin 
466ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
467ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
468ae8ec5e1SHisping Lin 
469c7de5349SHisping Lin 	if (is_write) {
470c7de5349SHisping Lin 		memcpy(SharedMem0.buffer, buf, SharedMem0.size);
471ae8ec5e1SHisping Lin 		TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
472c7de5349SHisping Lin 							    TEEC_NONE,
473ae8ec5e1SHisping Lin 							    TEEC_NONE,
474ae8ec5e1SHisping Lin 							    TEEC_NONE);
475ae8ec5e1SHisping Lin 
476c7de5349SHisping Lin 	} else {
477c7de5349SHisping Lin 		TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT,
478c7de5349SHisping Lin 							    TEEC_NONE,
479c7de5349SHisping Lin 							    TEEC_NONE,
480c7de5349SHisping Lin 							    TEEC_NONE);
481c7de5349SHisping Lin 	}
482c7de5349SHisping Lin 
483ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
484c7de5349SHisping Lin 					cmd,
485ae8ec5e1SHisping Lin 					&TeecOperation,
486ae8ec5e1SHisping Lin 					&ErrorOrigin);
487f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
488f4e1db95SHisping Lin 		goto exit;
489c7de5349SHisping Lin 
490c7de5349SHisping Lin 	if (!is_write)
491c7de5349SHisping Lin 		memcpy(buf, SharedMem0.buffer, SharedMem0.size);
492c7de5349SHisping Lin 
493f4e1db95SHisping Lin exit:
494ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
495ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
49646b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
497ae8ec5e1SHisping Lin 
498ae8ec5e1SHisping Lin 	return TeecResult;
499ae8ec5e1SHisping Lin }
500ae8ec5e1SHisping Lin 
5016ef445a4SHisping Lin uint32_t trusty_read_attribute_hash(uint32_t *buf, uint32_t length)
5026ef445a4SHisping Lin {
503c7de5349SHisping Lin 	return trusty_base_efuse_or_otp_operation(STORAGE_CMD_READ_ATTRIBUTE_HASH,
504c7de5349SHisping Lin 						  false, buf, length);
5056ef445a4SHisping Lin }
5066ef445a4SHisping Lin 
5076ef445a4SHisping Lin uint32_t trusty_write_attribute_hash(uint32_t *buf, uint32_t length)
5086ef445a4SHisping Lin {
509c7de5349SHisping Lin 	return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_ATTRIBUTE_HASH,
510c7de5349SHisping Lin 						  true, buf, length);
51116539616SHisping Lin }
51216539616SHisping Lin 
51316539616SHisping Lin uint32_t trusty_notify_optee_uboot_end(void)
51416539616SHisping Lin {
51516539616SHisping Lin 	TEEC_Result res;
516c7de5349SHisping Lin 
517c7de5349SHisping Lin 	res = trusty_base_end_security_data();
518c7de5349SHisping Lin 	res |= trusty_base_end_efuse_or_otp();
51916539616SHisping Lin 	return res;
52016539616SHisping Lin }
5212cd27853SHisping Lin 
5222cd27853SHisping Lin uint32_t trusty_read_vbootkey_hash(uint32_t *buf, uint32_t length)
5232cd27853SHisping Lin {
524c7de5349SHisping Lin 	return trusty_base_efuse_or_otp_operation(STORAGE_CMD_READ_VBOOTKEY_HASH,
525c7de5349SHisping Lin 						  false, buf, length);
5262cd27853SHisping Lin }
527c7de5349SHisping Lin 
5282cd27853SHisping Lin uint32_t trusty_write_vbootkey_hash(uint32_t *buf, uint32_t length)
5292cd27853SHisping Lin {
530c7de5349SHisping Lin 	return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_VBOOTKEY_HASH,
531c7de5349SHisping Lin 						  true, buf, length);
5322cd27853SHisping Lin }
533095e2a82SHisping Lin 
534468df3b2SHisping Lin uint32_t trusty_read_vbootkey_enable_flag(uint8_t *flag)
535468df3b2SHisping Lin {
536468df3b2SHisping Lin 	uint32_t bootflag;
537c7de5349SHisping Lin 	TEEC_Result TeecResult;
538468df3b2SHisping Lin 
539c7de5349SHisping Lin 	TeecResult = trusty_base_efuse_or_otp_operation(STORAGE_CMD_READ_ENABLE_FLAG,
540c7de5349SHisping Lin 							false, &bootflag, 1);
541468df3b2SHisping Lin 
542468df3b2SHisping Lin 	if (TeecResult == TEEC_SUCCESS) {
5430202ee8aSHisping Lin #if defined(CONFIG_ROCKCHIP_RK3288)
5440202ee8aSHisping Lin 		if (bootflag == 0x00000001)
5450202ee8aSHisping Lin 			*flag = 1;
5460202ee8aSHisping Lin #else
547468df3b2SHisping Lin 		if (bootflag == 0x000000FF)
548468df3b2SHisping Lin 			*flag = 1;
5490202ee8aSHisping Lin #endif
550468df3b2SHisping Lin 	}
551095e2a82SHisping Lin 	return TeecResult;
552095e2a82SHisping Lin }
5534aa61755SAndy Ye 
5541ef63c75SHisping Lin uint32_t trusty_write_ta_encryption_key(uint32_t *buf, uint32_t length)
5551ef63c75SHisping Lin {
5561ef63c75SHisping Lin 	return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_TA_ENCRYPTION_KEY,
5571ef63c75SHisping Lin 						  true, buf, length);
5581ef63c75SHisping Lin }
5591ef63c75SHisping Lin 
560fbf29bfbSHisping Lin uint32_t trusty_check_security_level_flag(uint8_t flag)
561fbf29bfbSHisping Lin {
562fbf29bfbSHisping Lin 	uint32_t levelflag;
563fbf29bfbSHisping Lin 
564fbf29bfbSHisping Lin 	levelflag = flag;
565fbf29bfbSHisping Lin 	return trusty_base_efuse_or_otp_operation(STORAGE_CMD_CHECK_SECURITY_LEVEL_FLAG,
566fbf29bfbSHisping Lin 						  true, &levelflag, 1);
567fbf29bfbSHisping Lin }
568fbf29bfbSHisping Lin 
569f39d4289SHisping Lin uint32_t trusty_write_oem_huk(uint32_t *buf, uint32_t length)
570f39d4289SHisping Lin {
571f39d4289SHisping Lin 	return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_OEM_HUK,
572f39d4289SHisping Lin 						  true, buf, length);
573f39d4289SHisping Lin }
574f39d4289SHisping Lin 
575*7504da74SHisping Lin void trusty_select_security_level(void)
576*7504da74SHisping Lin {
577*7504da74SHisping Lin #if (CONFIG_OPTEE_SECURITY_LEVEL > 0)
578*7504da74SHisping Lin 	TEEC_Result TeecResult;
579*7504da74SHisping Lin 
580*7504da74SHisping Lin 	TeecResult = trusty_check_security_level_flag(CONFIG_OPTEE_SECURITY_LEVEL);
581*7504da74SHisping Lin 	if (TeecResult == TEE_ERROR_CANCEL) {
582*7504da74SHisping Lin 		run_command("download", 0);
583*7504da74SHisping Lin 		return;
584*7504da74SHisping Lin 	}
585*7504da74SHisping Lin 
586*7504da74SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
587*7504da74SHisping Lin 		debug("optee select security level success!");
588*7504da74SHisping Lin 	else
589*7504da74SHisping Lin 		panic("optee select security level fail!");
590*7504da74SHisping Lin 
591*7504da74SHisping Lin 	return;
592*7504da74SHisping Lin #endif
593*7504da74SHisping Lin }
594*7504da74SHisping Lin 
5954aa61755SAndy Ye uint32_t trusty_attest_dh(uint8_t *dh, uint32_t *dh_size)
5964aa61755SAndy Ye {
5974aa61755SAndy Ye 	TEEC_Result TeecResult;
5984aa61755SAndy Ye 	TEEC_Context TeecContext;
5994aa61755SAndy Ye 	TEEC_Session TeecSession;
6004aa61755SAndy Ye 	uint32_t ErrorOrigin;
6014aa61755SAndy Ye 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
6024aa61755SAndy Ye 				{ 0xa8, 0x69, 0x9c, 0xe6,
6034aa61755SAndy Ye 				  0x88, 0x6c, 0x5d, 0x5d
6044aa61755SAndy Ye 				}
6054aa61755SAndy Ye 			     };
6064aa61755SAndy Ye 	TEEC_UUID *TeecUuid = &tempuuid;
6074aa61755SAndy Ye 	TEEC_Operation TeecOperation = {0};
6083251364cSHisping Lin 	struct blk_desc *dev_desc;
6093251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
6106651d4c0SJason Zhu 	if (!dev_desc) {
6116651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
6126651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
6136651d4c0SJason Zhu 	}
6144aa61755SAndy Ye 
615f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
616f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
617f4e1db95SHisping Lin 		return TeecResult;
6184aa61755SAndy Ye 
6194aa61755SAndy Ye 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
620f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
621f4e1db95SHisping Lin 		return TeecResult;
6224aa61755SAndy Ye 
6233251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
6243251364cSHisping Lin 						TEEC_NONE,
6253251364cSHisping Lin 						TEEC_NONE,
6263251364cSHisping Lin 						TEEC_NONE);
6273251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
628b9a7e756SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)
629b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 1;
630b9a7e756SHisping Lin 	else
631b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 0;
632b9a7e756SHisping Lin 
6333251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
6343251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
6353251364cSHisping Lin #endif
6363251364cSHisping Lin 
6374aa61755SAndy Ye 	TeecResult = TEEC_OpenSession(&TeecContext,
6384aa61755SAndy Ye 				      &TeecSession,
6394aa61755SAndy Ye 				      TeecUuid,
6404aa61755SAndy Ye 				      TEEC_LOGIN_PUBLIC,
6414aa61755SAndy Ye 				      NULL,
6423251364cSHisping Lin 					&TeecOperation,
6434aa61755SAndy Ye 				      &ErrorOrigin);
644f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
645f4e1db95SHisping Lin 		return TeecResult;
6464aa61755SAndy Ye 
6474aa61755SAndy Ye 	TEEC_SharedMemory SharedMem0 = {0};
6484aa61755SAndy Ye 
6494aa61755SAndy Ye 	SharedMem0.size = *dh_size;
6504aa61755SAndy Ye 	SharedMem0.flags = 0;
6514aa61755SAndy Ye 
6524aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
653f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
654f4e1db95SHisping Lin 		goto exit;
6554aa61755SAndy Ye 
6564aa61755SAndy Ye 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
6574aa61755SAndy Ye 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
6584aa61755SAndy Ye 
6594aa61755SAndy Ye 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT,
6604aa61755SAndy Ye 						    TEEC_NONE,
6614aa61755SAndy Ye 						    TEEC_NONE,
6624aa61755SAndy Ye 						    TEEC_NONE);
6634aa61755SAndy Ye 
6644aa61755SAndy Ye 	TeecResult = TEEC_InvokeCommand(&TeecSession,
6654aa61755SAndy Ye 					143,
6664aa61755SAndy Ye 					&TeecOperation,
6674aa61755SAndy Ye 					&ErrorOrigin);
668f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
669f4e1db95SHisping Lin 		goto exit;
6704aa61755SAndy Ye 
6714aa61755SAndy Ye 	*dh_size = TeecOperation.params[0].tmpref.size;
6724aa61755SAndy Ye 	memcpy(dh, SharedMem0.buffer, SharedMem0.size);
673f4e1db95SHisping Lin exit:
6744aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem0);
6754aa61755SAndy Ye 	TEEC_CloseSession(&TeecSession);
676f4e1db95SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
6774aa61755SAndy Ye 
6784aa61755SAndy Ye 	return TeecResult;
6794aa61755SAndy Ye }
6804aa61755SAndy Ye 
6814aa61755SAndy Ye uint32_t trusty_attest_uuid(uint8_t *uuid, uint32_t *uuid_size)
6824aa61755SAndy Ye {
6834aa61755SAndy Ye 	TEEC_Result TeecResult;
6844aa61755SAndy Ye 	TEEC_Context TeecContext;
6854aa61755SAndy Ye 	TEEC_Session TeecSession;
6864aa61755SAndy Ye 	uint32_t ErrorOrigin;
6874aa61755SAndy Ye 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
6884aa61755SAndy Ye 				{ 0xa8, 0x69, 0x9c, 0xe6,
6894aa61755SAndy Ye 				  0x88, 0x6c, 0x5d, 0x5d
6904aa61755SAndy Ye 				}
6914aa61755SAndy Ye 			     };
6924aa61755SAndy Ye 	TEEC_UUID *TeecUuid = &tempuuid;
6934aa61755SAndy Ye 	TEEC_Operation TeecOperation = {0};
6943251364cSHisping Lin 	struct blk_desc *dev_desc;
6953251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
6966651d4c0SJason Zhu 	if (!dev_desc) {
6976651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
6986651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
6996651d4c0SJason Zhu 	}
7004aa61755SAndy Ye 
701f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
702f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
703f4e1db95SHisping Lin 		return TeecResult;
7044aa61755SAndy Ye 
7054aa61755SAndy Ye 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
706f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
707f4e1db95SHisping Lin 		return TeecResult;
7084aa61755SAndy Ye 
7093251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
7103251364cSHisping Lin 						TEEC_NONE,
7113251364cSHisping Lin 						TEEC_NONE,
7123251364cSHisping Lin 						TEEC_NONE);
7133251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
714b9a7e756SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)
715b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 1;
716b9a7e756SHisping Lin 	else
717b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 0;
718b9a7e756SHisping Lin 
7193251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
7203251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
7213251364cSHisping Lin #endif
7223251364cSHisping Lin 
7234aa61755SAndy Ye 	TeecResult = TEEC_OpenSession(&TeecContext,
7244aa61755SAndy Ye 				      &TeecSession,
7254aa61755SAndy Ye 				      TeecUuid,
7264aa61755SAndy Ye 				      TEEC_LOGIN_PUBLIC,
7274aa61755SAndy Ye 				      NULL,
7283251364cSHisping Lin 					&TeecOperation,
7294aa61755SAndy Ye 				      &ErrorOrigin);
730f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
731f4e1db95SHisping Lin 		return TeecResult;
7324aa61755SAndy Ye 
7334aa61755SAndy Ye 	TEEC_SharedMemory SharedMem0 = {0};
7344aa61755SAndy Ye 
7354aa61755SAndy Ye 	SharedMem0.size = *uuid_size;
7364aa61755SAndy Ye 	SharedMem0.flags = 0;
7374aa61755SAndy Ye 
7384aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
739f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
740f4e1db95SHisping Lin 		goto exit;
7414aa61755SAndy Ye 
7424aa61755SAndy Ye 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
7434aa61755SAndy Ye 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
7444aa61755SAndy Ye 
7454aa61755SAndy Ye 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT,
7464aa61755SAndy Ye 						    TEEC_NONE,
7474aa61755SAndy Ye 						    TEEC_NONE,
7484aa61755SAndy Ye 						    TEEC_NONE);
7494aa61755SAndy Ye 
7504aa61755SAndy Ye 	TeecResult = TEEC_InvokeCommand(&TeecSession,
7514aa61755SAndy Ye 					144,
7524aa61755SAndy Ye 					&TeecOperation,
7534aa61755SAndy Ye 					&ErrorOrigin);
754f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
755f4e1db95SHisping Lin 		goto exit;
7564aa61755SAndy Ye 
7574aa61755SAndy Ye 	*uuid_size = TeecOperation.params[0].tmpref.size;
7584aa61755SAndy Ye 	memcpy(uuid, SharedMem0.buffer, SharedMem0.size);
759f4e1db95SHisping Lin exit:
7604aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem0);
7614aa61755SAndy Ye 	TEEC_CloseSession(&TeecSession);
762f4e1db95SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
7634aa61755SAndy Ye 
7644aa61755SAndy Ye 	return TeecResult;
7654aa61755SAndy Ye }
7664aa61755SAndy Ye 
7674aa61755SAndy Ye uint32_t trusty_attest_get_ca(uint8_t *operation_start,
7684aa61755SAndy Ye 			      uint32_t *operation_size,
7694aa61755SAndy Ye 			      uint8_t *out,
7704aa61755SAndy Ye 			      uint32_t *out_len)
7714aa61755SAndy Ye {
7724aa61755SAndy Ye 	TEEC_Result TeecResult;
7734aa61755SAndy Ye 	TEEC_Context TeecContext;
7744aa61755SAndy Ye 	TEEC_Session TeecSession;
7754aa61755SAndy Ye 	uint32_t ErrorOrigin;
7764aa61755SAndy Ye 
7774aa61755SAndy Ye 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
7784aa61755SAndy Ye 				{ 0xa8, 0x69, 0x9c, 0xe6,
7794aa61755SAndy Ye 				  0x88, 0x6c, 0x5d, 0x5d
7804aa61755SAndy Ye 				}
7814aa61755SAndy Ye 			     };
7824aa61755SAndy Ye 
7834aa61755SAndy Ye 	TEEC_UUID *TeecUuid = &tempuuid;
7844aa61755SAndy Ye 	TEEC_Operation TeecOperation = {0};
7853251364cSHisping Lin 	struct blk_desc *dev_desc;
7863251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
7876651d4c0SJason Zhu 	if (!dev_desc) {
7886651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
7896651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
7906651d4c0SJason Zhu 	}
7914aa61755SAndy Ye 
792f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
793f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
794f4e1db95SHisping Lin 		return TeecResult;
7954aa61755SAndy Ye 
7964aa61755SAndy Ye 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
797f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
798f4e1db95SHisping Lin 		return TeecResult;
7994aa61755SAndy Ye 
8003251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
8013251364cSHisping Lin 						TEEC_NONE,
8023251364cSHisping Lin 						TEEC_NONE,
8033251364cSHisping Lin 						TEEC_NONE);
8043251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
805b9a7e756SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)
806b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 1;
807b9a7e756SHisping Lin 	else
808b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 0;
809b9a7e756SHisping Lin 
8103251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
8113251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
8123251364cSHisping Lin #endif
8133251364cSHisping Lin 
8144aa61755SAndy Ye 	TeecResult = TEEC_OpenSession(&TeecContext,
8154aa61755SAndy Ye 				      &TeecSession,
8164aa61755SAndy Ye 				      TeecUuid,
8174aa61755SAndy Ye 				      TEEC_LOGIN_PUBLIC,
8184aa61755SAndy Ye 				      NULL,
8193251364cSHisping Lin 					&TeecOperation,
8204aa61755SAndy Ye 				      &ErrorOrigin);
821f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
822f4e1db95SHisping Lin 		return TeecResult;
8234aa61755SAndy Ye 
8244aa61755SAndy Ye 	TEEC_SharedMemory SharedMem0 = {0};
8254aa61755SAndy Ye 
8264aa61755SAndy Ye 	SharedMem0.size = *operation_size;
8274aa61755SAndy Ye 	SharedMem0.flags = 0;
8284aa61755SAndy Ye 
8294aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
830f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
831f4e1db95SHisping Lin 		goto exit;
8324aa61755SAndy Ye 
8334aa61755SAndy Ye 	memcpy(SharedMem0.buffer, operation_start, SharedMem0.size);
8344aa61755SAndy Ye 
8354aa61755SAndy Ye 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
8364aa61755SAndy Ye 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
8374aa61755SAndy Ye 
8384aa61755SAndy Ye 	TEEC_SharedMemory SharedMem1 = {0};
8394aa61755SAndy Ye 
8404aa61755SAndy Ye 	SharedMem1.size = *out_len;
8414aa61755SAndy Ye 	SharedMem1.flags = 0;
8424aa61755SAndy Ye 
8434aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
844f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
845f4e1db95SHisping Lin 		goto exit;
8464aa61755SAndy Ye 
8474aa61755SAndy Ye 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
8484aa61755SAndy Ye 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
8494aa61755SAndy Ye 
8504aa61755SAndy Ye 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT,
8514aa61755SAndy Ye 						    TEEC_MEMREF_TEMP_INOUT,
8524aa61755SAndy Ye 						    TEEC_NONE,
8534aa61755SAndy Ye 						    TEEC_NONE);
8544aa61755SAndy Ye 
8554aa61755SAndy Ye 	TeecResult = TEEC_InvokeCommand(&TeecSession,
8564aa61755SAndy Ye 					145,
8574aa61755SAndy Ye 					&TeecOperation,
8584aa61755SAndy Ye 					&ErrorOrigin);
859f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
860f4e1db95SHisping Lin 		goto exit;
8614aa61755SAndy Ye 
8624aa61755SAndy Ye 	*out_len = TeecOperation.params[1].tmpref.size;
8634aa61755SAndy Ye 	memcpy(out, SharedMem1.buffer, SharedMem1.size);
864f4e1db95SHisping Lin exit:
8654aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem0);
8664aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem1);
867f4e1db95SHisping Lin 	TEEC_CloseSession(&TeecSession);
868f4e1db95SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
8694aa61755SAndy Ye 
8704aa61755SAndy Ye 	return TeecResult;
8714aa61755SAndy Ye }
8724aa61755SAndy Ye 
8734aa61755SAndy Ye uint32_t trusty_attest_set_ca(uint8_t *ca_response, uint32_t *ca_response_size)
8744aa61755SAndy Ye {
8754aa61755SAndy Ye 	TEEC_Result TeecResult;
8764aa61755SAndy Ye 	TEEC_Context TeecContext;
8774aa61755SAndy Ye 	TEEC_Session TeecSession;
8784aa61755SAndy Ye 	uint32_t ErrorOrigin;
8794aa61755SAndy Ye 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
8804aa61755SAndy Ye 				{ 0xa8, 0x69, 0x9c, 0xe6,
8814aa61755SAndy Ye 				  0x88, 0x6c, 0x5d, 0x5d
8824aa61755SAndy Ye 				}
8834aa61755SAndy Ye 			     };
8844aa61755SAndy Ye 	TEEC_UUID *TeecUuid = &tempuuid;
8854aa61755SAndy Ye 	TEEC_Operation TeecOperation = {0};
8863251364cSHisping Lin 	struct blk_desc *dev_desc;
8873251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
8886651d4c0SJason Zhu 	if (!dev_desc) {
8896651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
8906651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
8916651d4c0SJason Zhu 	}
892f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
893f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
894f4e1db95SHisping Lin 		return TeecResult;
8954aa61755SAndy Ye 
8964aa61755SAndy Ye 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
897f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
898f4e1db95SHisping Lin 		return TeecResult;
8994aa61755SAndy Ye 
9003251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
9013251364cSHisping Lin 						TEEC_NONE,
9023251364cSHisping Lin 						TEEC_NONE,
9033251364cSHisping Lin 						TEEC_NONE);
9043251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
905b9a7e756SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)
906b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 1;
907b9a7e756SHisping Lin 	else
908b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 0;
909b9a7e756SHisping Lin 
9103251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
9113251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
9123251364cSHisping Lin #endif
9133251364cSHisping Lin 
9144aa61755SAndy Ye 	TeecResult = TEEC_OpenSession(&TeecContext,
9154aa61755SAndy Ye 					&TeecSession,
9164aa61755SAndy Ye 					TeecUuid,
9174aa61755SAndy Ye 					TEEC_LOGIN_PUBLIC,
9184aa61755SAndy Ye 					NULL,
9193251364cSHisping Lin 					&TeecOperation,
9204aa61755SAndy Ye 					&ErrorOrigin);
921f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
922f4e1db95SHisping Lin 		return TeecResult;
9234aa61755SAndy Ye 
9244aa61755SAndy Ye 	TEEC_SharedMemory SharedMem0 = {0};
9254aa61755SAndy Ye 
9264aa61755SAndy Ye 	SharedMem0.size = *ca_response_size;
9274aa61755SAndy Ye 	SharedMem0.flags = 0;
9284aa61755SAndy Ye 
9294aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
930f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
931f4e1db95SHisping Lin 		goto exit;
9324aa61755SAndy Ye 
9334aa61755SAndy Ye 	memcpy(SharedMem0.buffer, ca_response, SharedMem0.size);
9344aa61755SAndy Ye 
9354aa61755SAndy Ye 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
9364aa61755SAndy Ye 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
9374aa61755SAndy Ye 
9384aa61755SAndy Ye 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT,
9394aa61755SAndy Ye 						    TEEC_NONE,
9404aa61755SAndy Ye 						    TEEC_NONE,
9414aa61755SAndy Ye 						    TEEC_NONE);
9424aa61755SAndy Ye 
9434aa61755SAndy Ye 	TeecResult = TEEC_InvokeCommand(&TeecSession,
9444aa61755SAndy Ye 					146,
9454aa61755SAndy Ye 					&TeecOperation,
9464aa61755SAndy Ye 					&ErrorOrigin);
947f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
948f4e1db95SHisping Lin 		goto exit;
949f4e1db95SHisping Lin exit:
9504aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem0);
9514aa61755SAndy Ye 	TEEC_CloseSession(&TeecSession);
952f4e1db95SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
9534aa61755SAndy Ye 
9544aa61755SAndy Ye 	return TeecResult;
9554aa61755SAndy Ye }
956