xref: /rk3399_rockchip-uboot/lib/optee_clientApi/OpteeClientInterface.c (revision f39d4289a6adff1b0e7067a0a2f2b0cd35e1daf2)
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
25*f39d4289SHisping 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 
569*f39d4289SHisping Lin uint32_t trusty_write_oem_huk(uint32_t *buf, uint32_t length)
570*f39d4289SHisping Lin {
571*f39d4289SHisping Lin 	return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_OEM_HUK,
572*f39d4289SHisping Lin 						  true, buf, length);
573*f39d4289SHisping Lin }
574*f39d4289SHisping Lin 
5754aa61755SAndy Ye uint32_t trusty_attest_dh(uint8_t *dh, uint32_t *dh_size)
5764aa61755SAndy Ye {
5774aa61755SAndy Ye 	TEEC_Result TeecResult;
5784aa61755SAndy Ye 	TEEC_Context TeecContext;
5794aa61755SAndy Ye 	TEEC_Session TeecSession;
5804aa61755SAndy Ye 	uint32_t ErrorOrigin;
5814aa61755SAndy Ye 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
5824aa61755SAndy Ye 				{ 0xa8, 0x69, 0x9c, 0xe6,
5834aa61755SAndy Ye 				  0x88, 0x6c, 0x5d, 0x5d
5844aa61755SAndy Ye 				}
5854aa61755SAndy Ye 			     };
5864aa61755SAndy Ye 	TEEC_UUID *TeecUuid = &tempuuid;
5874aa61755SAndy Ye 	TEEC_Operation TeecOperation = {0};
5883251364cSHisping Lin 	struct blk_desc *dev_desc;
5893251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
5906651d4c0SJason Zhu 	if (!dev_desc) {
5916651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
5926651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
5936651d4c0SJason Zhu 	}
5944aa61755SAndy Ye 
595f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
596f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
597f4e1db95SHisping Lin 		return TeecResult;
5984aa61755SAndy Ye 
5994aa61755SAndy Ye 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
600f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
601f4e1db95SHisping Lin 		return TeecResult;
6024aa61755SAndy Ye 
6033251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
6043251364cSHisping Lin 						TEEC_NONE,
6053251364cSHisping Lin 						TEEC_NONE,
6063251364cSHisping Lin 						TEEC_NONE);
6073251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
608b9a7e756SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)
609b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 1;
610b9a7e756SHisping Lin 	else
611b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 0;
612b9a7e756SHisping Lin 
6133251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
6143251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
6153251364cSHisping Lin #endif
6163251364cSHisping Lin 
6174aa61755SAndy Ye 	TeecResult = TEEC_OpenSession(&TeecContext,
6184aa61755SAndy Ye 				      &TeecSession,
6194aa61755SAndy Ye 				      TeecUuid,
6204aa61755SAndy Ye 				      TEEC_LOGIN_PUBLIC,
6214aa61755SAndy Ye 				      NULL,
6223251364cSHisping Lin 					&TeecOperation,
6234aa61755SAndy Ye 				      &ErrorOrigin);
624f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
625f4e1db95SHisping Lin 		return TeecResult;
6264aa61755SAndy Ye 
6274aa61755SAndy Ye 	TEEC_SharedMemory SharedMem0 = {0};
6284aa61755SAndy Ye 
6294aa61755SAndy Ye 	SharedMem0.size = *dh_size;
6304aa61755SAndy Ye 	SharedMem0.flags = 0;
6314aa61755SAndy Ye 
6324aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
633f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
634f4e1db95SHisping Lin 		goto exit;
6354aa61755SAndy Ye 
6364aa61755SAndy Ye 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
6374aa61755SAndy Ye 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
6384aa61755SAndy Ye 
6394aa61755SAndy Ye 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT,
6404aa61755SAndy Ye 						    TEEC_NONE,
6414aa61755SAndy Ye 						    TEEC_NONE,
6424aa61755SAndy Ye 						    TEEC_NONE);
6434aa61755SAndy Ye 
6444aa61755SAndy Ye 	TeecResult = TEEC_InvokeCommand(&TeecSession,
6454aa61755SAndy Ye 					143,
6464aa61755SAndy Ye 					&TeecOperation,
6474aa61755SAndy Ye 					&ErrorOrigin);
648f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
649f4e1db95SHisping Lin 		goto exit;
6504aa61755SAndy Ye 
6514aa61755SAndy Ye 	*dh_size = TeecOperation.params[0].tmpref.size;
6524aa61755SAndy Ye 	memcpy(dh, SharedMem0.buffer, SharedMem0.size);
653f4e1db95SHisping Lin exit:
6544aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem0);
6554aa61755SAndy Ye 	TEEC_CloseSession(&TeecSession);
656f4e1db95SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
6574aa61755SAndy Ye 
6584aa61755SAndy Ye 	return TeecResult;
6594aa61755SAndy Ye }
6604aa61755SAndy Ye 
6614aa61755SAndy Ye uint32_t trusty_attest_uuid(uint8_t *uuid, uint32_t *uuid_size)
6624aa61755SAndy Ye {
6634aa61755SAndy Ye 	TEEC_Result TeecResult;
6644aa61755SAndy Ye 	TEEC_Context TeecContext;
6654aa61755SAndy Ye 	TEEC_Session TeecSession;
6664aa61755SAndy Ye 	uint32_t ErrorOrigin;
6674aa61755SAndy Ye 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
6684aa61755SAndy Ye 				{ 0xa8, 0x69, 0x9c, 0xe6,
6694aa61755SAndy Ye 				  0x88, 0x6c, 0x5d, 0x5d
6704aa61755SAndy Ye 				}
6714aa61755SAndy Ye 			     };
6724aa61755SAndy Ye 	TEEC_UUID *TeecUuid = &tempuuid;
6734aa61755SAndy Ye 	TEEC_Operation TeecOperation = {0};
6743251364cSHisping Lin 	struct blk_desc *dev_desc;
6753251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
6766651d4c0SJason Zhu 	if (!dev_desc) {
6776651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
6786651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
6796651d4c0SJason Zhu 	}
6804aa61755SAndy Ye 
681f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
682f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
683f4e1db95SHisping Lin 		return TeecResult;
6844aa61755SAndy Ye 
6854aa61755SAndy Ye 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
686f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
687f4e1db95SHisping Lin 		return TeecResult;
6884aa61755SAndy Ye 
6893251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
6903251364cSHisping Lin 						TEEC_NONE,
6913251364cSHisping Lin 						TEEC_NONE,
6923251364cSHisping Lin 						TEEC_NONE);
6933251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
694b9a7e756SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)
695b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 1;
696b9a7e756SHisping Lin 	else
697b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 0;
698b9a7e756SHisping Lin 
6993251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
7003251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
7013251364cSHisping Lin #endif
7023251364cSHisping Lin 
7034aa61755SAndy Ye 	TeecResult = TEEC_OpenSession(&TeecContext,
7044aa61755SAndy Ye 				      &TeecSession,
7054aa61755SAndy Ye 				      TeecUuid,
7064aa61755SAndy Ye 				      TEEC_LOGIN_PUBLIC,
7074aa61755SAndy Ye 				      NULL,
7083251364cSHisping Lin 					&TeecOperation,
7094aa61755SAndy Ye 				      &ErrorOrigin);
710f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
711f4e1db95SHisping Lin 		return TeecResult;
7124aa61755SAndy Ye 
7134aa61755SAndy Ye 	TEEC_SharedMemory SharedMem0 = {0};
7144aa61755SAndy Ye 
7154aa61755SAndy Ye 	SharedMem0.size = *uuid_size;
7164aa61755SAndy Ye 	SharedMem0.flags = 0;
7174aa61755SAndy Ye 
7184aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
719f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
720f4e1db95SHisping Lin 		goto exit;
7214aa61755SAndy Ye 
7224aa61755SAndy Ye 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
7234aa61755SAndy Ye 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
7244aa61755SAndy Ye 
7254aa61755SAndy Ye 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT,
7264aa61755SAndy Ye 						    TEEC_NONE,
7274aa61755SAndy Ye 						    TEEC_NONE,
7284aa61755SAndy Ye 						    TEEC_NONE);
7294aa61755SAndy Ye 
7304aa61755SAndy Ye 	TeecResult = TEEC_InvokeCommand(&TeecSession,
7314aa61755SAndy Ye 					144,
7324aa61755SAndy Ye 					&TeecOperation,
7334aa61755SAndy Ye 					&ErrorOrigin);
734f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
735f4e1db95SHisping Lin 		goto exit;
7364aa61755SAndy Ye 
7374aa61755SAndy Ye 	*uuid_size = TeecOperation.params[0].tmpref.size;
7384aa61755SAndy Ye 	memcpy(uuid, SharedMem0.buffer, SharedMem0.size);
739f4e1db95SHisping Lin exit:
7404aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem0);
7414aa61755SAndy Ye 	TEEC_CloseSession(&TeecSession);
742f4e1db95SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
7434aa61755SAndy Ye 
7444aa61755SAndy Ye 	return TeecResult;
7454aa61755SAndy Ye }
7464aa61755SAndy Ye 
7474aa61755SAndy Ye uint32_t trusty_attest_get_ca(uint8_t *operation_start,
7484aa61755SAndy Ye 			      uint32_t *operation_size,
7494aa61755SAndy Ye 			      uint8_t *out,
7504aa61755SAndy Ye 			      uint32_t *out_len)
7514aa61755SAndy Ye {
7524aa61755SAndy Ye 	TEEC_Result TeecResult;
7534aa61755SAndy Ye 	TEEC_Context TeecContext;
7544aa61755SAndy Ye 	TEEC_Session TeecSession;
7554aa61755SAndy Ye 	uint32_t ErrorOrigin;
7564aa61755SAndy Ye 
7574aa61755SAndy Ye 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
7584aa61755SAndy Ye 				{ 0xa8, 0x69, 0x9c, 0xe6,
7594aa61755SAndy Ye 				  0x88, 0x6c, 0x5d, 0x5d
7604aa61755SAndy Ye 				}
7614aa61755SAndy Ye 			     };
7624aa61755SAndy Ye 
7634aa61755SAndy Ye 	TEEC_UUID *TeecUuid = &tempuuid;
7644aa61755SAndy Ye 	TEEC_Operation TeecOperation = {0};
7653251364cSHisping Lin 	struct blk_desc *dev_desc;
7663251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
7676651d4c0SJason Zhu 	if (!dev_desc) {
7686651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
7696651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
7706651d4c0SJason Zhu 	}
7714aa61755SAndy Ye 
772f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
773f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
774f4e1db95SHisping Lin 		return TeecResult;
7754aa61755SAndy Ye 
7764aa61755SAndy Ye 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
777f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
778f4e1db95SHisping Lin 		return TeecResult;
7794aa61755SAndy Ye 
7803251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
7813251364cSHisping Lin 						TEEC_NONE,
7823251364cSHisping Lin 						TEEC_NONE,
7833251364cSHisping Lin 						TEEC_NONE);
7843251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
785b9a7e756SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)
786b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 1;
787b9a7e756SHisping Lin 	else
788b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 0;
789b9a7e756SHisping Lin 
7903251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
7913251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
7923251364cSHisping Lin #endif
7933251364cSHisping Lin 
7944aa61755SAndy Ye 	TeecResult = TEEC_OpenSession(&TeecContext,
7954aa61755SAndy Ye 				      &TeecSession,
7964aa61755SAndy Ye 				      TeecUuid,
7974aa61755SAndy Ye 				      TEEC_LOGIN_PUBLIC,
7984aa61755SAndy Ye 				      NULL,
7993251364cSHisping Lin 					&TeecOperation,
8004aa61755SAndy Ye 				      &ErrorOrigin);
801f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
802f4e1db95SHisping Lin 		return TeecResult;
8034aa61755SAndy Ye 
8044aa61755SAndy Ye 	TEEC_SharedMemory SharedMem0 = {0};
8054aa61755SAndy Ye 
8064aa61755SAndy Ye 	SharedMem0.size = *operation_size;
8074aa61755SAndy Ye 	SharedMem0.flags = 0;
8084aa61755SAndy Ye 
8094aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
810f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
811f4e1db95SHisping Lin 		goto exit;
8124aa61755SAndy Ye 
8134aa61755SAndy Ye 	memcpy(SharedMem0.buffer, operation_start, SharedMem0.size);
8144aa61755SAndy Ye 
8154aa61755SAndy Ye 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
8164aa61755SAndy Ye 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
8174aa61755SAndy Ye 
8184aa61755SAndy Ye 	TEEC_SharedMemory SharedMem1 = {0};
8194aa61755SAndy Ye 
8204aa61755SAndy Ye 	SharedMem1.size = *out_len;
8214aa61755SAndy Ye 	SharedMem1.flags = 0;
8224aa61755SAndy Ye 
8234aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
824f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
825f4e1db95SHisping Lin 		goto exit;
8264aa61755SAndy Ye 
8274aa61755SAndy Ye 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
8284aa61755SAndy Ye 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
8294aa61755SAndy Ye 
8304aa61755SAndy Ye 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT,
8314aa61755SAndy Ye 						    TEEC_MEMREF_TEMP_INOUT,
8324aa61755SAndy Ye 						    TEEC_NONE,
8334aa61755SAndy Ye 						    TEEC_NONE);
8344aa61755SAndy Ye 
8354aa61755SAndy Ye 	TeecResult = TEEC_InvokeCommand(&TeecSession,
8364aa61755SAndy Ye 					145,
8374aa61755SAndy Ye 					&TeecOperation,
8384aa61755SAndy Ye 					&ErrorOrigin);
839f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
840f4e1db95SHisping Lin 		goto exit;
8414aa61755SAndy Ye 
8424aa61755SAndy Ye 	*out_len = TeecOperation.params[1].tmpref.size;
8434aa61755SAndy Ye 	memcpy(out, SharedMem1.buffer, SharedMem1.size);
844f4e1db95SHisping Lin exit:
8454aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem0);
8464aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem1);
847f4e1db95SHisping Lin 	TEEC_CloseSession(&TeecSession);
848f4e1db95SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
8494aa61755SAndy Ye 
8504aa61755SAndy Ye 	return TeecResult;
8514aa61755SAndy Ye }
8524aa61755SAndy Ye 
8534aa61755SAndy Ye uint32_t trusty_attest_set_ca(uint8_t *ca_response, uint32_t *ca_response_size)
8544aa61755SAndy Ye {
8554aa61755SAndy Ye 	TEEC_Result TeecResult;
8564aa61755SAndy Ye 	TEEC_Context TeecContext;
8574aa61755SAndy Ye 	TEEC_Session TeecSession;
8584aa61755SAndy Ye 	uint32_t ErrorOrigin;
8594aa61755SAndy Ye 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
8604aa61755SAndy Ye 				{ 0xa8, 0x69, 0x9c, 0xe6,
8614aa61755SAndy Ye 				  0x88, 0x6c, 0x5d, 0x5d
8624aa61755SAndy Ye 				}
8634aa61755SAndy Ye 			     };
8644aa61755SAndy Ye 	TEEC_UUID *TeecUuid = &tempuuid;
8654aa61755SAndy Ye 	TEEC_Operation TeecOperation = {0};
8663251364cSHisping Lin 	struct blk_desc *dev_desc;
8673251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
8686651d4c0SJason Zhu 	if (!dev_desc) {
8696651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
8706651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
8716651d4c0SJason Zhu 	}
872f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
873f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
874f4e1db95SHisping Lin 		return TeecResult;
8754aa61755SAndy Ye 
8764aa61755SAndy Ye 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
877f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
878f4e1db95SHisping Lin 		return TeecResult;
8794aa61755SAndy Ye 
8803251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
8813251364cSHisping Lin 						TEEC_NONE,
8823251364cSHisping Lin 						TEEC_NONE,
8833251364cSHisping Lin 						TEEC_NONE);
8843251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
885b9a7e756SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)
886b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 1;
887b9a7e756SHisping Lin 	else
888b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 0;
889b9a7e756SHisping Lin 
8903251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
8913251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
8923251364cSHisping Lin #endif
8933251364cSHisping Lin 
8944aa61755SAndy Ye 	TeecResult = TEEC_OpenSession(&TeecContext,
8954aa61755SAndy Ye 					&TeecSession,
8964aa61755SAndy Ye 					TeecUuid,
8974aa61755SAndy Ye 					TEEC_LOGIN_PUBLIC,
8984aa61755SAndy Ye 					NULL,
8993251364cSHisping Lin 					&TeecOperation,
9004aa61755SAndy Ye 					&ErrorOrigin);
901f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
902f4e1db95SHisping Lin 		return TeecResult;
9034aa61755SAndy Ye 
9044aa61755SAndy Ye 	TEEC_SharedMemory SharedMem0 = {0};
9054aa61755SAndy Ye 
9064aa61755SAndy Ye 	SharedMem0.size = *ca_response_size;
9074aa61755SAndy Ye 	SharedMem0.flags = 0;
9084aa61755SAndy Ye 
9094aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
910f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
911f4e1db95SHisping Lin 		goto exit;
9124aa61755SAndy Ye 
9134aa61755SAndy Ye 	memcpy(SharedMem0.buffer, ca_response, SharedMem0.size);
9144aa61755SAndy Ye 
9154aa61755SAndy Ye 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
9164aa61755SAndy Ye 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
9174aa61755SAndy Ye 
9184aa61755SAndy Ye 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT,
9194aa61755SAndy Ye 						    TEEC_NONE,
9204aa61755SAndy Ye 						    TEEC_NONE,
9214aa61755SAndy Ye 						    TEEC_NONE);
9224aa61755SAndy Ye 
9234aa61755SAndy Ye 	TeecResult = TEEC_InvokeCommand(&TeecSession,
9244aa61755SAndy Ye 					146,
9254aa61755SAndy Ye 					&TeecOperation,
9264aa61755SAndy Ye 					&ErrorOrigin);
927f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
928f4e1db95SHisping Lin 		goto exit;
929f4e1db95SHisping Lin exit:
9304aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem0);
9314aa61755SAndy Ye 	TEEC_CloseSession(&TeecSession);
932f4e1db95SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
9334aa61755SAndy Ye 
9344aa61755SAndy Ye 	return TeecResult;
9354aa61755SAndy Ye }
936