xref: /rk3399_rockchip-uboot/lib/optee_clientApi/OpteeClientInterface.c (revision 1f25ada2a8eccef6ea3d9844a40d05d7ce7027d4)
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>
11ae8ec5e1SHisping Lin 
12ae8ec5e1SHisping Lin void test_optee(void)
13ae8ec5e1SHisping Lin {
14ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
15ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
16ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
17ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
18ae8ec5e1SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
19ae8ec5e1SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
20ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
21ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
22ae8ec5e1SHisping Lin 
23ae8ec5e1SHisping Lin 	debug("testmm start\n");
24ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
25ae8ec5e1SHisping Lin 
26ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
27ae8ec5e1SHisping Lin 
28ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
29ae8ec5e1SHisping Lin 				&TeecSession,
30ae8ec5e1SHisping Lin 				TeecUuid,
31ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
32ae8ec5e1SHisping Lin 				NULL,
33ae8ec5e1SHisping Lin 				NULL,
34ae8ec5e1SHisping Lin 				&ErrorOrigin);
35ae8ec5e1SHisping Lin 
36ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
37ae8ec5e1SHisping Lin 
38ae8ec5e1SHisping Lin 	SharedMem0.size = sizeof("filename_test");
39ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
40ae8ec5e1SHisping Lin 
41ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
42ae8ec5e1SHisping Lin 
43ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, "filename_test", SharedMem0.size);
44ae8ec5e1SHisping Lin 
45ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
46ae8ec5e1SHisping Lin 
47ae8ec5e1SHisping Lin 	SharedMem1.size = 32;
48ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
49ae8ec5e1SHisping Lin 
50ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
51ae8ec5e1SHisping Lin 
52ae8ec5e1SHisping Lin 	memset(SharedMem1.buffer, 'a', SharedMem1.size);
53ae8ec5e1SHisping Lin 
54ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
55ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
56ae8ec5e1SHisping Lin 
57ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
58ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
59ae8ec5e1SHisping Lin 
60ae8ec5e1SHisping Lin 
61ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
62ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
63ae8ec5e1SHisping Lin 						TEEC_NONE,
64ae8ec5e1SHisping Lin 						TEEC_NONE);
65ae8ec5e1SHisping Lin 
66ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
67ae8ec5e1SHisping Lin 					1,
68ae8ec5e1SHisping Lin 					&TeecOperation,
69ae8ec5e1SHisping Lin 					&ErrorOrigin);
70ae8ec5e1SHisping Lin 
71ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
72ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
73ae8ec5e1SHisping Lin 
74ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
75ae8ec5e1SHisping Lin 
7646b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
77ae8ec5e1SHisping Lin 
78ae8ec5e1SHisping Lin 	debug("testmm end\n");
79ae8ec5e1SHisping Lin 	debug("TeecResult %x\n", TeecResult);
80ae8ec5e1SHisping Lin }
81ae8ec5e1SHisping Lin 
82ae8ec5e1SHisping Lin static uint8_t b2hs_add_base(uint8_t in)
83ae8ec5e1SHisping Lin {
84ae8ec5e1SHisping Lin 	if (in > 9)
85ae8ec5e1SHisping Lin 		return in + 55;
86ae8ec5e1SHisping Lin 	else
87ae8ec5e1SHisping Lin 		return in + 48;
88ae8ec5e1SHisping Lin }
89ae8ec5e1SHisping Lin 
90ae8ec5e1SHisping Lin uint32_t b2hs(uint8_t *b, uint8_t *hs, uint32_t blen, uint32_t hslen)
91ae8ec5e1SHisping Lin {
92ae8ec5e1SHisping Lin 	uint32_t i = 0;
93ae8ec5e1SHisping Lin 
94ae8ec5e1SHisping Lin 	if (blen * 2 + 1 > hslen)
95ae8ec5e1SHisping Lin 		return 0;
96ae8ec5e1SHisping Lin 
97ae8ec5e1SHisping Lin 	for (; i < blen; i++) {
98ae8ec5e1SHisping Lin 		hs[i * 2 + 1] = b2hs_add_base(b[i] & 0xf);
99ae8ec5e1SHisping Lin 		hs[i * 2] = b2hs_add_base(b[i] >> 4);
100ae8ec5e1SHisping Lin 	}
101ae8ec5e1SHisping Lin 	hs[blen * 2] = 0;
102ae8ec5e1SHisping Lin 
103ae8ec5e1SHisping Lin 	return blen * 2;
104ae8ec5e1SHisping Lin }
105ae8ec5e1SHisping Lin 
106ae8ec5e1SHisping Lin 
107ae8ec5e1SHisping Lin uint32_t trusty_read_rollback_index(uint32_t slot, uint64_t *value)
108ae8ec5e1SHisping Lin {
109ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
110ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
111ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
112ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
113ae8ec5e1SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
114ae8ec5e1SHisping Lin 			{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
115ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
116ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
117ae8ec5e1SHisping Lin 	uint8_t hs[9];
118ae8ec5e1SHisping Lin 
119ae8ec5e1SHisping Lin 	b2hs((uint8_t *)&slot, hs, 4, 9);
120ae8ec5e1SHisping Lin 	debug("testmm start\n");
121ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
122ae8ec5e1SHisping Lin 
123ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
124ae8ec5e1SHisping Lin 
125ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
126ae8ec5e1SHisping Lin 				&TeecSession,
127ae8ec5e1SHisping Lin 				TeecUuid,
128ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
129ae8ec5e1SHisping Lin 				NULL,
130ae8ec5e1SHisping Lin 				NULL,
131ae8ec5e1SHisping Lin 				&ErrorOrigin);
132ae8ec5e1SHisping Lin 
133ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
134ae8ec5e1SHisping Lin 
135ae8ec5e1SHisping Lin 	SharedMem0.size = 8;
136ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
137ae8ec5e1SHisping Lin 
138ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
139ae8ec5e1SHisping Lin 
140ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, hs, SharedMem0.size);
141ae8ec5e1SHisping Lin 
142ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
143ae8ec5e1SHisping Lin 
144ae8ec5e1SHisping Lin 	SharedMem1.size = 8;
145ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
146ae8ec5e1SHisping Lin 
147ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
148ae8ec5e1SHisping Lin 
149ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
150ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
151ae8ec5e1SHisping Lin 
152ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
153ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
154ae8ec5e1SHisping Lin 
155ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
156ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
157ae8ec5e1SHisping Lin 						TEEC_NONE,
158ae8ec5e1SHisping Lin 						TEEC_NONE);
159ae8ec5e1SHisping Lin 
160ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
161ae8ec5e1SHisping Lin 					0,
162ae8ec5e1SHisping Lin 					&TeecOperation,
163ae8ec5e1SHisping Lin 					&ErrorOrigin);
16446b2a054SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
165ae8ec5e1SHisping Lin 		memcpy((char *)value, SharedMem1.buffer, SharedMem1.size);
166ae8ec5e1SHisping Lin 
167ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
168ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
169ae8ec5e1SHisping Lin 
170ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
171ae8ec5e1SHisping Lin 
17246b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
173ae8ec5e1SHisping Lin 
174ae8ec5e1SHisping Lin 	debug("testmm end\n");
175ae8ec5e1SHisping Lin 	return TeecResult;
176ae8ec5e1SHisping Lin }
177ae8ec5e1SHisping Lin 
178ae8ec5e1SHisping Lin uint32_t trusty_write_rollback_index(uint32_t slot, uint64_t value)
179ae8ec5e1SHisping Lin {
180ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
181ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
182ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
183ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
184ae8ec5e1SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
185ae8ec5e1SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
186ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
187ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
188ae8ec5e1SHisping Lin 	uint8_t hs[9];
189ae8ec5e1SHisping Lin 	b2hs((uint8_t *)&slot, hs, 4, 9);
190ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
191ae8ec5e1SHisping Lin 
192ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
193ae8ec5e1SHisping Lin 
194ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
195ae8ec5e1SHisping Lin 				&TeecSession,
196ae8ec5e1SHisping Lin 				TeecUuid,
197ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
198ae8ec5e1SHisping Lin 				NULL,
199ae8ec5e1SHisping Lin 				NULL,
200ae8ec5e1SHisping Lin 				&ErrorOrigin);
201ae8ec5e1SHisping Lin 
202ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
203ae8ec5e1SHisping Lin 
204ae8ec5e1SHisping Lin 	SharedMem0.size = 8;
205ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
206ae8ec5e1SHisping Lin 
207ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
208ae8ec5e1SHisping Lin 
209ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, hs, SharedMem0.size);
210ae8ec5e1SHisping Lin 
211ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
212ae8ec5e1SHisping Lin 
213ae8ec5e1SHisping Lin 	SharedMem1.size = 8;
214ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
215ae8ec5e1SHisping Lin 
216ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
217ae8ec5e1SHisping Lin 
218ae8ec5e1SHisping Lin 	memcpy(SharedMem1.buffer, (char *)&value, SharedMem1.size);
219ae8ec5e1SHisping Lin 
220ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
221ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
222ae8ec5e1SHisping Lin 
223ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
224ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
225ae8ec5e1SHisping Lin 
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 					1,
234ae8ec5e1SHisping Lin 					&TeecOperation,
235ae8ec5e1SHisping Lin 					&ErrorOrigin);
236ae8ec5e1SHisping Lin 
237ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
238ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
239ae8ec5e1SHisping Lin 
240ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
241ae8ec5e1SHisping Lin 
24246b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
243ae8ec5e1SHisping Lin 
244ae8ec5e1SHisping Lin 	debug("testmm end\n");
245ae8ec5e1SHisping Lin 
246ae8ec5e1SHisping Lin 	return TeecResult;
247ae8ec5e1SHisping Lin }
248ae8ec5e1SHisping Lin 
249ae8ec5e1SHisping Lin uint32_t trusty_read_permanent_attributes(uint8_t *attributes, uint32_t size)
250ae8ec5e1SHisping Lin {
251ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
252ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
253ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
254ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
25546b2a054SHisping Lin 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
25646b2a054SHisping Lin 		{ 0xa8, 0x69, 0x9c, 0xe6, 0x88, 0x6c, 0x5d, 0x5d } };
257ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
258ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
259ae8ec5e1SHisping Lin 
260ae8ec5e1SHisping Lin 	debug("testmm start\n");
261ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
262ae8ec5e1SHisping Lin 
263ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
264ae8ec5e1SHisping Lin 
265ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
266ae8ec5e1SHisping Lin 				&TeecSession,
267ae8ec5e1SHisping Lin 				TeecUuid,
268ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
269ae8ec5e1SHisping Lin 				NULL,
270ae8ec5e1SHisping Lin 				NULL,
271ae8ec5e1SHisping Lin 				&ErrorOrigin);
272ae8ec5e1SHisping Lin 
273ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
274ae8ec5e1SHisping Lin 
275ae8ec5e1SHisping Lin 	SharedMem0.size = sizeof("attributes");
276ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
277ae8ec5e1SHisping Lin 
278ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
279ae8ec5e1SHisping Lin 
280ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, "attributes", SharedMem0.size);
281ae8ec5e1SHisping Lin 
282ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
283ae8ec5e1SHisping Lin 
284ae8ec5e1SHisping Lin 	SharedMem1.size = size;
285ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
286ae8ec5e1SHisping Lin 
287ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
288ae8ec5e1SHisping Lin 
289ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
290ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
291ae8ec5e1SHisping Lin 
292ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
293ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
294ae8ec5e1SHisping Lin 
295ae8ec5e1SHisping Lin 
296ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
297ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
298ae8ec5e1SHisping Lin 						TEEC_NONE,
299ae8ec5e1SHisping Lin 						TEEC_NONE);
300ae8ec5e1SHisping Lin 
301ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
30246b2a054SHisping Lin 					142,
303ae8ec5e1SHisping Lin 					&TeecOperation,
304ae8ec5e1SHisping Lin 					&ErrorOrigin);
30546b2a054SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
306ae8ec5e1SHisping Lin 		memcpy(attributes, SharedMem1.buffer, SharedMem1.size);
307ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
308ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
309ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
31046b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
311ae8ec5e1SHisping Lin 	debug("testmm end\n");
312ae8ec5e1SHisping Lin 
313ae8ec5e1SHisping Lin 	return TeecResult;
314ae8ec5e1SHisping Lin }
315ae8ec5e1SHisping Lin 
316ae8ec5e1SHisping Lin uint32_t trusty_write_permanent_attributes(uint8_t *attributes, uint32_t size)
317ae8ec5e1SHisping Lin {
318ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
319ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
320ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
321ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
32246b2a054SHisping Lin 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
32346b2a054SHisping Lin 		{ 0xa8, 0x69, 0x9c, 0xe6, 0x88, 0x6c, 0x5d, 0x5d } };
324ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
325ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
326ae8ec5e1SHisping Lin 
327ae8ec5e1SHisping Lin 	debug("testmm start\n");
328ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
329ae8ec5e1SHisping Lin 
330ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
331ae8ec5e1SHisping Lin 
332ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
333ae8ec5e1SHisping Lin 				&TeecSession,
334ae8ec5e1SHisping Lin 				TeecUuid,
335ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
336ae8ec5e1SHisping Lin 				NULL,
337ae8ec5e1SHisping Lin 				NULL,
338ae8ec5e1SHisping Lin 				&ErrorOrigin);
339ae8ec5e1SHisping Lin 
340ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
341ae8ec5e1SHisping Lin 
342ae8ec5e1SHisping Lin 	SharedMem0.size = sizeof("attributes");
343ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
344ae8ec5e1SHisping Lin 
345ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
346ae8ec5e1SHisping Lin 
347ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, "attributes", SharedMem0.size);
348ae8ec5e1SHisping Lin 
349ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
350ae8ec5e1SHisping Lin 
351ae8ec5e1SHisping Lin 	SharedMem1.size = size;
352ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
353ae8ec5e1SHisping Lin 
354ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
355ae8ec5e1SHisping Lin 
356ae8ec5e1SHisping Lin 	memcpy(SharedMem1.buffer, attributes, SharedMem1.size);
357ae8ec5e1SHisping Lin 
358ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
359ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
360ae8ec5e1SHisping Lin 
361ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
362ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
363ae8ec5e1SHisping Lin 
364ae8ec5e1SHisping Lin 
365ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
366ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
367ae8ec5e1SHisping Lin 						TEEC_NONE,
368ae8ec5e1SHisping Lin 						TEEC_NONE);
369ae8ec5e1SHisping Lin 
370ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
37146b2a054SHisping Lin 					141,
372ae8ec5e1SHisping Lin 					&TeecOperation,
373ae8ec5e1SHisping Lin 					&ErrorOrigin);
374ae8ec5e1SHisping Lin 
375ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
376ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
377ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
37846b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
379ae8ec5e1SHisping Lin 	debug("testmm end\n");
380ae8ec5e1SHisping Lin 
381ae8ec5e1SHisping Lin 	return TeecResult;
382ae8ec5e1SHisping Lin }
383ae8ec5e1SHisping Lin 
384ae8ec5e1SHisping Lin uint32_t trusty_read_lock_state(uint8_t *lock_state)
385ae8ec5e1SHisping Lin {
386ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
387ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
388ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
389ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
390ae8ec5e1SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
391ae8ec5e1SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
392ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
393ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
394ae8ec5e1SHisping Lin 
395ae8ec5e1SHisping Lin 	debug("testmm start\n");
396ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
397ae8ec5e1SHisping Lin 
398ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
399ae8ec5e1SHisping Lin 
400ae8ec5e1SHisping Lin 
401ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
402ae8ec5e1SHisping Lin 				&TeecSession,
403ae8ec5e1SHisping Lin 				TeecUuid,
404ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
405ae8ec5e1SHisping Lin 				NULL,
406ae8ec5e1SHisping Lin 				NULL,
407ae8ec5e1SHisping Lin 				&ErrorOrigin);
408ae8ec5e1SHisping Lin 
409ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
410ae8ec5e1SHisping Lin 
411ae8ec5e1SHisping Lin 	SharedMem0.size = sizeof("lock_state");
412ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
413ae8ec5e1SHisping Lin 
414ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
415ae8ec5e1SHisping Lin 
416ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, "lock_state", SharedMem0.size);
417ae8ec5e1SHisping Lin 
418ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
419ae8ec5e1SHisping Lin 
420ae8ec5e1SHisping Lin 	SharedMem1.size = 1;
421ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
422ae8ec5e1SHisping Lin 
423ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
424ae8ec5e1SHisping Lin 
425ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
426ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
427ae8ec5e1SHisping Lin 
428ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
429ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
430ae8ec5e1SHisping Lin 
431ae8ec5e1SHisping Lin 
432ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
433ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
434ae8ec5e1SHisping Lin 						TEEC_NONE,
435ae8ec5e1SHisping Lin 						TEEC_NONE);
436ae8ec5e1SHisping Lin 
437ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
438ae8ec5e1SHisping Lin 					0,
439ae8ec5e1SHisping Lin 					&TeecOperation,
440ae8ec5e1SHisping Lin 					&ErrorOrigin);
44146b2a054SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
442ae8ec5e1SHisping Lin 		memcpy(lock_state, SharedMem1.buffer, SharedMem1.size);
443ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
444ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
445ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
44646b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
447ae8ec5e1SHisping Lin 	debug("testmm end\n");
448ae8ec5e1SHisping Lin 
449ae8ec5e1SHisping Lin 	return TeecResult;
450ae8ec5e1SHisping Lin }
451ae8ec5e1SHisping Lin 
452ae8ec5e1SHisping Lin uint32_t trusty_write_lock_state(uint8_t lock_state)
453ae8ec5e1SHisping Lin {
454ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
455ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
456ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
457ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
458ae8ec5e1SHisping Lin 	TEEC_UUID  tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
459ae8ec5e1SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
460ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
461ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
462ae8ec5e1SHisping Lin 
463ae8ec5e1SHisping Lin 	debug("testmm start\n");
464ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
465ae8ec5e1SHisping Lin 
466ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
467ae8ec5e1SHisping Lin 
468ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
469ae8ec5e1SHisping Lin 				&TeecSession,
470ae8ec5e1SHisping Lin 				TeecUuid,
471ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
472ae8ec5e1SHisping Lin 				NULL,
473ae8ec5e1SHisping Lin 				NULL,
474ae8ec5e1SHisping Lin 				&ErrorOrigin);
475ae8ec5e1SHisping Lin 
476ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
477ae8ec5e1SHisping Lin 
478ae8ec5e1SHisping Lin 	SharedMem0.size = sizeof("lock_state");
479ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
480ae8ec5e1SHisping Lin 
481ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
482ae8ec5e1SHisping Lin 
483ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, "lock_state", SharedMem0.size);
484ae8ec5e1SHisping Lin 
485ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
486ae8ec5e1SHisping Lin 
487ae8ec5e1SHisping Lin 	SharedMem1.size = 1;
488ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
489ae8ec5e1SHisping Lin 
490ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
491ae8ec5e1SHisping Lin 
492ae8ec5e1SHisping Lin 	memcpy(SharedMem1.buffer, &lock_state, SharedMem1.size);
493ae8ec5e1SHisping Lin 
494ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
495ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
496ae8ec5e1SHisping Lin 
497ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
498ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
499ae8ec5e1SHisping Lin 
500ae8ec5e1SHisping Lin 
501ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
502ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
503ae8ec5e1SHisping Lin 						TEEC_NONE,
504ae8ec5e1SHisping Lin 						TEEC_NONE);
505ae8ec5e1SHisping Lin 
506ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
507ae8ec5e1SHisping Lin 					1,
508ae8ec5e1SHisping Lin 					&TeecOperation,
509ae8ec5e1SHisping Lin 					&ErrorOrigin);
510ae8ec5e1SHisping Lin 
511ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
512ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
513ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
51446b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
515ae8ec5e1SHisping Lin 	debug("testmm end\n");
516ae8ec5e1SHisping Lin 
517ae8ec5e1SHisping Lin 	return TeecResult;
518ae8ec5e1SHisping Lin }
519ae8ec5e1SHisping Lin 
520ae8ec5e1SHisping Lin uint32_t trusty_read_flash_lock_state(uint8_t *flash_lock_state)
521ae8ec5e1SHisping Lin {
522ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
523ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
524ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
525ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
526ae8ec5e1SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
527ae8ec5e1SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
528ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
529ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
530ae8ec5e1SHisping Lin 
531ae8ec5e1SHisping Lin 	debug("testmm start\n");
532ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
533ae8ec5e1SHisping Lin 
534ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
535ae8ec5e1SHisping Lin 
536ae8ec5e1SHisping Lin 
537ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
538ae8ec5e1SHisping Lin 				&TeecSession,
539ae8ec5e1SHisping Lin 				TeecUuid,
540ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
541ae8ec5e1SHisping Lin 				NULL,
542ae8ec5e1SHisping Lin 				NULL,
543ae8ec5e1SHisping Lin 				&ErrorOrigin);
544ae8ec5e1SHisping Lin 
545ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
546ae8ec5e1SHisping Lin 
547ae8ec5e1SHisping Lin 	SharedMem0.size = sizeof("flash_lock_state");
548ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
549ae8ec5e1SHisping Lin 
550ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
551ae8ec5e1SHisping Lin 
552ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, "flash_lock_state", SharedMem0.size);
553ae8ec5e1SHisping Lin 
554ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
555ae8ec5e1SHisping Lin 
556ae8ec5e1SHisping Lin 	SharedMem1.size = 1;
557ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
558ae8ec5e1SHisping Lin 
559ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
560ae8ec5e1SHisping Lin 
561ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
562ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
563ae8ec5e1SHisping Lin 
564ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
565ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
566ae8ec5e1SHisping Lin 
567ae8ec5e1SHisping Lin 
568ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
569ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
570ae8ec5e1SHisping Lin 						TEEC_NONE,
571ae8ec5e1SHisping Lin 						TEEC_NONE);
572ae8ec5e1SHisping Lin 
573ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
574ae8ec5e1SHisping Lin 					0,
575ae8ec5e1SHisping Lin 					&TeecOperation,
576ae8ec5e1SHisping Lin 					&ErrorOrigin);
57746b2a054SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
578ae8ec5e1SHisping Lin 		memcpy(flash_lock_state, SharedMem1.buffer, SharedMem1.size);
579ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
580ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
581ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
58246b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
583ae8ec5e1SHisping Lin 	debug("testmm end\n");
584ae8ec5e1SHisping Lin 
585ae8ec5e1SHisping Lin 	return TeecResult;
586ae8ec5e1SHisping Lin }
587ae8ec5e1SHisping Lin 
588ae8ec5e1SHisping Lin 
589ae8ec5e1SHisping Lin uint32_t trusty_write_flash_lock_state(uint8_t flash_lock_state)
590ae8ec5e1SHisping Lin {
591ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
592ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
593ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
594ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
595ae8ec5e1SHisping Lin 	TEEC_UUID  tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
596ae8ec5e1SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
597ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
598ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
599ae8ec5e1SHisping Lin 
600ae8ec5e1SHisping Lin 	debug("testmm start\n");
601ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
602ae8ec5e1SHisping Lin 
603ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
604ae8ec5e1SHisping Lin 
605ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
606ae8ec5e1SHisping Lin 				&TeecSession,
607ae8ec5e1SHisping Lin 				TeecUuid,
608ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
609ae8ec5e1SHisping Lin 				NULL,
610ae8ec5e1SHisping Lin 				NULL,
611ae8ec5e1SHisping Lin 				&ErrorOrigin);
612ae8ec5e1SHisping Lin 
613ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
614ae8ec5e1SHisping Lin 
615ae8ec5e1SHisping Lin 	SharedMem0.size = sizeof("flash_lock_state");
616ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
617ae8ec5e1SHisping Lin 
618ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
619ae8ec5e1SHisping Lin 
620ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, "flash_lock_state", SharedMem0.size);
621ae8ec5e1SHisping Lin 
622ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
623ae8ec5e1SHisping Lin 
624ae8ec5e1SHisping Lin 	SharedMem1.size = 1;
625ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
626ae8ec5e1SHisping Lin 
627ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
628ae8ec5e1SHisping Lin 
629ae8ec5e1SHisping Lin 	memcpy(SharedMem1.buffer, &flash_lock_state, SharedMem1.size);
630ae8ec5e1SHisping Lin 
631ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
632ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
633ae8ec5e1SHisping Lin 
634ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
635ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
636ae8ec5e1SHisping Lin 
637ae8ec5e1SHisping Lin 
638ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
639ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
640ae8ec5e1SHisping Lin 						TEEC_NONE,
641ae8ec5e1SHisping Lin 						TEEC_NONE);
642ae8ec5e1SHisping Lin 
643ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
644ae8ec5e1SHisping Lin 					1,
645ae8ec5e1SHisping Lin 					&TeecOperation,
646ae8ec5e1SHisping Lin 					&ErrorOrigin);
647ae8ec5e1SHisping Lin 
648ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
649ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
650ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
65146b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
652ae8ec5e1SHisping Lin 	debug("testmm end\n");
653ae8ec5e1SHisping Lin 
654ae8ec5e1SHisping Lin 	return TeecResult;
655ae8ec5e1SHisping Lin }
656ae8ec5e1SHisping Lin 
657ae8ec5e1SHisping Lin uint32_t write_to_keymaster(uint8_t *filename,
658ae8ec5e1SHisping Lin 		uint32_t filename_size,
659ae8ec5e1SHisping Lin 		uint8_t *data,
660ae8ec5e1SHisping Lin 		uint32_t data_size)
661ae8ec5e1SHisping Lin {
662ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
663ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
664ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
665ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
666ae8ec5e1SHisping Lin 
667ae8ec5e1SHisping Lin 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
668ae8ec5e1SHisping Lin 		{ 0xa8, 0x69, 0x9c, 0xe6, 0x88, 0x6c, 0x5d, 0x5d } };
669ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
670ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
671ae8ec5e1SHisping Lin 
672ae8ec5e1SHisping Lin 	debug("write_to_keymaster\n");
673ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
674ae8ec5e1SHisping Lin 
675ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
676ae8ec5e1SHisping Lin 
677ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
678ae8ec5e1SHisping Lin 				&TeecSession,
679ae8ec5e1SHisping Lin 				TeecUuid,
680ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
681ae8ec5e1SHisping Lin 				NULL,
682ae8ec5e1SHisping Lin 				NULL,
683ae8ec5e1SHisping Lin 				&ErrorOrigin);
684ae8ec5e1SHisping Lin 
685ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
686ae8ec5e1SHisping Lin 
687ae8ec5e1SHisping Lin 	SharedMem0.size = filename_size;
688ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
689ae8ec5e1SHisping Lin 
690ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
691ae8ec5e1SHisping Lin 
692ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, filename, SharedMem0.size);
693ae8ec5e1SHisping Lin 
694ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
695ae8ec5e1SHisping Lin 
696ae8ec5e1SHisping Lin 	SharedMem1.size = data_size;
697ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
698ae8ec5e1SHisping Lin 
699ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
700ae8ec5e1SHisping Lin 
701ae8ec5e1SHisping Lin 	memcpy(SharedMem1.buffer, data, SharedMem1.size);
702ae8ec5e1SHisping Lin 
703ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
704ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
705ae8ec5e1SHisping Lin 
706ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
707ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
708ae8ec5e1SHisping Lin 
709ae8ec5e1SHisping Lin 
710ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
711ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
712ae8ec5e1SHisping Lin 						TEEC_NONE,
713ae8ec5e1SHisping Lin 						TEEC_NONE);
714ae8ec5e1SHisping Lin 
715ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
716*1f25ada2SHisping Lin 					141,
717ae8ec5e1SHisping Lin 					&TeecOperation,
718ae8ec5e1SHisping Lin 					&ErrorOrigin);
719ae8ec5e1SHisping Lin 
720ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
721ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
722ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
72346b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
724ae8ec5e1SHisping Lin 	debug("testmm end\n");
725ae8ec5e1SHisping Lin 	debug("TeecResult %x\n", TeecResult);
726ae8ec5e1SHisping Lin 
727ae8ec5e1SHisping Lin 	return TeecResult;
728ae8ec5e1SHisping Lin }
7296ef445a4SHisping Lin 
7306ef445a4SHisping Lin uint32_t trusty_read_attribute_hash(uint32_t *buf, uint32_t length)
7316ef445a4SHisping Lin {
7326ef445a4SHisping Lin 	TEEC_Result TeecResult;
7336ef445a4SHisping Lin 	TEEC_Context TeecContext;
7346ef445a4SHisping Lin 	TEEC_Session TeecSession;
7356ef445a4SHisping Lin 	uint32_t ErrorOrigin;
7366ef445a4SHisping Lin 
7376ef445a4SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, \
7386ef445a4SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
7396ef445a4SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
7406ef445a4SHisping Lin 	TEEC_Operation TeecOperation = {0};
7416ef445a4SHisping Lin 
7426ef445a4SHisping Lin 	OpteeClientApiLibInitialize();
7436ef445a4SHisping Lin 
7446ef445a4SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
7456ef445a4SHisping Lin 
7466ef445a4SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
7476ef445a4SHisping Lin 				&TeecSession,
7486ef445a4SHisping Lin 				TeecUuid,
7496ef445a4SHisping Lin 				TEEC_LOGIN_PUBLIC,
7506ef445a4SHisping Lin 				NULL,
7516ef445a4SHisping Lin 				NULL,
7526ef445a4SHisping Lin 				&ErrorOrigin);
7536ef445a4SHisping Lin 
7546ef445a4SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
7556ef445a4SHisping Lin 
7566ef445a4SHisping Lin 	SharedMem0.size = length * sizeof(uint32_t);
7576ef445a4SHisping Lin 	SharedMem0.flags = 0;
7586ef445a4SHisping Lin 
7596ef445a4SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
7606ef445a4SHisping Lin 
7616ef445a4SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
7626ef445a4SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
7636ef445a4SHisping Lin 
7646ef445a4SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT,
7656ef445a4SHisping Lin 						TEEC_NONE,
7666ef445a4SHisping Lin 						TEEC_NONE,
7676ef445a4SHisping Lin 						TEEC_NONE);
7686ef445a4SHisping Lin 
7696ef445a4SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
7706ef445a4SHisping Lin 					0,
7716ef445a4SHisping Lin 					&TeecOperation,
7726ef445a4SHisping Lin 					&ErrorOrigin);
7736ef445a4SHisping Lin 
7746ef445a4SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
7756ef445a4SHisping Lin 		memcpy(buf, SharedMem0.buffer, SharedMem0.size);
7766ef445a4SHisping Lin 
7776ef445a4SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
7786ef445a4SHisping Lin 	TEEC_CloseSession(&TeecSession);
7796ef445a4SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
7806ef445a4SHisping Lin 
7816ef445a4SHisping Lin 	return TeecResult;
7826ef445a4SHisping Lin }
7836ef445a4SHisping Lin 
7846ef445a4SHisping Lin uint32_t trusty_write_attribute_hash(uint32_t *buf, uint32_t length)
7856ef445a4SHisping Lin {
7866ef445a4SHisping Lin 	TEEC_Result TeecResult;
7876ef445a4SHisping Lin 	TEEC_Context TeecContext;
7886ef445a4SHisping Lin 	TEEC_Session TeecSession;
7896ef445a4SHisping Lin 	uint32_t ErrorOrigin;
7906ef445a4SHisping Lin 
7916ef445a4SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, \
7926ef445a4SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
7936ef445a4SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
7946ef445a4SHisping Lin 	TEEC_Operation TeecOperation = {0};
7956ef445a4SHisping Lin 
7966ef445a4SHisping Lin 	OpteeClientApiLibInitialize();
7976ef445a4SHisping Lin 
7986ef445a4SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
7996ef445a4SHisping Lin 
8006ef445a4SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
8016ef445a4SHisping Lin 				&TeecSession,
8026ef445a4SHisping Lin 				TeecUuid,
8036ef445a4SHisping Lin 				TEEC_LOGIN_PUBLIC,
8046ef445a4SHisping Lin 				NULL,
8056ef445a4SHisping Lin 				NULL,
8066ef445a4SHisping Lin 				&ErrorOrigin);
8076ef445a4SHisping Lin 
8086ef445a4SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
8096ef445a4SHisping Lin 
8106ef445a4SHisping Lin 	SharedMem0.size = length * sizeof(uint32_t);
8116ef445a4SHisping Lin 	SharedMem0.flags = 0;
8126ef445a4SHisping Lin 
8136ef445a4SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
8146ef445a4SHisping Lin 
8156ef445a4SHisping Lin 	memcpy(SharedMem0.buffer, buf, SharedMem0.size);
8166ef445a4SHisping Lin 
8176ef445a4SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
8186ef445a4SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
8196ef445a4SHisping Lin 
8206ef445a4SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
8216ef445a4SHisping Lin 						TEEC_NONE,
8226ef445a4SHisping Lin 						TEEC_NONE,
8236ef445a4SHisping Lin 						TEEC_NONE);
8246ef445a4SHisping Lin 
8256ef445a4SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
8266ef445a4SHisping Lin 					1,
8276ef445a4SHisping Lin 					&TeecOperation,
8286ef445a4SHisping Lin 					&ErrorOrigin);
8296ef445a4SHisping Lin 
8306ef445a4SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
8316ef445a4SHisping Lin 	TEEC_CloseSession(&TeecSession);
8326ef445a4SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
8336ef445a4SHisping Lin 
8346ef445a4SHisping Lin 	return TeecResult;
8356ef445a4SHisping Lin }
83616539616SHisping Lin 
83716539616SHisping Lin uint32_t notify_optee_rpmb_ta(void)
83816539616SHisping Lin {
83916539616SHisping Lin 	TEEC_Result TeecResult;
84016539616SHisping Lin 	TEEC_Context TeecContext;
84116539616SHisping Lin 	TEEC_Session TeecSession;
84216539616SHisping Lin 	uint32_t ErrorOrigin;
84316539616SHisping Lin 	TEEC_UUID  tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
84416539616SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
84516539616SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
84616539616SHisping Lin 	TEEC_Operation TeecOperation = {0};
84716539616SHisping Lin 
84816539616SHisping Lin 	OpteeClientApiLibInitialize();
84916539616SHisping Lin 
85016539616SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
85116539616SHisping Lin 
85216539616SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
85316539616SHisping Lin 				&TeecSession,
85416539616SHisping Lin 				TeecUuid,
85516539616SHisping Lin 				TEEC_LOGIN_PUBLIC,
85616539616SHisping Lin 				NULL,
85716539616SHisping Lin 				NULL,
85816539616SHisping Lin 				&ErrorOrigin);
85916539616SHisping Lin 
86016539616SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE,
86116539616SHisping Lin 						TEEC_NONE,
86216539616SHisping Lin 						TEEC_NONE,
86316539616SHisping Lin 						TEEC_NONE);
86416539616SHisping Lin 
86516539616SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
86616539616SHisping Lin 					2,
86716539616SHisping Lin 					&TeecOperation,
86816539616SHisping Lin 					&ErrorOrigin);
86916539616SHisping Lin 
87016539616SHisping Lin 	TEEC_CloseSession(&TeecSession);
87116539616SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
87216539616SHisping Lin 
87316539616SHisping Lin 	return TeecResult;
87416539616SHisping Lin }
87516539616SHisping Lin 
87616539616SHisping Lin uint32_t notify_optee_efuse_ta(void)
87716539616SHisping Lin {
87816539616SHisping Lin 	TEEC_Result TeecResult;
87916539616SHisping Lin 	TEEC_Context TeecContext;
88016539616SHisping Lin 	TEEC_Session TeecSession;
88116539616SHisping Lin 	uint32_t ErrorOrigin;
88216539616SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, \
88316539616SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
88416539616SHisping Lin 
88516539616SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
88616539616SHisping Lin 	TEEC_Operation TeecOperation = {0};
88716539616SHisping Lin 
88816539616SHisping Lin 	OpteeClientApiLibInitialize();
88916539616SHisping Lin 
89016539616SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
89116539616SHisping Lin 
89216539616SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
89316539616SHisping Lin 				&TeecSession,
89416539616SHisping Lin 				TeecUuid,
89516539616SHisping Lin 				TEEC_LOGIN_PUBLIC,
89616539616SHisping Lin 				NULL,
89716539616SHisping Lin 				NULL,
89816539616SHisping Lin 				&ErrorOrigin);
89916539616SHisping Lin 
90016539616SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE,
90116539616SHisping Lin 						TEEC_NONE,
90216539616SHisping Lin 						TEEC_NONE,
90316539616SHisping Lin 						TEEC_NONE);
90416539616SHisping Lin 
90516539616SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
90616539616SHisping Lin 					2,
90716539616SHisping Lin 					&TeecOperation,
90816539616SHisping Lin 					&ErrorOrigin);
90916539616SHisping Lin 
91016539616SHisping Lin 	TEEC_CloseSession(&TeecSession);
91116539616SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
91216539616SHisping Lin 
91316539616SHisping Lin 	return TeecResult;
91416539616SHisping Lin }
91516539616SHisping Lin 
91616539616SHisping Lin uint32_t trusty_notify_optee_uboot_end(void)
91716539616SHisping Lin {
91816539616SHisping Lin 	TEEC_Result res;
91916539616SHisping Lin 	res = notify_optee_rpmb_ta();
92016539616SHisping Lin 	res |= notify_optee_efuse_ta();
92116539616SHisping Lin 	return res;
92216539616SHisping Lin }
9232cd27853SHisping Lin 
9242cd27853SHisping Lin uint32_t trusty_read_vbootkey_hash(uint32_t *buf, uint32_t length)
9252cd27853SHisping Lin {
9262cd27853SHisping Lin 	TEEC_Result TeecResult;
9272cd27853SHisping Lin 	TEEC_Context TeecContext;
9282cd27853SHisping Lin 	TEEC_Session TeecSession;
9292cd27853SHisping Lin 	uint32_t ErrorOrigin;
9302cd27853SHisping Lin 
9312cd27853SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, \
9322cd27853SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
9332cd27853SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
9342cd27853SHisping Lin 	TEEC_Operation TeecOperation = {0};
9352cd27853SHisping Lin 
9362cd27853SHisping Lin 	OpteeClientApiLibInitialize();
9372cd27853SHisping Lin 
9382cd27853SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
9392cd27853SHisping Lin 
9402cd27853SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
9412cd27853SHisping Lin 				&TeecSession,
9422cd27853SHisping Lin 				TeecUuid,
9432cd27853SHisping Lin 				TEEC_LOGIN_PUBLIC,
9442cd27853SHisping Lin 				NULL,
9452cd27853SHisping Lin 				NULL,
9462cd27853SHisping Lin 				&ErrorOrigin);
9472cd27853SHisping Lin 
9482cd27853SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
9492cd27853SHisping Lin 
9502cd27853SHisping Lin 	SharedMem0.size = length * sizeof(uint32_t);
9512cd27853SHisping Lin 	SharedMem0.flags = 0;
9522cd27853SHisping Lin 
9532cd27853SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
9542cd27853SHisping Lin 
9552cd27853SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
9562cd27853SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
9572cd27853SHisping Lin 
9582cd27853SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT,
9592cd27853SHisping Lin 						TEEC_NONE,
9602cd27853SHisping Lin 						TEEC_NONE,
9612cd27853SHisping Lin 						TEEC_NONE);
9622cd27853SHisping Lin 
9632cd27853SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
9642cd27853SHisping Lin 					3,
9652cd27853SHisping Lin 					&TeecOperation,
9662cd27853SHisping Lin 					&ErrorOrigin);
9672cd27853SHisping Lin 
9682cd27853SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
9692cd27853SHisping Lin 		memcpy(buf, SharedMem0.buffer, SharedMem0.size);
9702cd27853SHisping Lin 
9712cd27853SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
9722cd27853SHisping Lin 	TEEC_CloseSession(&TeecSession);
9732cd27853SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
9742cd27853SHisping Lin 
9752cd27853SHisping Lin 	return TeecResult;
9762cd27853SHisping Lin }
9772cd27853SHisping Lin uint32_t trusty_write_vbootkey_hash(uint32_t *buf, uint32_t length)
9782cd27853SHisping Lin {
9792cd27853SHisping Lin 	TEEC_Result TeecResult;
9802cd27853SHisping Lin 	TEEC_Context TeecContext;
9812cd27853SHisping Lin 	TEEC_Session TeecSession;
9822cd27853SHisping Lin 	uint32_t ErrorOrigin;
9832cd27853SHisping Lin 
9842cd27853SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, \
9852cd27853SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
9862cd27853SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
9872cd27853SHisping Lin 	TEEC_Operation TeecOperation = {0};
9882cd27853SHisping Lin 
9892cd27853SHisping Lin 	OpteeClientApiLibInitialize();
9902cd27853SHisping Lin 
9912cd27853SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
9922cd27853SHisping Lin 
9932cd27853SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
9942cd27853SHisping Lin 				&TeecSession,
9952cd27853SHisping Lin 				TeecUuid,
9962cd27853SHisping Lin 				TEEC_LOGIN_PUBLIC,
9972cd27853SHisping Lin 				NULL,
9982cd27853SHisping Lin 				NULL,
9992cd27853SHisping Lin 				&ErrorOrigin);
10002cd27853SHisping Lin 
10012cd27853SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
10022cd27853SHisping Lin 
10032cd27853SHisping Lin 	SharedMem0.size = length * sizeof(uint32_t);
10042cd27853SHisping Lin 	SharedMem0.flags = 0;
10052cd27853SHisping Lin 
10062cd27853SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
10072cd27853SHisping Lin 
10082cd27853SHisping Lin 	memcpy(SharedMem0.buffer, buf, SharedMem0.size);
10092cd27853SHisping Lin 
10102cd27853SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
10112cd27853SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
10122cd27853SHisping Lin 
10132cd27853SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
10142cd27853SHisping Lin 						TEEC_NONE,
10152cd27853SHisping Lin 						TEEC_NONE,
10162cd27853SHisping Lin 						TEEC_NONE);
10172cd27853SHisping Lin 
10182cd27853SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
10192cd27853SHisping Lin 					4,
10202cd27853SHisping Lin 					&TeecOperation,
10212cd27853SHisping Lin 					&ErrorOrigin);
10222cd27853SHisping Lin 
10232cd27853SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
10242cd27853SHisping Lin 	TEEC_CloseSession(&TeecSession);
10252cd27853SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
10262cd27853SHisping Lin 
10272cd27853SHisping Lin 	return TeecResult;
10282cd27853SHisping Lin }
1029095e2a82SHisping Lin 
1030468df3b2SHisping Lin uint32_t trusty_read_vbootkey_enable_flag(uint8_t *flag)
1031468df3b2SHisping Lin {
1032468df3b2SHisping Lin 	TEEC_Result TeecResult;
1033468df3b2SHisping Lin 	TEEC_Context TeecContext;
1034468df3b2SHisping Lin 	TEEC_Session TeecSession;
1035468df3b2SHisping Lin 	uint32_t ErrorOrigin;
1036468df3b2SHisping Lin 	uint32_t bootflag;
1037468df3b2SHisping Lin 
1038468df3b2SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, \
1039468df3b2SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
1040468df3b2SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
1041468df3b2SHisping Lin 	TEEC_Operation TeecOperation = {0};
1042468df3b2SHisping Lin 
1043468df3b2SHisping Lin 	OpteeClientApiLibInitialize();
1044468df3b2SHisping Lin 
1045468df3b2SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1046468df3b2SHisping Lin 
1047468df3b2SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
1048468df3b2SHisping Lin 				&TeecSession,
1049468df3b2SHisping Lin 				TeecUuid,
1050468df3b2SHisping Lin 				TEEC_LOGIN_PUBLIC,
1051468df3b2SHisping Lin 				NULL,
1052468df3b2SHisping Lin 				NULL,
1053468df3b2SHisping Lin 				&ErrorOrigin);
1054468df3b2SHisping Lin 
1055468df3b2SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
1056468df3b2SHisping Lin 
1057468df3b2SHisping Lin 	SharedMem0.size = 1 * sizeof(uint32_t);
1058468df3b2SHisping Lin 	SharedMem0.flags = 0;
1059468df3b2SHisping Lin 
1060468df3b2SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
1061468df3b2SHisping Lin 
1062468df3b2SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
1063468df3b2SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
1064468df3b2SHisping Lin 
1065468df3b2SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT,
1066468df3b2SHisping Lin 						TEEC_NONE,
1067468df3b2SHisping Lin 						TEEC_NONE,
1068468df3b2SHisping Lin 						TEEC_NONE);
1069468df3b2SHisping Lin 
1070468df3b2SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
1071468df3b2SHisping Lin 					5,
1072468df3b2SHisping Lin 					&TeecOperation,
1073468df3b2SHisping Lin 					&ErrorOrigin);
1074468df3b2SHisping Lin 
1075468df3b2SHisping Lin 	if (TeecResult == TEEC_SUCCESS) {
1076468df3b2SHisping Lin 		memcpy(&bootflag, SharedMem0.buffer, SharedMem0.size);
1077468df3b2SHisping Lin 		if (bootflag == 0x000000FF)
1078468df3b2SHisping Lin 			*flag = 1;
1079468df3b2SHisping Lin 	}
1080468df3b2SHisping Lin 
1081468df3b2SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
1082468df3b2SHisping Lin 	TEEC_CloseSession(&TeecSession);
1083468df3b2SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
1084468df3b2SHisping Lin 
1085468df3b2SHisping Lin 	return TeecResult;
1086468df3b2SHisping Lin }
1087468df3b2SHisping Lin 
1088095e2a82SHisping Lin uint32_t trusty_read_permanent_attributes_flag(uint8_t *attributes)
1089095e2a82SHisping Lin {
1090095e2a82SHisping Lin 	TEEC_Result TeecResult;
1091095e2a82SHisping Lin 	TEEC_Context TeecContext;
1092095e2a82SHisping Lin 	TEEC_Session TeecSession;
1093095e2a82SHisping Lin 	uint32_t ErrorOrigin;
1094095e2a82SHisping Lin 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
1095095e2a82SHisping Lin 		{ 0xa8, 0x69, 0x9c, 0xe6, 0x88, 0x6c, 0x5d, 0x5d } };
1096095e2a82SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
1097095e2a82SHisping Lin 	TEEC_Operation TeecOperation = {0};
1098095e2a82SHisping Lin 
1099095e2a82SHisping Lin 	debug("testmm start\n");
1100095e2a82SHisping Lin 	OpteeClientApiLibInitialize();
1101095e2a82SHisping Lin 
1102095e2a82SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1103095e2a82SHisping Lin 
1104095e2a82SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
1105095e2a82SHisping Lin 				&TeecSession,
1106095e2a82SHisping Lin 				TeecUuid,
1107095e2a82SHisping Lin 				TEEC_LOGIN_PUBLIC,
1108095e2a82SHisping Lin 				NULL,
1109095e2a82SHisping Lin 				NULL,
1110095e2a82SHisping Lin 				&ErrorOrigin);
1111095e2a82SHisping Lin 
1112095e2a82SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
1113095e2a82SHisping Lin 
1114095e2a82SHisping Lin 	SharedMem0.size = sizeof("attributes_flag");
1115095e2a82SHisping Lin 	SharedMem0.flags = 0;
1116095e2a82SHisping Lin 
1117095e2a82SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
1118095e2a82SHisping Lin 
1119095e2a82SHisping Lin 	memcpy(SharedMem0.buffer, "attributes_flag", SharedMem0.size);
1120095e2a82SHisping Lin 
1121095e2a82SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
1122095e2a82SHisping Lin 
1123095e2a82SHisping Lin 	SharedMem1.size = 1;
1124095e2a82SHisping Lin 	SharedMem1.flags = 0;
1125095e2a82SHisping Lin 
1126095e2a82SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
1127095e2a82SHisping Lin 
1128095e2a82SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
1129095e2a82SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
1130095e2a82SHisping Lin 
1131095e2a82SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
1132095e2a82SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
1133095e2a82SHisping Lin 
1134095e2a82SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
1135095e2a82SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
1136095e2a82SHisping Lin 						TEEC_NONE,
1137095e2a82SHisping Lin 						TEEC_NONE);
1138095e2a82SHisping Lin 
1139095e2a82SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
1140095e2a82SHisping Lin 					142,
1141095e2a82SHisping Lin 					&TeecOperation,
1142095e2a82SHisping Lin 					&ErrorOrigin);
1143095e2a82SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
1144095e2a82SHisping Lin 		memcpy(attributes, SharedMem1.buffer, SharedMem1.size);
1145095e2a82SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
1146095e2a82SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
1147095e2a82SHisping Lin 	TEEC_CloseSession(&TeecSession);
1148095e2a82SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
1149095e2a82SHisping Lin 	debug("testmm end\n");
1150095e2a82SHisping Lin 
1151095e2a82SHisping Lin 	return TeecResult;
1152095e2a82SHisping Lin }
1153095e2a82SHisping Lin 
1154095e2a82SHisping Lin uint32_t trusty_write_permanent_attributes_flag(uint8_t attributes)
1155095e2a82SHisping Lin {
1156095e2a82SHisping Lin 	TEEC_Result TeecResult;
1157095e2a82SHisping Lin 	TEEC_Context TeecContext;
1158095e2a82SHisping Lin 	TEEC_Session TeecSession;
1159095e2a82SHisping Lin 	uint32_t ErrorOrigin;
1160095e2a82SHisping Lin 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
1161095e2a82SHisping Lin 		{ 0xa8, 0x69, 0x9c, 0xe6, 0x88, 0x6c, 0x5d, 0x5d } };
1162095e2a82SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
1163095e2a82SHisping Lin 	TEEC_Operation TeecOperation = {0};
1164095e2a82SHisping Lin 
1165095e2a82SHisping Lin 	debug("testmm start\n");
1166095e2a82SHisping Lin 	OpteeClientApiLibInitialize();
1167095e2a82SHisping Lin 
1168095e2a82SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1169095e2a82SHisping Lin 
1170095e2a82SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
1171095e2a82SHisping Lin 				&TeecSession,
1172095e2a82SHisping Lin 				TeecUuid,
1173095e2a82SHisping Lin 				TEEC_LOGIN_PUBLIC,
1174095e2a82SHisping Lin 				NULL,
1175095e2a82SHisping Lin 				NULL,
1176095e2a82SHisping Lin 				&ErrorOrigin);
1177095e2a82SHisping Lin 
1178095e2a82SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
1179095e2a82SHisping Lin 
1180095e2a82SHisping Lin 	SharedMem0.size = sizeof("attributes_flag");
1181095e2a82SHisping Lin 	SharedMem0.flags = 0;
1182095e2a82SHisping Lin 
1183095e2a82SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
1184095e2a82SHisping Lin 
1185095e2a82SHisping Lin 	memcpy(SharedMem0.buffer, "attributes_flag", SharedMem0.size);
1186095e2a82SHisping Lin 
1187095e2a82SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
1188095e2a82SHisping Lin 
1189095e2a82SHisping Lin 	SharedMem1.size = 1;
1190095e2a82SHisping Lin 	SharedMem1.flags = 0;
1191095e2a82SHisping Lin 
1192095e2a82SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
1193095e2a82SHisping Lin 
1194095e2a82SHisping Lin 	memcpy(SharedMem1.buffer, (char *)&attributes, SharedMem1.size);
1195095e2a82SHisping Lin 
1196095e2a82SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
1197095e2a82SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
1198095e2a82SHisping Lin 
1199095e2a82SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
1200095e2a82SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
1201095e2a82SHisping Lin 
1202095e2a82SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
1203095e2a82SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
1204095e2a82SHisping Lin 						TEEC_NONE,
1205095e2a82SHisping Lin 						TEEC_NONE);
1206095e2a82SHisping Lin 
1207095e2a82SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
1208095e2a82SHisping Lin 					141,
1209095e2a82SHisping Lin 					&TeecOperation,
1210095e2a82SHisping Lin 					&ErrorOrigin);
1211095e2a82SHisping Lin 
1212095e2a82SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
1213095e2a82SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
1214095e2a82SHisping Lin 	TEEC_CloseSession(&TeecSession);
1215095e2a82SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
1216095e2a82SHisping Lin 	debug("testmm end\n");
1217095e2a82SHisping Lin 
1218095e2a82SHisping Lin 	return TeecResult;
1219095e2a82SHisping Lin }
12204aa61755SAndy Ye 
12214aa61755SAndy Ye uint32_t trusty_attest_dh(uint8_t *dh, uint32_t *dh_size)
12224aa61755SAndy Ye {
12234aa61755SAndy Ye 	TEEC_Result TeecResult;
12244aa61755SAndy Ye 	TEEC_Context TeecContext;
12254aa61755SAndy Ye 	TEEC_Session TeecSession;
12264aa61755SAndy Ye 	uint32_t ErrorOrigin;
12274aa61755SAndy Ye 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
12284aa61755SAndy Ye 				{ 0xa8, 0x69, 0x9c, 0xe6,
12294aa61755SAndy Ye 				  0x88, 0x6c, 0x5d, 0x5d
12304aa61755SAndy Ye 				}
12314aa61755SAndy Ye 			     };
12324aa61755SAndy Ye 	TEEC_UUID *TeecUuid = &tempuuid;
12334aa61755SAndy Ye 	TEEC_Operation TeecOperation = {0};
12344aa61755SAndy Ye 
12354aa61755SAndy Ye 	OpteeClientApiLibInitialize();
12364aa61755SAndy Ye 
12374aa61755SAndy Ye 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
12384aa61755SAndy Ye 
12394aa61755SAndy Ye 	TeecResult = TEEC_OpenSession(&TeecContext,
12404aa61755SAndy Ye 				      &TeecSession,
12414aa61755SAndy Ye 				      TeecUuid,
12424aa61755SAndy Ye 				      TEEC_LOGIN_PUBLIC,
12434aa61755SAndy Ye 				      NULL,
12444aa61755SAndy Ye 				      NULL,
12454aa61755SAndy Ye 				      &ErrorOrigin);
12464aa61755SAndy Ye 
12474aa61755SAndy Ye 	TEEC_SharedMemory SharedMem0 = {0};
12484aa61755SAndy Ye 
12494aa61755SAndy Ye 	SharedMem0.size = *dh_size;
12504aa61755SAndy Ye 	SharedMem0.flags = 0;
12514aa61755SAndy Ye 
12524aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
12534aa61755SAndy Ye 
12544aa61755SAndy Ye 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
12554aa61755SAndy Ye 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
12564aa61755SAndy Ye 
12574aa61755SAndy Ye 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT,
12584aa61755SAndy Ye 						    TEEC_NONE,
12594aa61755SAndy Ye 						    TEEC_NONE,
12604aa61755SAndy Ye 						    TEEC_NONE);
12614aa61755SAndy Ye 
12624aa61755SAndy Ye 	TeecResult = TEEC_InvokeCommand(&TeecSession,
12634aa61755SAndy Ye 					143,
12644aa61755SAndy Ye 					&TeecOperation,
12654aa61755SAndy Ye 					&ErrorOrigin);
12664aa61755SAndy Ye 
12674aa61755SAndy Ye 	*dh_size = TeecOperation.params[0].tmpref.size;
12684aa61755SAndy Ye 	memcpy(dh, SharedMem0.buffer, SharedMem0.size);
12694aa61755SAndy Ye 
12704aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem0);
12714aa61755SAndy Ye 
12724aa61755SAndy Ye 	TEEC_CloseSession(&TeecSession);
12734aa61755SAndy Ye 	TeecResult = TEEC_FinalizeContext(&TeecContext);
12744aa61755SAndy Ye 
12754aa61755SAndy Ye 	return TeecResult;
12764aa61755SAndy Ye }
12774aa61755SAndy Ye 
12784aa61755SAndy Ye uint32_t trusty_attest_uuid(uint8_t *uuid, uint32_t *uuid_size)
12794aa61755SAndy Ye {
12804aa61755SAndy Ye 	TEEC_Result TeecResult;
12814aa61755SAndy Ye 	TEEC_Context TeecContext;
12824aa61755SAndy Ye 	TEEC_Session TeecSession;
12834aa61755SAndy Ye 	uint32_t ErrorOrigin;
12844aa61755SAndy Ye 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
12854aa61755SAndy Ye 				{ 0xa8, 0x69, 0x9c, 0xe6,
12864aa61755SAndy Ye 				  0x88, 0x6c, 0x5d, 0x5d
12874aa61755SAndy Ye 				}
12884aa61755SAndy Ye 			     };
12894aa61755SAndy Ye 	TEEC_UUID *TeecUuid = &tempuuid;
12904aa61755SAndy Ye 	TEEC_Operation TeecOperation = {0};
12914aa61755SAndy Ye 
12924aa61755SAndy Ye 	OpteeClientApiLibInitialize();
12934aa61755SAndy Ye 
12944aa61755SAndy Ye 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
12954aa61755SAndy Ye 
12964aa61755SAndy Ye 	TeecResult = TEEC_OpenSession(&TeecContext,
12974aa61755SAndy Ye 				      &TeecSession,
12984aa61755SAndy Ye 				      TeecUuid,
12994aa61755SAndy Ye 				      TEEC_LOGIN_PUBLIC,
13004aa61755SAndy Ye 				      NULL,
13014aa61755SAndy Ye 				      NULL,
13024aa61755SAndy Ye 				      &ErrorOrigin);
13034aa61755SAndy Ye 
13044aa61755SAndy Ye 	TEEC_SharedMemory SharedMem0 = {0};
13054aa61755SAndy Ye 
13064aa61755SAndy Ye 	SharedMem0.size = *uuid_size;
13074aa61755SAndy Ye 	SharedMem0.flags = 0;
13084aa61755SAndy Ye 
13094aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
13104aa61755SAndy Ye 
13114aa61755SAndy Ye 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
13124aa61755SAndy Ye 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
13134aa61755SAndy Ye 
13144aa61755SAndy Ye 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT,
13154aa61755SAndy Ye 						    TEEC_NONE,
13164aa61755SAndy Ye 						    TEEC_NONE,
13174aa61755SAndy Ye 						    TEEC_NONE);
13184aa61755SAndy Ye 
13194aa61755SAndy Ye 	TeecResult = TEEC_InvokeCommand(&TeecSession,
13204aa61755SAndy Ye 					144,
13214aa61755SAndy Ye 					&TeecOperation,
13224aa61755SAndy Ye 					&ErrorOrigin);
13234aa61755SAndy Ye 
13244aa61755SAndy Ye 	*uuid_size = TeecOperation.params[0].tmpref.size;
13254aa61755SAndy Ye 	memcpy(uuid, SharedMem0.buffer, SharedMem0.size);
13264aa61755SAndy Ye 
13274aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem0);
13284aa61755SAndy Ye 
13294aa61755SAndy Ye 	TEEC_CloseSession(&TeecSession);
13304aa61755SAndy Ye 	TeecResult = TEEC_FinalizeContext(&TeecContext);
13314aa61755SAndy Ye 
13324aa61755SAndy Ye 	return TeecResult;
13334aa61755SAndy Ye }
13344aa61755SAndy Ye 
13354aa61755SAndy Ye uint32_t trusty_attest_get_ca(uint8_t *operation_start,
13364aa61755SAndy Ye 			      uint32_t *operation_size,
13374aa61755SAndy Ye 			      uint8_t *out,
13384aa61755SAndy Ye 			      uint32_t *out_len)
13394aa61755SAndy Ye {
13404aa61755SAndy Ye 	TEEC_Result TeecResult;
13414aa61755SAndy Ye 	TEEC_Context TeecContext;
13424aa61755SAndy Ye 	TEEC_Session TeecSession;
13434aa61755SAndy Ye 	uint32_t ErrorOrigin;
13444aa61755SAndy Ye 
13454aa61755SAndy Ye 	OpteeClientApiLibInitialize();
13464aa61755SAndy Ye 
13474aa61755SAndy Ye 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
13484aa61755SAndy Ye 				{ 0xa8, 0x69, 0x9c, 0xe6,
13494aa61755SAndy Ye 				  0x88, 0x6c, 0x5d, 0x5d
13504aa61755SAndy Ye 				}
13514aa61755SAndy Ye 			     };
13524aa61755SAndy Ye 
13534aa61755SAndy Ye 	TEEC_UUID *TeecUuid = &tempuuid;
13544aa61755SAndy Ye 	TEEC_Operation TeecOperation = {0};
13554aa61755SAndy Ye 
13564aa61755SAndy Ye 	OpteeClientApiLibInitialize();
13574aa61755SAndy Ye 
13584aa61755SAndy Ye 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
13594aa61755SAndy Ye 
13604aa61755SAndy Ye 	TeecResult = TEEC_OpenSession(&TeecContext,
13614aa61755SAndy Ye 				      &TeecSession,
13624aa61755SAndy Ye 				      TeecUuid,
13634aa61755SAndy Ye 				      TEEC_LOGIN_PUBLIC,
13644aa61755SAndy Ye 				      NULL,
13654aa61755SAndy Ye 				      NULL,
13664aa61755SAndy Ye 				      &ErrorOrigin);
13674aa61755SAndy Ye 
13684aa61755SAndy Ye 	TEEC_SharedMemory SharedMem0 = {0};
13694aa61755SAndy Ye 
13704aa61755SAndy Ye 	SharedMem0.size = *operation_size;
13714aa61755SAndy Ye 	SharedMem0.flags = 0;
13724aa61755SAndy Ye 
13734aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
13744aa61755SAndy Ye 
13754aa61755SAndy Ye 	memcpy(SharedMem0.buffer, operation_start, SharedMem0.size);
13764aa61755SAndy Ye 
13774aa61755SAndy Ye 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
13784aa61755SAndy Ye 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
13794aa61755SAndy Ye 
13804aa61755SAndy Ye 	TEEC_SharedMemory SharedMem1 = {0};
13814aa61755SAndy Ye 
13824aa61755SAndy Ye 	SharedMem1.size = *out_len;
13834aa61755SAndy Ye 	SharedMem1.flags = 0;
13844aa61755SAndy Ye 
13854aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
13864aa61755SAndy Ye 
13874aa61755SAndy Ye 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
13884aa61755SAndy Ye 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
13894aa61755SAndy Ye 
13904aa61755SAndy Ye 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT,
13914aa61755SAndy Ye 						    TEEC_MEMREF_TEMP_INOUT,
13924aa61755SAndy Ye 						    TEEC_NONE,
13934aa61755SAndy Ye 						    TEEC_NONE);
13944aa61755SAndy Ye 
13954aa61755SAndy Ye 	TeecResult = TEEC_InvokeCommand(&TeecSession,
13964aa61755SAndy Ye 					145,
13974aa61755SAndy Ye 					&TeecOperation,
13984aa61755SAndy Ye 					&ErrorOrigin);
13994aa61755SAndy Ye 
14004aa61755SAndy Ye 	*out_len = TeecOperation.params[1].tmpref.size;
14014aa61755SAndy Ye 	memcpy(out, SharedMem1.buffer, SharedMem1.size);
14024aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem0);
14034aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem1);
14044aa61755SAndy Ye 
14054aa61755SAndy Ye 	return TeecResult;
14064aa61755SAndy Ye }
14074aa61755SAndy Ye 
14084aa61755SAndy Ye uint32_t trusty_attest_set_ca(uint8_t *ca_response, uint32_t *ca_response_size)
14094aa61755SAndy Ye {
14104aa61755SAndy Ye 	TEEC_Result TeecResult;
14114aa61755SAndy Ye 	TEEC_Context TeecContext;
14124aa61755SAndy Ye 	TEEC_Session TeecSession;
14134aa61755SAndy Ye 	uint32_t ErrorOrigin;
14144aa61755SAndy Ye 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
14154aa61755SAndy Ye 				{ 0xa8, 0x69, 0x9c, 0xe6,
14164aa61755SAndy Ye 				  0x88, 0x6c, 0x5d, 0x5d
14174aa61755SAndy Ye 				}
14184aa61755SAndy Ye 			     };
14194aa61755SAndy Ye 	TEEC_UUID *TeecUuid = &tempuuid;
14204aa61755SAndy Ye 	TEEC_Operation TeecOperation = {0};
14214aa61755SAndy Ye 
14224aa61755SAndy Ye 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
14234aa61755SAndy Ye 
14244aa61755SAndy Ye 	TeecResult = TEEC_OpenSession(&TeecContext,
14254aa61755SAndy Ye 				      &TeecSession,
14264aa61755SAndy Ye 				      TeecUuid,
14274aa61755SAndy Ye 				      TEEC_LOGIN_PUBLIC,
14284aa61755SAndy Ye 				      NULL,
14294aa61755SAndy Ye 				      NULL,
14304aa61755SAndy Ye 				      &ErrorOrigin);
14314aa61755SAndy Ye 
14324aa61755SAndy Ye 	TEEC_SharedMemory SharedMem0 = {0};
14334aa61755SAndy Ye 
14344aa61755SAndy Ye 	SharedMem0.size = *ca_response_size;
14354aa61755SAndy Ye 	SharedMem0.flags = 0;
14364aa61755SAndy Ye 
14374aa61755SAndy Ye 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
14384aa61755SAndy Ye 
14394aa61755SAndy Ye 	memcpy(SharedMem0.buffer, ca_response, SharedMem0.size);
14404aa61755SAndy Ye 
14414aa61755SAndy Ye 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
14424aa61755SAndy Ye 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
14434aa61755SAndy Ye 
14444aa61755SAndy Ye 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT,
14454aa61755SAndy Ye 						    TEEC_NONE,
14464aa61755SAndy Ye 						    TEEC_NONE,
14474aa61755SAndy Ye 						    TEEC_NONE);
14484aa61755SAndy Ye 
14494aa61755SAndy Ye 	TeecResult = TEEC_InvokeCommand(&TeecSession,
14504aa61755SAndy Ye 					146,
14514aa61755SAndy Ye 					&TeecOperation,
14524aa61755SAndy Ye 					&ErrorOrigin);
14534aa61755SAndy Ye 
14544aa61755SAndy Ye 	TEEC_ReleaseSharedMemory(&SharedMem0);
14554aa61755SAndy Ye 
14564aa61755SAndy Ye 	TEEC_CloseSession(&TeecSession);
14574aa61755SAndy Ye 	TeecResult = TEEC_FinalizeContext(&TeecContext);
14584aa61755SAndy Ye 
14594aa61755SAndy Ye 	return TeecResult;
14604aa61755SAndy Ye }
1461