xref: /rk3399_rockchip-uboot/lib/optee_clientApi/OpteeClientInterface.c (revision 1ef63c75504081c825b8ecead64a4742787647d2)
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
23*1ef63c75SHisping Lin #define STORAGE_CMD_WRITE_TA_ENCRYPTION_KEY	9
24ae8ec5e1SHisping Lin 
25ae8ec5e1SHisping Lin static uint8_t b2hs_add_base(uint8_t in)
26ae8ec5e1SHisping Lin {
27ae8ec5e1SHisping Lin 	if (in > 9)
28ae8ec5e1SHisping Lin 		return in + 55;
29ae8ec5e1SHisping Lin 	else
30ae8ec5e1SHisping Lin 		return in + 48;
31ae8ec5e1SHisping Lin }
32ae8ec5e1SHisping Lin 
33c7de5349SHisping Lin static uint32_t b2hs(uint8_t *b, uint8_t *hs, uint32_t blen, uint32_t hslen)
34ae8ec5e1SHisping Lin {
35ae8ec5e1SHisping Lin 	uint32_t i = 0;
36ae8ec5e1SHisping Lin 
37ae8ec5e1SHisping Lin 	if (blen * 2 + 1 > hslen)
38ae8ec5e1SHisping Lin 		return 0;
39ae8ec5e1SHisping Lin 
40ae8ec5e1SHisping Lin 	for (; i < blen; i++) {
41ae8ec5e1SHisping Lin 		hs[i * 2 + 1] = b2hs_add_base(b[i] & 0xf);
42ae8ec5e1SHisping Lin 		hs[i * 2] = b2hs_add_base(b[i] >> 4);
43ae8ec5e1SHisping Lin 	}
44ae8ec5e1SHisping Lin 	hs[blen * 2] = 0;
45ae8ec5e1SHisping Lin 
46ae8ec5e1SHisping Lin 	return blen * 2;
47ae8ec5e1SHisping Lin }
48ae8ec5e1SHisping Lin 
49c7de5349SHisping Lin static uint32_t trusty_base_write_security_data(char *filename,
50c7de5349SHisping Lin 						uint32_t filename_size,
51c7de5349SHisping Lin 						uint8_t *data,
52c7de5349SHisping Lin 						uint32_t data_size)
53ae8ec5e1SHisping Lin {
54ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
55ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
56ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
57ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
58ae8ec5e1SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
59ae8ec5e1SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
60ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
61ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
623251364cSHisping Lin 	struct blk_desc *dev_desc;
633251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
646651d4c0SJason Zhu 	if (!dev_desc) {
656651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
666651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
676651d4c0SJason Zhu 	}
683251364cSHisping Lin 
69f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
70f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
71f4e1db95SHisping Lin 		return TeecResult;
72ae8ec5e1SHisping Lin 
73ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
74f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
75f4e1db95SHisping Lin 		return TeecResult;
76ae8ec5e1SHisping Lin 
773251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
783251364cSHisping Lin 						    TEEC_NONE,
793251364cSHisping Lin 						    TEEC_NONE,
803251364cSHisping Lin 						    TEEC_NONE);
813251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
82b9a7e756SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)
83b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 1;
84b9a7e756SHisping Lin 	else
85b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 0;
863251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
873251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
883251364cSHisping Lin #endif
893251364cSHisping Lin 
90ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
91ae8ec5e1SHisping Lin 				&TeecSession,
92ae8ec5e1SHisping Lin 				TeecUuid,
93ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
94ae8ec5e1SHisping Lin 				NULL,
953251364cSHisping Lin 				&TeecOperation,
96ae8ec5e1SHisping Lin 				&ErrorOrigin);
97f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
98f4e1db95SHisping Lin 		return TeecResult;
99ae8ec5e1SHisping Lin 
100ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
101ae8ec5e1SHisping Lin 
102c7de5349SHisping Lin 	SharedMem0.size = filename_size;
103ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
104ae8ec5e1SHisping Lin 
105ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
106f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
107f4e1db95SHisping Lin 		goto exit;
108ae8ec5e1SHisping Lin 
109c7de5349SHisping Lin 	memcpy(SharedMem0.buffer, filename, SharedMem0.size);
110ae8ec5e1SHisping Lin 
111ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
112ae8ec5e1SHisping Lin 
113c7de5349SHisping Lin 	SharedMem1.size = data_size;
114c7de5349SHisping Lin 	SharedMem1.flags = 0;
115c7de5349SHisping Lin 
116c7de5349SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
117c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
118c7de5349SHisping Lin 		goto exit;
119c7de5349SHisping Lin 
120c7de5349SHisping Lin 	memcpy(SharedMem1.buffer, data, SharedMem1.size);
121c7de5349SHisping Lin 
122c7de5349SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
123c7de5349SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
124c7de5349SHisping Lin 
125c7de5349SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
126c7de5349SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
127c7de5349SHisping Lin 
128c7de5349SHisping Lin 
129c7de5349SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
130c7de5349SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
131c7de5349SHisping Lin 						TEEC_NONE,
132c7de5349SHisping Lin 						TEEC_NONE);
133c7de5349SHisping Lin 
134c7de5349SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
135c7de5349SHisping Lin 					1,
136c7de5349SHisping Lin 					&TeecOperation,
137c7de5349SHisping Lin 					&ErrorOrigin);
138c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
139c7de5349SHisping Lin 		goto exit;
140c7de5349SHisping Lin exit:
141c7de5349SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
142c7de5349SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
143c7de5349SHisping Lin 	TEEC_CloseSession(&TeecSession);
144c7de5349SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
145c7de5349SHisping Lin 
146c7de5349SHisping Lin 	return TeecResult;
147c7de5349SHisping Lin }
148c7de5349SHisping Lin 
149c7de5349SHisping Lin static uint32_t trusty_base_read_security_data(char *filename,
150c7de5349SHisping Lin 					       uint32_t filename_size,
151c7de5349SHisping Lin 					       uint8_t *data,
152c7de5349SHisping Lin 					       uint32_t data_size)
153c7de5349SHisping Lin {
154c7de5349SHisping Lin 	TEEC_Result TeecResult;
155c7de5349SHisping Lin 	TEEC_Context TeecContext;
156c7de5349SHisping Lin 	TEEC_Session TeecSession;
157c7de5349SHisping Lin 	uint32_t ErrorOrigin;
158c7de5349SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
159c7de5349SHisping Lin 			{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
160c7de5349SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
161c7de5349SHisping Lin 	TEEC_Operation TeecOperation = {0};
162c7de5349SHisping Lin 
163c7de5349SHisping Lin 	struct blk_desc *dev_desc;
164c7de5349SHisping Lin 	dev_desc = rockchip_get_bootdev();
165c7de5349SHisping Lin 	if (!dev_desc) {
166c7de5349SHisping Lin 		printf("%s: dev_desc is NULL!\n", __func__);
167c7de5349SHisping Lin 		return -TEEC_ERROR_GENERIC;
168c7de5349SHisping Lin 	}
169c7de5349SHisping Lin 
170c7de5349SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
171c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
172c7de5349SHisping Lin 		return TeecResult;
173c7de5349SHisping Lin 
174c7de5349SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
175c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
176c7de5349SHisping Lin 		return TeecResult;
177c7de5349SHisping Lin 
178c7de5349SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
179c7de5349SHisping Lin 						TEEC_NONE,
180c7de5349SHisping Lin 						TEEC_NONE,
181c7de5349SHisping Lin 						TEEC_NONE);
182c7de5349SHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
183c7de5349SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)
184c7de5349SHisping Lin 		TeecOperation.params[0].value.a = 1;
185c7de5349SHisping Lin 	else
186c7de5349SHisping Lin 		TeecOperation.params[0].value.a = 0;
187c7de5349SHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
188c7de5349SHisping Lin 	TeecOperation.params[0].value.a = 0;
189c7de5349SHisping Lin #endif
190c7de5349SHisping Lin 
191c7de5349SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
192c7de5349SHisping Lin 				&TeecSession,
193c7de5349SHisping Lin 				TeecUuid,
194c7de5349SHisping Lin 				TEEC_LOGIN_PUBLIC,
195c7de5349SHisping Lin 				NULL,
196c7de5349SHisping Lin 				&TeecOperation,
197c7de5349SHisping Lin 				&ErrorOrigin);
198c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
199c7de5349SHisping Lin 		return TeecResult;
200c7de5349SHisping Lin 
201c7de5349SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
202c7de5349SHisping Lin 
203c7de5349SHisping Lin 	SharedMem0.size = filename_size;
204c7de5349SHisping Lin 	SharedMem0.flags = 0;
205c7de5349SHisping Lin 
206c7de5349SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
207c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
208c7de5349SHisping Lin 		goto exit;
209c7de5349SHisping Lin 
210c7de5349SHisping Lin 	memcpy(SharedMem0.buffer, filename, SharedMem0.size);
211c7de5349SHisping Lin 
212c7de5349SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
213c7de5349SHisping Lin 
214c7de5349SHisping Lin 	SharedMem1.size = data_size;
215ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
216ae8ec5e1SHisping Lin 
217ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
218f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
219f4e1db95SHisping Lin 		goto exit;
220ae8ec5e1SHisping Lin 
221ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
222ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
223ae8ec5e1SHisping Lin 
224ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
225ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
226ae8ec5e1SHisping Lin 
227ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
228ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
229ae8ec5e1SHisping Lin 						TEEC_NONE,
230ae8ec5e1SHisping Lin 						TEEC_NONE);
231ae8ec5e1SHisping Lin 
232ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
233ae8ec5e1SHisping Lin 					0,
234ae8ec5e1SHisping Lin 					&TeecOperation,
235ae8ec5e1SHisping Lin 					&ErrorOrigin);
23646b2a054SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
237c7de5349SHisping Lin 		memcpy(data, SharedMem1.buffer, SharedMem1.size);
238f4e1db95SHisping Lin exit:
239ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
240ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
241ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
24246b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
243ae8ec5e1SHisping Lin 
244ae8ec5e1SHisping Lin 	return TeecResult;
245ae8ec5e1SHisping Lin }
246ae8ec5e1SHisping Lin 
247c7de5349SHisping Lin static uint32_t trusty_base_end_security_data(void)
248c7de5349SHisping Lin {
249c7de5349SHisping Lin 	TEEC_Result TeecResult;
250c7de5349SHisping Lin 	TEEC_Context TeecContext;
251c7de5349SHisping Lin 	TEEC_Session TeecSession;
252c7de5349SHisping Lin 	uint32_t ErrorOrigin;
253c7de5349SHisping Lin 	TEEC_UUID  tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
254c7de5349SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
255c7de5349SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
256c7de5349SHisping Lin 	TEEC_Operation TeecOperation = {0};
257c7de5349SHisping Lin 
258c7de5349SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
259c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
260c7de5349SHisping Lin 		return TeecResult;
261c7de5349SHisping Lin 
262c7de5349SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
263c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
264c7de5349SHisping Lin 		return TeecResult;
265c7de5349SHisping Lin 
266c7de5349SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
267c7de5349SHisping Lin 				&TeecSession,
268c7de5349SHisping Lin 				TeecUuid,
269c7de5349SHisping Lin 				TEEC_LOGIN_PUBLIC,
270c7de5349SHisping Lin 				NULL,
271c7de5349SHisping Lin 				NULL,
272c7de5349SHisping Lin 				&ErrorOrigin);
273c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
274c7de5349SHisping Lin 		return TeecResult;
275c7de5349SHisping Lin 
276c7de5349SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE,
277c7de5349SHisping Lin 						    TEEC_NONE,
278c7de5349SHisping Lin 						    TEEC_NONE,
279c7de5349SHisping Lin 						    TEEC_NONE);
280c7de5349SHisping Lin 
281c7de5349SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
282c7de5349SHisping Lin 					2,
283c7de5349SHisping Lin 					&TeecOperation,
284c7de5349SHisping Lin 					&ErrorOrigin);
285c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
286c7de5349SHisping Lin 		goto exit;
287c7de5349SHisping Lin exit:
288c7de5349SHisping Lin 	TEEC_CloseSession(&TeecSession);
289c7de5349SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
290c7de5349SHisping Lin 
291c7de5349SHisping Lin 	return TeecResult;
292c7de5349SHisping Lin }
293c7de5349SHisping Lin 
294c7de5349SHisping Lin uint32_t trusty_read_rollback_index(uint32_t slot, uint64_t *value)
295c7de5349SHisping Lin {
296c7de5349SHisping Lin 	char hs[9];
297c7de5349SHisping Lin 
298c7de5349SHisping Lin 	b2hs((uint8_t *)&slot, (uint8_t *)hs, 4, 9);
299c7de5349SHisping Lin 
300c7de5349SHisping Lin 	return trusty_base_read_security_data(hs, 8, (uint8_t *)value, 8);
301c7de5349SHisping Lin }
302c7de5349SHisping Lin 
303ae8ec5e1SHisping Lin uint32_t trusty_write_rollback_index(uint32_t slot, uint64_t value)
304ae8ec5e1SHisping Lin {
305c7de5349SHisping Lin 	char hs[9];
3063251364cSHisping Lin 
307c7de5349SHisping Lin 	b2hs((uint8_t *)&slot, (uint8_t *)hs, 4, 9);
308ae8ec5e1SHisping Lin 
309c7de5349SHisping Lin 	return trusty_base_write_security_data(hs, 8, (uint8_t *)&value, 8);
310ae8ec5e1SHisping Lin }
311ae8ec5e1SHisping Lin 
312ae8ec5e1SHisping Lin uint32_t trusty_read_permanent_attributes(uint8_t *attributes, uint32_t size)
313ae8ec5e1SHisping Lin {
314c7de5349SHisping Lin 	return trusty_base_read_security_data("attributes",
315c7de5349SHisping Lin 		sizeof("attributes"), attributes, size);
316ae8ec5e1SHisping Lin }
317ae8ec5e1SHisping Lin 
318ae8ec5e1SHisping Lin uint32_t trusty_write_permanent_attributes(uint8_t *attributes, uint32_t size)
319ae8ec5e1SHisping Lin {
320c7de5349SHisping Lin 	return trusty_base_write_security_data("attributes",
321c7de5349SHisping Lin 		sizeof("attributes"), attributes, size);
3226651d4c0SJason Zhu }
323ae8ec5e1SHisping Lin 
324c7de5349SHisping Lin uint32_t trusty_read_permanent_attributes_flag(uint8_t *attributes)
325c7de5349SHisping Lin {
326c7de5349SHisping Lin 	return trusty_base_read_security_data("attributes_flag",
327c7de5349SHisping Lin 		sizeof("attributes_flag"), attributes, 1);
328c7de5349SHisping Lin }
329ae8ec5e1SHisping Lin 
330c7de5349SHisping Lin uint32_t trusty_write_permanent_attributes_flag(uint8_t attributes)
331c7de5349SHisping Lin {
332c7de5349SHisping Lin 	return trusty_base_write_security_data("attributes_flag",
333c7de5349SHisping Lin 		sizeof("attributes_flag"), &attributes, 1);
334ae8ec5e1SHisping Lin }
335ae8ec5e1SHisping Lin 
336564654ebSJason Zhu uint32_t trusty_read_permanent_attributes_cer(uint8_t *attributes,
337564654ebSJason Zhu 					      uint32_t size)
338564654ebSJason Zhu {
339c7de5349SHisping Lin 	return trusty_base_read_security_data("rsacer",
340c7de5349SHisping Lin 		sizeof("rsacer"), attributes, size);
341564654ebSJason Zhu }
342564654ebSJason Zhu 
343564654ebSJason Zhu uint32_t trusty_write_permanent_attributes_cer(uint8_t *attributes,
344564654ebSJason Zhu 					       uint32_t size)
345564654ebSJason Zhu {
346c7de5349SHisping Lin 	return trusty_base_write_security_data("rsacer",
347c7de5349SHisping Lin 		sizeof("rsacer"), attributes, size);
348564654ebSJason Zhu }
349564654ebSJason Zhu 
350ae8ec5e1SHisping Lin uint32_t trusty_read_lock_state(uint8_t *lock_state)
351ae8ec5e1SHisping Lin {
352c7de5349SHisping Lin 	return trusty_base_read_security_data("lock_state",
353c7de5349SHisping Lin 		sizeof("lock_state"), lock_state, 1);
354ae8ec5e1SHisping Lin }
355ae8ec5e1SHisping Lin 
356ae8ec5e1SHisping Lin uint32_t trusty_write_lock_state(uint8_t lock_state)
357ae8ec5e1SHisping Lin {
358c7de5349SHisping Lin 	return trusty_base_write_security_data("lock_state",
359c7de5349SHisping Lin 		sizeof("lock_state"), &lock_state, 1);
360ae8ec5e1SHisping Lin }
361ae8ec5e1SHisping Lin 
362ae8ec5e1SHisping Lin uint32_t trusty_read_flash_lock_state(uint8_t *flash_lock_state)
363ae8ec5e1SHisping Lin {
364c7de5349SHisping Lin 	return trusty_base_read_security_data("flash_lock_state",
365c7de5349SHisping Lin 		sizeof("flash_lock_state"), flash_lock_state, 1);
366c7de5349SHisping Lin }
367c7de5349SHisping Lin 
368c7de5349SHisping Lin uint32_t trusty_write_flash_lock_state(uint8_t flash_lock_state)
369c7de5349SHisping Lin {
370c7de5349SHisping Lin 	return trusty_base_write_security_data("flash_lock_state",
371c7de5349SHisping Lin 		sizeof("flash_lock_state"), &flash_lock_state, 1);
372c7de5349SHisping Lin }
373c7de5349SHisping Lin 
374c7de5349SHisping Lin static uint32_t trusty_base_end_efuse_or_otp(void)
375c7de5349SHisping Lin {
376ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
377ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
378ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
379ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
380c7de5349SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
381c7de5349SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
382c7de5349SHisping Lin 
383ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
384ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
385ae8ec5e1SHisping Lin 
386f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
387f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
388f4e1db95SHisping Lin 		return TeecResult;
389ae8ec5e1SHisping Lin 
390ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
391f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
392f4e1db95SHisping Lin 		return TeecResult;
393ae8ec5e1SHisping Lin 
394ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
395ae8ec5e1SHisping Lin 				      &TeecSession,
396ae8ec5e1SHisping Lin 				      TeecUuid,
397ae8ec5e1SHisping Lin 				      TEEC_LOGIN_PUBLIC,
398ae8ec5e1SHisping Lin 				      NULL,
399c7de5349SHisping Lin 				      NULL,
400ae8ec5e1SHisping Lin 				      &ErrorOrigin);
401f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
402f4e1db95SHisping Lin 		return TeecResult;
403ae8ec5e1SHisping Lin 
404c7de5349SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE,
405c7de5349SHisping Lin 						    TEEC_NONE,
406ae8ec5e1SHisping Lin 						    TEEC_NONE,
407ae8ec5e1SHisping Lin 						    TEEC_NONE);
408ae8ec5e1SHisping Lin 
409ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
410c7de5349SHisping Lin 					STORAGE_CMD_UBOOT_END_OTP,
411ae8ec5e1SHisping Lin 					&TeecOperation,
412ae8ec5e1SHisping Lin 					&ErrorOrigin);
413c7de5349SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
414c7de5349SHisping Lin 		goto exit;
415f4e1db95SHisping Lin exit:
416ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
41746b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
418ae8ec5e1SHisping Lin 
419ae8ec5e1SHisping Lin 	return TeecResult;
420ae8ec5e1SHisping Lin }
421ae8ec5e1SHisping Lin 
422c7de5349SHisping Lin static uint32_t trusty_base_efuse_or_otp_operation(uint32_t cmd,
423c7de5349SHisping Lin 						   uint8_t is_write,
424c7de5349SHisping Lin 						   uint32_t *buf,
425c7de5349SHisping Lin 						   uint32_t length)
426ae8ec5e1SHisping Lin {
427ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
428ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
429ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
430ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
431c7de5349SHisping Lin 
432c7de5349SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8,
433c7de5349SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
434ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
435ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
436ae8ec5e1SHisping Lin 
437f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
438f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
439f4e1db95SHisping Lin 		return TeecResult;
440ae8ec5e1SHisping Lin 
441ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
442f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
443f4e1db95SHisping Lin 		return TeecResult;
444ae8ec5e1SHisping Lin 
445ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
446ae8ec5e1SHisping Lin 				&TeecSession,
447ae8ec5e1SHisping Lin 				TeecUuid,
448ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
449ae8ec5e1SHisping Lin 				NULL,
450c7de5349SHisping Lin 				NULL,
451ae8ec5e1SHisping Lin 				&ErrorOrigin);
452f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
453f4e1db95SHisping Lin 		return TeecResult;
454ae8ec5e1SHisping Lin 
455ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
456ae8ec5e1SHisping Lin 
457c7de5349SHisping Lin 	SharedMem0.size = length * sizeof(uint32_t);
458ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
459ae8ec5e1SHisping Lin 
460ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
461f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
462f4e1db95SHisping Lin 		goto exit;
463ae8ec5e1SHisping Lin 
464ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
465ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
466ae8ec5e1SHisping Lin 
467c7de5349SHisping Lin 	if (is_write) {
468c7de5349SHisping Lin 		memcpy(SharedMem0.buffer, buf, SharedMem0.size);
469ae8ec5e1SHisping Lin 		TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
470c7de5349SHisping Lin 							    TEEC_NONE,
471ae8ec5e1SHisping Lin 							    TEEC_NONE,
472ae8ec5e1SHisping Lin 							    TEEC_NONE);
473ae8ec5e1SHisping Lin 
474c7de5349SHisping Lin 	} else {
475c7de5349SHisping Lin 		TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT,
476c7de5349SHisping Lin 							    TEEC_NONE,
477c7de5349SHisping Lin 							    TEEC_NONE,
478c7de5349SHisping Lin 							    TEEC_NONE);
479c7de5349SHisping Lin 	}
480c7de5349SHisping Lin 
481ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
482c7de5349SHisping Lin 					cmd,
483ae8ec5e1SHisping Lin 					&TeecOperation,
484ae8ec5e1SHisping Lin 					&ErrorOrigin);
485f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
486f4e1db95SHisping Lin 		goto exit;
487c7de5349SHisping Lin 
488c7de5349SHisping Lin 	if (!is_write)
489c7de5349SHisping Lin 		memcpy(buf, SharedMem0.buffer, SharedMem0.size);
490c7de5349SHisping Lin 
491f4e1db95SHisping Lin exit:
492ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
493ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
49446b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
495ae8ec5e1SHisping Lin 
496ae8ec5e1SHisping Lin 	return TeecResult;
497ae8ec5e1SHisping Lin }
498ae8ec5e1SHisping Lin 
4996ef445a4SHisping Lin uint32_t trusty_read_attribute_hash(uint32_t *buf, uint32_t length)
5006ef445a4SHisping Lin {
501c7de5349SHisping Lin 	return trusty_base_efuse_or_otp_operation(STORAGE_CMD_READ_ATTRIBUTE_HASH,
502c7de5349SHisping Lin 						  false, buf, length);
5036ef445a4SHisping Lin }
5046ef445a4SHisping Lin 
5056ef445a4SHisping Lin uint32_t trusty_write_attribute_hash(uint32_t *buf, uint32_t length)
5066ef445a4SHisping Lin {
507c7de5349SHisping Lin 	return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_ATTRIBUTE_HASH,
508c7de5349SHisping Lin 						  true, buf, length);
50916539616SHisping Lin }
51016539616SHisping Lin 
51116539616SHisping Lin uint32_t trusty_notify_optee_uboot_end(void)
51216539616SHisping Lin {
51316539616SHisping Lin 	TEEC_Result res;
514c7de5349SHisping Lin 
515c7de5349SHisping Lin 	res = trusty_base_end_security_data();
516c7de5349SHisping Lin 	res |= trusty_base_end_efuse_or_otp();
51716539616SHisping Lin 	return res;
51816539616SHisping Lin }
5192cd27853SHisping Lin 
5202cd27853SHisping Lin uint32_t trusty_read_vbootkey_hash(uint32_t *buf, uint32_t length)
5212cd27853SHisping Lin {
522c7de5349SHisping Lin 	return trusty_base_efuse_or_otp_operation(STORAGE_CMD_READ_VBOOTKEY_HASH,
523c7de5349SHisping Lin 						  false, buf, length);
5242cd27853SHisping Lin }
525c7de5349SHisping Lin 
5262cd27853SHisping Lin uint32_t trusty_write_vbootkey_hash(uint32_t *buf, uint32_t length)
5272cd27853SHisping Lin {
528c7de5349SHisping Lin 	return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_VBOOTKEY_HASH,
529c7de5349SHisping Lin 						  true, buf, length);
5302cd27853SHisping Lin }
531095e2a82SHisping Lin 
532468df3b2SHisping Lin uint32_t trusty_read_vbootkey_enable_flag(uint8_t *flag)
533468df3b2SHisping Lin {
534468df3b2SHisping Lin 	uint32_t bootflag;
535c7de5349SHisping Lin 	TEEC_Result TeecResult;
536468df3b2SHisping Lin 
537c7de5349SHisping Lin 	TeecResult = trusty_base_efuse_or_otp_operation(STORAGE_CMD_READ_ENABLE_FLAG,
538c7de5349SHisping Lin 							false, &bootflag, 1);
539468df3b2SHisping Lin 
540468df3b2SHisping Lin 	if (TeecResult == TEEC_SUCCESS) {
5410202ee8aSHisping Lin #if defined(CONFIG_ROCKCHIP_RK3288)
5420202ee8aSHisping Lin 		if (bootflag == 0x00000001)
5430202ee8aSHisping Lin 			*flag = 1;
5440202ee8aSHisping Lin #else
545468df3b2SHisping Lin 		if (bootflag == 0x000000FF)
546468df3b2SHisping Lin 			*flag = 1;
5470202ee8aSHisping Lin #endif
548468df3b2SHisping Lin 	}
549095e2a82SHisping Lin 	return TeecResult;
550095e2a82SHisping Lin }
5514aa61755SAndy Ye 
552*1ef63c75SHisping Lin uint32_t trusty_write_ta_encryption_key(uint32_t *buf, uint32_t length)
553*1ef63c75SHisping Lin {
554*1ef63c75SHisping Lin 	return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_TA_ENCRYPTION_KEY,
555*1ef63c75SHisping Lin 						  true, buf, length);
556*1ef63c75SHisping Lin }
557*1ef63c75SHisping Lin 
5584aa61755SAndy Ye uint32_t trusty_attest_dh(uint8_t *dh, uint32_t *dh_size)
5594aa61755SAndy Ye {
5604aa61755SAndy Ye 	TEEC_Result TeecResult;
5614aa61755SAndy Ye 	TEEC_Context TeecContext;
5624aa61755SAndy Ye 	TEEC_Session TeecSession;
5634aa61755SAndy Ye 	uint32_t ErrorOrigin;
5644aa61755SAndy Ye 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
5654aa61755SAndy Ye 				{ 0xa8, 0x69, 0x9c, 0xe6,
5664aa61755SAndy Ye 				  0x88, 0x6c, 0x5d, 0x5d
5674aa61755SAndy Ye 				}
5684aa61755SAndy Ye 			     };
5694aa61755SAndy Ye 	TEEC_UUID *TeecUuid = &tempuuid;
5704aa61755SAndy Ye 	TEEC_Operation TeecOperation = {0};
5713251364cSHisping Lin 	struct blk_desc *dev_desc;
5723251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
5736651d4c0SJason Zhu 	if (!dev_desc) {
5746651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
5756651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
5766651d4c0SJason Zhu 	}
5774aa61755SAndy Ye 
578f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
579f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
580f4e1db95SHisping Lin 		return TeecResult;
5814aa61755SAndy Ye 
5824aa61755SAndy Ye 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
583f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
584f4e1db95SHisping Lin 		return TeecResult;
5854aa61755SAndy Ye 
5863251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
5873251364cSHisping Lin 						TEEC_NONE,
5883251364cSHisping Lin 						TEEC_NONE,
5893251364cSHisping Lin 						TEEC_NONE);
5903251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
591b9a7e756SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)
592b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 1;
593b9a7e756SHisping Lin 	else
594b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 0;
595b9a7e756SHisping Lin 
5963251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
5973251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
5983251364cSHisping Lin #endif
5993251364cSHisping Lin 
6004aa61755SAndy Ye 	TeecResult = TEEC_OpenSession(&TeecContext,
6014aa61755SAndy Ye 				      &TeecSession,
6024aa61755SAndy Ye 				      TeecUuid,
6034aa61755SAndy Ye 				      TEEC_LOGIN_PUBLIC,
6044aa61755SAndy Ye 				      NULL,
6053251364cSHisping Lin 					&TeecOperation,
6064aa61755SAndy Ye 				      &ErrorOrigin);
607f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
608f4e1db95SHisping Lin 		return TeecResult;
6094aa61755SAndy Ye 
6104aa61755SAndy Ye 	TEEC_SharedMemory SharedMem0 = {0};
6114aa61755SAndy Ye 
6124aa61755SAndy Ye 	SharedMem0.size = *dh_size;
6134aa61755SAndy Ye 	SharedMem0.flags = 0;
6144aa61755SAndy Ye 
6154aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
616f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
617f4e1db95SHisping Lin 		goto exit;
6184aa61755SAndy Ye 
6194aa61755SAndy Ye 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
6204aa61755SAndy Ye 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
6214aa61755SAndy Ye 
6224aa61755SAndy Ye 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT,
6234aa61755SAndy Ye 						    TEEC_NONE,
6244aa61755SAndy Ye 						    TEEC_NONE,
6254aa61755SAndy Ye 						    TEEC_NONE);
6264aa61755SAndy Ye 
6274aa61755SAndy Ye 	TeecResult = TEEC_InvokeCommand(&TeecSession,
6284aa61755SAndy Ye 					143,
6294aa61755SAndy Ye 					&TeecOperation,
6304aa61755SAndy Ye 					&ErrorOrigin);
631f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
632f4e1db95SHisping Lin 		goto exit;
6334aa61755SAndy Ye 
6344aa61755SAndy Ye 	*dh_size = TeecOperation.params[0].tmpref.size;
6354aa61755SAndy Ye 	memcpy(dh, SharedMem0.buffer, SharedMem0.size);
636f4e1db95SHisping Lin exit:
6374aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem0);
6384aa61755SAndy Ye 	TEEC_CloseSession(&TeecSession);
639f4e1db95SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
6404aa61755SAndy Ye 
6414aa61755SAndy Ye 	return TeecResult;
6424aa61755SAndy Ye }
6434aa61755SAndy Ye 
6444aa61755SAndy Ye uint32_t trusty_attest_uuid(uint8_t *uuid, uint32_t *uuid_size)
6454aa61755SAndy Ye {
6464aa61755SAndy Ye 	TEEC_Result TeecResult;
6474aa61755SAndy Ye 	TEEC_Context TeecContext;
6484aa61755SAndy Ye 	TEEC_Session TeecSession;
6494aa61755SAndy Ye 	uint32_t ErrorOrigin;
6504aa61755SAndy Ye 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
6514aa61755SAndy Ye 				{ 0xa8, 0x69, 0x9c, 0xe6,
6524aa61755SAndy Ye 				  0x88, 0x6c, 0x5d, 0x5d
6534aa61755SAndy Ye 				}
6544aa61755SAndy Ye 			     };
6554aa61755SAndy Ye 	TEEC_UUID *TeecUuid = &tempuuid;
6564aa61755SAndy Ye 	TEEC_Operation TeecOperation = {0};
6573251364cSHisping Lin 	struct blk_desc *dev_desc;
6583251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
6596651d4c0SJason Zhu 	if (!dev_desc) {
6606651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
6616651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
6626651d4c0SJason Zhu 	}
6634aa61755SAndy Ye 
664f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
665f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
666f4e1db95SHisping Lin 		return TeecResult;
6674aa61755SAndy Ye 
6684aa61755SAndy Ye 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
669f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
670f4e1db95SHisping Lin 		return TeecResult;
6714aa61755SAndy Ye 
6723251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
6733251364cSHisping Lin 						TEEC_NONE,
6743251364cSHisping Lin 						TEEC_NONE,
6753251364cSHisping Lin 						TEEC_NONE);
6763251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
677b9a7e756SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)
678b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 1;
679b9a7e756SHisping Lin 	else
680b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 0;
681b9a7e756SHisping Lin 
6823251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
6833251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
6843251364cSHisping Lin #endif
6853251364cSHisping Lin 
6864aa61755SAndy Ye 	TeecResult = TEEC_OpenSession(&TeecContext,
6874aa61755SAndy Ye 				      &TeecSession,
6884aa61755SAndy Ye 				      TeecUuid,
6894aa61755SAndy Ye 				      TEEC_LOGIN_PUBLIC,
6904aa61755SAndy Ye 				      NULL,
6913251364cSHisping Lin 					&TeecOperation,
6924aa61755SAndy Ye 				      &ErrorOrigin);
693f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
694f4e1db95SHisping Lin 		return TeecResult;
6954aa61755SAndy Ye 
6964aa61755SAndy Ye 	TEEC_SharedMemory SharedMem0 = {0};
6974aa61755SAndy Ye 
6984aa61755SAndy Ye 	SharedMem0.size = *uuid_size;
6994aa61755SAndy Ye 	SharedMem0.flags = 0;
7004aa61755SAndy Ye 
7014aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
702f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
703f4e1db95SHisping Lin 		goto exit;
7044aa61755SAndy Ye 
7054aa61755SAndy Ye 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
7064aa61755SAndy Ye 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
7074aa61755SAndy Ye 
7084aa61755SAndy Ye 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT,
7094aa61755SAndy Ye 						    TEEC_NONE,
7104aa61755SAndy Ye 						    TEEC_NONE,
7114aa61755SAndy Ye 						    TEEC_NONE);
7124aa61755SAndy Ye 
7134aa61755SAndy Ye 	TeecResult = TEEC_InvokeCommand(&TeecSession,
7144aa61755SAndy Ye 					144,
7154aa61755SAndy Ye 					&TeecOperation,
7164aa61755SAndy Ye 					&ErrorOrigin);
717f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
718f4e1db95SHisping Lin 		goto exit;
7194aa61755SAndy Ye 
7204aa61755SAndy Ye 	*uuid_size = TeecOperation.params[0].tmpref.size;
7214aa61755SAndy Ye 	memcpy(uuid, SharedMem0.buffer, SharedMem0.size);
722f4e1db95SHisping Lin exit:
7234aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem0);
7244aa61755SAndy Ye 	TEEC_CloseSession(&TeecSession);
725f4e1db95SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
7264aa61755SAndy Ye 
7274aa61755SAndy Ye 	return TeecResult;
7284aa61755SAndy Ye }
7294aa61755SAndy Ye 
7304aa61755SAndy Ye uint32_t trusty_attest_get_ca(uint8_t *operation_start,
7314aa61755SAndy Ye 			      uint32_t *operation_size,
7324aa61755SAndy Ye 			      uint8_t *out,
7334aa61755SAndy Ye 			      uint32_t *out_len)
7344aa61755SAndy Ye {
7354aa61755SAndy Ye 	TEEC_Result TeecResult;
7364aa61755SAndy Ye 	TEEC_Context TeecContext;
7374aa61755SAndy Ye 	TEEC_Session TeecSession;
7384aa61755SAndy Ye 	uint32_t ErrorOrigin;
7394aa61755SAndy Ye 
7404aa61755SAndy Ye 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
7414aa61755SAndy Ye 				{ 0xa8, 0x69, 0x9c, 0xe6,
7424aa61755SAndy Ye 				  0x88, 0x6c, 0x5d, 0x5d
7434aa61755SAndy Ye 				}
7444aa61755SAndy Ye 			     };
7454aa61755SAndy Ye 
7464aa61755SAndy Ye 	TEEC_UUID *TeecUuid = &tempuuid;
7474aa61755SAndy Ye 	TEEC_Operation TeecOperation = {0};
7483251364cSHisping Lin 	struct blk_desc *dev_desc;
7493251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
7506651d4c0SJason Zhu 	if (!dev_desc) {
7516651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
7526651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
7536651d4c0SJason Zhu 	}
7544aa61755SAndy Ye 
755f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
756f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
757f4e1db95SHisping Lin 		return TeecResult;
7584aa61755SAndy Ye 
7594aa61755SAndy Ye 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
760f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
761f4e1db95SHisping Lin 		return TeecResult;
7624aa61755SAndy Ye 
7633251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
7643251364cSHisping Lin 						TEEC_NONE,
7653251364cSHisping Lin 						TEEC_NONE,
7663251364cSHisping Lin 						TEEC_NONE);
7673251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
768b9a7e756SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)
769b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 1;
770b9a7e756SHisping Lin 	else
771b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 0;
772b9a7e756SHisping Lin 
7733251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
7743251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
7753251364cSHisping Lin #endif
7763251364cSHisping Lin 
7774aa61755SAndy Ye 	TeecResult = TEEC_OpenSession(&TeecContext,
7784aa61755SAndy Ye 				      &TeecSession,
7794aa61755SAndy Ye 				      TeecUuid,
7804aa61755SAndy Ye 				      TEEC_LOGIN_PUBLIC,
7814aa61755SAndy Ye 				      NULL,
7823251364cSHisping Lin 					&TeecOperation,
7834aa61755SAndy Ye 				      &ErrorOrigin);
784f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
785f4e1db95SHisping Lin 		return TeecResult;
7864aa61755SAndy Ye 
7874aa61755SAndy Ye 	TEEC_SharedMemory SharedMem0 = {0};
7884aa61755SAndy Ye 
7894aa61755SAndy Ye 	SharedMem0.size = *operation_size;
7904aa61755SAndy Ye 	SharedMem0.flags = 0;
7914aa61755SAndy Ye 
7924aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
793f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
794f4e1db95SHisping Lin 		goto exit;
7954aa61755SAndy Ye 
7964aa61755SAndy Ye 	memcpy(SharedMem0.buffer, operation_start, SharedMem0.size);
7974aa61755SAndy Ye 
7984aa61755SAndy Ye 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
7994aa61755SAndy Ye 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
8004aa61755SAndy Ye 
8014aa61755SAndy Ye 	TEEC_SharedMemory SharedMem1 = {0};
8024aa61755SAndy Ye 
8034aa61755SAndy Ye 	SharedMem1.size = *out_len;
8044aa61755SAndy Ye 	SharedMem1.flags = 0;
8054aa61755SAndy Ye 
8064aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
807f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
808f4e1db95SHisping Lin 		goto exit;
8094aa61755SAndy Ye 
8104aa61755SAndy Ye 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
8114aa61755SAndy Ye 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
8124aa61755SAndy Ye 
8134aa61755SAndy Ye 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT,
8144aa61755SAndy Ye 						    TEEC_MEMREF_TEMP_INOUT,
8154aa61755SAndy Ye 						    TEEC_NONE,
8164aa61755SAndy Ye 						    TEEC_NONE);
8174aa61755SAndy Ye 
8184aa61755SAndy Ye 	TeecResult = TEEC_InvokeCommand(&TeecSession,
8194aa61755SAndy Ye 					145,
8204aa61755SAndy Ye 					&TeecOperation,
8214aa61755SAndy Ye 					&ErrorOrigin);
822f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
823f4e1db95SHisping Lin 		goto exit;
8244aa61755SAndy Ye 
8254aa61755SAndy Ye 	*out_len = TeecOperation.params[1].tmpref.size;
8264aa61755SAndy Ye 	memcpy(out, SharedMem1.buffer, SharedMem1.size);
827f4e1db95SHisping Lin exit:
8284aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem0);
8294aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem1);
830f4e1db95SHisping Lin 	TEEC_CloseSession(&TeecSession);
831f4e1db95SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
8324aa61755SAndy Ye 
8334aa61755SAndy Ye 	return TeecResult;
8344aa61755SAndy Ye }
8354aa61755SAndy Ye 
8364aa61755SAndy Ye uint32_t trusty_attest_set_ca(uint8_t *ca_response, uint32_t *ca_response_size)
8374aa61755SAndy Ye {
8384aa61755SAndy Ye 	TEEC_Result TeecResult;
8394aa61755SAndy Ye 	TEEC_Context TeecContext;
8404aa61755SAndy Ye 	TEEC_Session TeecSession;
8414aa61755SAndy Ye 	uint32_t ErrorOrigin;
8424aa61755SAndy Ye 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
8434aa61755SAndy Ye 				{ 0xa8, 0x69, 0x9c, 0xe6,
8444aa61755SAndy Ye 				  0x88, 0x6c, 0x5d, 0x5d
8454aa61755SAndy Ye 				}
8464aa61755SAndy Ye 			     };
8474aa61755SAndy Ye 	TEEC_UUID *TeecUuid = &tempuuid;
8484aa61755SAndy Ye 	TEEC_Operation TeecOperation = {0};
8493251364cSHisping Lin 	struct blk_desc *dev_desc;
8503251364cSHisping Lin 	dev_desc = rockchip_get_bootdev();
8516651d4c0SJason Zhu 	if (!dev_desc) {
8526651d4c0SJason Zhu 		printf("%s: dev_desc is NULL!\n", __func__);
8536651d4c0SJason Zhu 		return -TEEC_ERROR_GENERIC;
8546651d4c0SJason Zhu 	}
855f4e1db95SHisping Lin 	TeecResult = OpteeClientApiLibInitialize();
856f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
857f4e1db95SHisping Lin 		return TeecResult;
8584aa61755SAndy Ye 
8594aa61755SAndy Ye 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
860f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
861f4e1db95SHisping Lin 		return TeecResult;
8624aa61755SAndy Ye 
8633251364cSHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
8643251364cSHisping Lin 						TEEC_NONE,
8653251364cSHisping Lin 						TEEC_NONE,
8663251364cSHisping Lin 						TEEC_NONE);
8673251364cSHisping Lin 	/*0 nand or emmc "security" partition , 1 rpmb*/
868b9a7e756SHisping Lin 	if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0)
869b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 1;
870b9a7e756SHisping Lin 	else
871b9a7e756SHisping Lin 		TeecOperation.params[0].value.a = 0;
872b9a7e756SHisping Lin 
8733251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
8743251364cSHisping Lin 	TeecOperation.params[0].value.a = 0;
8753251364cSHisping Lin #endif
8763251364cSHisping Lin 
8774aa61755SAndy Ye 	TeecResult = TEEC_OpenSession(&TeecContext,
8784aa61755SAndy Ye 					&TeecSession,
8794aa61755SAndy Ye 					TeecUuid,
8804aa61755SAndy Ye 					TEEC_LOGIN_PUBLIC,
8814aa61755SAndy Ye 					NULL,
8823251364cSHisping Lin 					&TeecOperation,
8834aa61755SAndy Ye 					&ErrorOrigin);
884f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
885f4e1db95SHisping Lin 		return TeecResult;
8864aa61755SAndy Ye 
8874aa61755SAndy Ye 	TEEC_SharedMemory SharedMem0 = {0};
8884aa61755SAndy Ye 
8894aa61755SAndy Ye 	SharedMem0.size = *ca_response_size;
8904aa61755SAndy Ye 	SharedMem0.flags = 0;
8914aa61755SAndy Ye 
8924aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
893f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
894f4e1db95SHisping Lin 		goto exit;
8954aa61755SAndy Ye 
8964aa61755SAndy Ye 	memcpy(SharedMem0.buffer, ca_response, SharedMem0.size);
8974aa61755SAndy Ye 
8984aa61755SAndy Ye 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
8994aa61755SAndy Ye 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
9004aa61755SAndy Ye 
9014aa61755SAndy Ye 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT,
9024aa61755SAndy Ye 						    TEEC_NONE,
9034aa61755SAndy Ye 						    TEEC_NONE,
9044aa61755SAndy Ye 						    TEEC_NONE);
9054aa61755SAndy Ye 
9064aa61755SAndy Ye 	TeecResult = TEEC_InvokeCommand(&TeecSession,
9074aa61755SAndy Ye 					146,
9084aa61755SAndy Ye 					&TeecOperation,
9094aa61755SAndy Ye 					&ErrorOrigin);
910f4e1db95SHisping Lin 	if (TeecResult != TEEC_SUCCESS)
911f4e1db95SHisping Lin 		goto exit;
912f4e1db95SHisping Lin exit:
9134aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem0);
9144aa61755SAndy Ye 	TEEC_CloseSession(&TeecSession);
915f4e1db95SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
9164aa61755SAndy Ye 
9174aa61755SAndy Ye 	return TeecResult;
9184aa61755SAndy Ye }
919