xref: /rk3399_rockchip-uboot/lib/optee_clientApi/OpteeClientInterface.c (revision 6ef445a4c243003c1d9d75deaca03b2435d8c109)
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 
76ae8ec5e1SHisping Lin 	TeecResult = TEEC_FinalizeContext(&TeecContext);
77ae8ec5e1SHisping Lin 
78ae8ec5e1SHisping Lin 	debug("testmm end\n");
79ae8ec5e1SHisping Lin 	debug("TeecResult %x\n", TeecResult);
80ae8ec5e1SHisping Lin }
81ae8ec5e1SHisping Lin 
82ae8ec5e1SHisping Lin 
83ae8ec5e1SHisping Lin static uint8_t b2hs_add_base(uint8_t in)
84ae8ec5e1SHisping Lin {
85ae8ec5e1SHisping Lin 	if (in > 9)
86ae8ec5e1SHisping Lin 		return in + 55;
87ae8ec5e1SHisping Lin 	else
88ae8ec5e1SHisping Lin 		return in + 48;
89ae8ec5e1SHisping Lin }
90ae8ec5e1SHisping Lin 
91ae8ec5e1SHisping Lin uint32_t b2hs(uint8_t *b, uint8_t *hs, uint32_t blen, uint32_t hslen)
92ae8ec5e1SHisping Lin {
93ae8ec5e1SHisping Lin 	uint32_t i = 0;
94ae8ec5e1SHisping Lin 
95ae8ec5e1SHisping Lin 	if (blen * 2 + 1 > hslen)
96ae8ec5e1SHisping Lin 		return 0;
97ae8ec5e1SHisping Lin 
98ae8ec5e1SHisping Lin 	for (; i < blen; i++) {
99ae8ec5e1SHisping Lin 		hs[i * 2 + 1] = b2hs_add_base(b[i] & 0xf);
100ae8ec5e1SHisping Lin 		hs[i * 2] = b2hs_add_base(b[i] >> 4);
101ae8ec5e1SHisping Lin 	}
102ae8ec5e1SHisping Lin 	hs[blen * 2] = 0;
103ae8ec5e1SHisping Lin 
104ae8ec5e1SHisping Lin 	return blen * 2;
105ae8ec5e1SHisping Lin }
106ae8ec5e1SHisping Lin 
107ae8ec5e1SHisping Lin 
108ae8ec5e1SHisping Lin uint32_t trusty_read_rollback_index(uint32_t slot, uint64_t *value)
109ae8ec5e1SHisping Lin {
110ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
111ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
112ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
113ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
114ae8ec5e1SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
115ae8ec5e1SHisping Lin 			{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
116ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
117ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
118ae8ec5e1SHisping Lin 	uint8_t hs[9];
119ae8ec5e1SHisping Lin 
120ae8ec5e1SHisping Lin 	b2hs((uint8_t *)&slot, hs, 4, 9);
121ae8ec5e1SHisping Lin 	debug("testmm start\n");
122ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
123ae8ec5e1SHisping Lin 
124ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
125ae8ec5e1SHisping Lin 
126ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
127ae8ec5e1SHisping Lin 				&TeecSession,
128ae8ec5e1SHisping Lin 				TeecUuid,
129ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
130ae8ec5e1SHisping Lin 				NULL,
131ae8ec5e1SHisping Lin 				NULL,
132ae8ec5e1SHisping Lin 				&ErrorOrigin);
133ae8ec5e1SHisping Lin 
134ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
135ae8ec5e1SHisping Lin 
136ae8ec5e1SHisping Lin 	SharedMem0.size = 8;
137ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
138ae8ec5e1SHisping Lin 
139ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
140ae8ec5e1SHisping Lin 
141ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, hs, SharedMem0.size);
142ae8ec5e1SHisping Lin 
143ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
144ae8ec5e1SHisping Lin 
145ae8ec5e1SHisping Lin 	SharedMem1.size = 8;
146ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
147ae8ec5e1SHisping Lin 
148ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
149ae8ec5e1SHisping Lin 
150ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
151ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
152ae8ec5e1SHisping Lin 
153ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
154ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
155ae8ec5e1SHisping Lin 
156ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
157ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
158ae8ec5e1SHisping Lin 						TEEC_NONE,
159ae8ec5e1SHisping Lin 						TEEC_NONE);
160ae8ec5e1SHisping Lin 
161ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
162ae8ec5e1SHisping Lin 					0,
163ae8ec5e1SHisping Lin 					&TeecOperation,
164ae8ec5e1SHisping Lin 					&ErrorOrigin);
165ae8ec5e1SHisping Lin 
166ae8ec5e1SHisping Lin 	memcpy((char *)value, SharedMem1.buffer, SharedMem1.size);
167ae8ec5e1SHisping Lin 
168ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
169ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
170ae8ec5e1SHisping Lin 
171ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
172ae8ec5e1SHisping Lin 
173ae8ec5e1SHisping Lin 	TeecResult = TEEC_FinalizeContext(&TeecContext);
174ae8ec5e1SHisping Lin 
175ae8ec5e1SHisping Lin 	debug("testmm end\n");
176ae8ec5e1SHisping Lin 	return TeecResult;
177ae8ec5e1SHisping Lin }
178ae8ec5e1SHisping Lin 
179ae8ec5e1SHisping Lin uint32_t trusty_write_rollback_index(uint32_t slot, uint64_t value)
180ae8ec5e1SHisping Lin {
181ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
182ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
183ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
184ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
185ae8ec5e1SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
186ae8ec5e1SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
187ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
188ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
189ae8ec5e1SHisping Lin 	uint8_t hs[9];
190ae8ec5e1SHisping Lin 	b2hs((uint8_t *)&slot, hs, 4, 9);
191ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
192ae8ec5e1SHisping Lin 
193ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
194ae8ec5e1SHisping Lin 
195ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
196ae8ec5e1SHisping Lin 				&TeecSession,
197ae8ec5e1SHisping Lin 				TeecUuid,
198ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
199ae8ec5e1SHisping Lin 				NULL,
200ae8ec5e1SHisping Lin 				NULL,
201ae8ec5e1SHisping Lin 				&ErrorOrigin);
202ae8ec5e1SHisping Lin 
203ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
204ae8ec5e1SHisping Lin 
205ae8ec5e1SHisping Lin 	SharedMem0.size = 8;
206ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
207ae8ec5e1SHisping Lin 
208ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
209ae8ec5e1SHisping Lin 
210ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, hs, SharedMem0.size);
211ae8ec5e1SHisping Lin 
212ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
213ae8ec5e1SHisping Lin 
214ae8ec5e1SHisping Lin 	SharedMem1.size = 8;
215ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
216ae8ec5e1SHisping Lin 
217ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
218ae8ec5e1SHisping Lin 
219ae8ec5e1SHisping Lin 	memcpy(SharedMem1.buffer, (char *)&value, SharedMem1.size);
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 
228ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
229ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
230ae8ec5e1SHisping Lin 						TEEC_NONE,
231ae8ec5e1SHisping Lin 						TEEC_NONE);
232ae8ec5e1SHisping Lin 
233ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
234ae8ec5e1SHisping Lin 					1,
235ae8ec5e1SHisping Lin 					&TeecOperation,
236ae8ec5e1SHisping Lin 					&ErrorOrigin);
237ae8ec5e1SHisping Lin 
238ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
239ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
240ae8ec5e1SHisping Lin 
241ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
242ae8ec5e1SHisping Lin 
243ae8ec5e1SHisping Lin 	TeecResult = TEEC_FinalizeContext(&TeecContext);
244ae8ec5e1SHisping Lin 
245ae8ec5e1SHisping Lin 	debug("testmm end\n");
246ae8ec5e1SHisping Lin 
247ae8ec5e1SHisping Lin 	return TeecResult;
248ae8ec5e1SHisping Lin }
249ae8ec5e1SHisping Lin 
250ae8ec5e1SHisping Lin uint32_t trusty_read_permanent_attributes(uint8_t *attributes, uint32_t size)
251ae8ec5e1SHisping Lin {
252ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
253ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
254ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
255ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
256ae8ec5e1SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
257ae8ec5e1SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
258ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
259ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
260ae8ec5e1SHisping Lin 
261ae8ec5e1SHisping Lin 	debug("testmm start\n");
262ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
263ae8ec5e1SHisping Lin 
264ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
265ae8ec5e1SHisping Lin 
266ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
267ae8ec5e1SHisping Lin 				&TeecSession,
268ae8ec5e1SHisping Lin 				TeecUuid,
269ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
270ae8ec5e1SHisping Lin 				NULL,
271ae8ec5e1SHisping Lin 				NULL,
272ae8ec5e1SHisping Lin 				&ErrorOrigin);
273ae8ec5e1SHisping Lin 
274ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
275ae8ec5e1SHisping Lin 
276ae8ec5e1SHisping Lin 	SharedMem0.size = sizeof("attributes");
277ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
278ae8ec5e1SHisping Lin 
279ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
280ae8ec5e1SHisping Lin 
281ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, "attributes", SharedMem0.size);
282ae8ec5e1SHisping Lin 
283ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
284ae8ec5e1SHisping Lin 
285ae8ec5e1SHisping Lin 	SharedMem1.size = size;
286ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
287ae8ec5e1SHisping Lin 
288ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
289ae8ec5e1SHisping Lin 
290ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
291ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
292ae8ec5e1SHisping Lin 
293ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
294ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
295ae8ec5e1SHisping Lin 
296ae8ec5e1SHisping Lin 
297ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
298ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
299ae8ec5e1SHisping Lin 						TEEC_NONE,
300ae8ec5e1SHisping Lin 						TEEC_NONE);
301ae8ec5e1SHisping Lin 
302ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
303ae8ec5e1SHisping Lin 					0,
304ae8ec5e1SHisping Lin 					&TeecOperation,
305ae8ec5e1SHisping Lin 					&ErrorOrigin);
306ae8ec5e1SHisping Lin 
307ae8ec5e1SHisping Lin 	memcpy(attributes, SharedMem1.buffer, SharedMem1.size);
308ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
309ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
310ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
311ae8ec5e1SHisping Lin 	TeecResult = TEEC_FinalizeContext(&TeecContext);
312ae8ec5e1SHisping Lin 	debug("testmm end\n");
313ae8ec5e1SHisping Lin 
314ae8ec5e1SHisping Lin 	return TeecResult;
315ae8ec5e1SHisping Lin }
316ae8ec5e1SHisping Lin 
317ae8ec5e1SHisping Lin uint32_t trusty_write_permanent_attributes(uint8_t *attributes, uint32_t size)
318ae8ec5e1SHisping Lin {
319ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
320ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
321ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
322ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
323ae8ec5e1SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
324ae8ec5e1SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
325ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
326ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
327ae8ec5e1SHisping Lin 
328ae8ec5e1SHisping Lin 	debug("testmm start\n");
329ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
330ae8ec5e1SHisping Lin 
331ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
332ae8ec5e1SHisping Lin 
333ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
334ae8ec5e1SHisping Lin 				&TeecSession,
335ae8ec5e1SHisping Lin 				TeecUuid,
336ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
337ae8ec5e1SHisping Lin 				NULL,
338ae8ec5e1SHisping Lin 				NULL,
339ae8ec5e1SHisping Lin 				&ErrorOrigin);
340ae8ec5e1SHisping Lin 
341ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
342ae8ec5e1SHisping Lin 
343ae8ec5e1SHisping Lin 	SharedMem0.size = sizeof("attributes");
344ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
345ae8ec5e1SHisping Lin 
346ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
347ae8ec5e1SHisping Lin 
348ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, "attributes", SharedMem0.size);
349ae8ec5e1SHisping Lin 
350ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
351ae8ec5e1SHisping Lin 
352ae8ec5e1SHisping Lin 	SharedMem1.size = size;
353ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
354ae8ec5e1SHisping Lin 
355ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
356ae8ec5e1SHisping Lin 
357ae8ec5e1SHisping Lin 	memcpy(SharedMem1.buffer, attributes, SharedMem1.size);
358ae8ec5e1SHisping Lin 
359ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
360ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
361ae8ec5e1SHisping Lin 
362ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
363ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
364ae8ec5e1SHisping Lin 
365ae8ec5e1SHisping Lin 
366ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
367ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
368ae8ec5e1SHisping Lin 						TEEC_NONE,
369ae8ec5e1SHisping Lin 						TEEC_NONE);
370ae8ec5e1SHisping Lin 
371ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
372ae8ec5e1SHisping Lin 					1,
373ae8ec5e1SHisping Lin 					&TeecOperation,
374ae8ec5e1SHisping Lin 					&ErrorOrigin);
375ae8ec5e1SHisping Lin 
376ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
377ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
378ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
379ae8ec5e1SHisping Lin 	TeecResult = TEEC_FinalizeContext(&TeecContext);
380ae8ec5e1SHisping Lin 	debug("testmm end\n");
381ae8ec5e1SHisping Lin 
382ae8ec5e1SHisping Lin 	return TeecResult;
383ae8ec5e1SHisping Lin }
384ae8ec5e1SHisping Lin 
385ae8ec5e1SHisping Lin uint32_t trusty_read_lock_state(uint8_t *lock_state)
386ae8ec5e1SHisping Lin {
387ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
388ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
389ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
390ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
391ae8ec5e1SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
392ae8ec5e1SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
393ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
394ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
395ae8ec5e1SHisping Lin 
396ae8ec5e1SHisping Lin 	debug("testmm start\n");
397ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
398ae8ec5e1SHisping Lin 
399ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
400ae8ec5e1SHisping Lin 
401ae8ec5e1SHisping Lin 
402ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
403ae8ec5e1SHisping Lin 				&TeecSession,
404ae8ec5e1SHisping Lin 				TeecUuid,
405ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
406ae8ec5e1SHisping Lin 				NULL,
407ae8ec5e1SHisping Lin 				NULL,
408ae8ec5e1SHisping Lin 				&ErrorOrigin);
409ae8ec5e1SHisping Lin 
410ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
411ae8ec5e1SHisping Lin 
412ae8ec5e1SHisping Lin 	SharedMem0.size = sizeof("lock_state");
413ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
414ae8ec5e1SHisping Lin 
415ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
416ae8ec5e1SHisping Lin 
417ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, "lock_state", SharedMem0.size);
418ae8ec5e1SHisping Lin 
419ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
420ae8ec5e1SHisping Lin 
421ae8ec5e1SHisping Lin 	SharedMem1.size = 1;
422ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
423ae8ec5e1SHisping Lin 
424ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
425ae8ec5e1SHisping Lin 
426ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
427ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
428ae8ec5e1SHisping Lin 
429ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
430ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
431ae8ec5e1SHisping Lin 
432ae8ec5e1SHisping Lin 
433ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
434ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
435ae8ec5e1SHisping Lin 						TEEC_NONE,
436ae8ec5e1SHisping Lin 						TEEC_NONE);
437ae8ec5e1SHisping Lin 
438ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
439ae8ec5e1SHisping Lin 					0,
440ae8ec5e1SHisping Lin 					&TeecOperation,
441ae8ec5e1SHisping Lin 					&ErrorOrigin);
442ae8ec5e1SHisping Lin 
443ae8ec5e1SHisping Lin 	memcpy(lock_state, SharedMem1.buffer, SharedMem1.size);
444ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
445ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
446ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
447ae8ec5e1SHisping Lin 	TeecResult = TEEC_FinalizeContext(&TeecContext);
448ae8ec5e1SHisping Lin 	debug("testmm end\n");
449ae8ec5e1SHisping Lin 
450ae8ec5e1SHisping Lin 	return TeecResult;
451ae8ec5e1SHisping Lin }
452ae8ec5e1SHisping Lin 
453ae8ec5e1SHisping Lin uint32_t trusty_write_lock_state(uint8_t lock_state)
454ae8ec5e1SHisping Lin {
455ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
456ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
457ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
458ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
459ae8ec5e1SHisping Lin 	TEEC_UUID  tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
460ae8ec5e1SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
461ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
462ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
463ae8ec5e1SHisping Lin 
464ae8ec5e1SHisping Lin 	debug("testmm start\n");
465ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
466ae8ec5e1SHisping Lin 
467ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
468ae8ec5e1SHisping Lin 
469ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
470ae8ec5e1SHisping Lin 				&TeecSession,
471ae8ec5e1SHisping Lin 				TeecUuid,
472ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
473ae8ec5e1SHisping Lin 				NULL,
474ae8ec5e1SHisping Lin 				NULL,
475ae8ec5e1SHisping Lin 				&ErrorOrigin);
476ae8ec5e1SHisping Lin 
477ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
478ae8ec5e1SHisping Lin 
479ae8ec5e1SHisping Lin 	SharedMem0.size = sizeof("lock_state");
480ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
481ae8ec5e1SHisping Lin 
482ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
483ae8ec5e1SHisping Lin 
484ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, "lock_state", SharedMem0.size);
485ae8ec5e1SHisping Lin 
486ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
487ae8ec5e1SHisping Lin 
488ae8ec5e1SHisping Lin 	SharedMem1.size = 1;
489ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
490ae8ec5e1SHisping Lin 
491ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
492ae8ec5e1SHisping Lin 
493ae8ec5e1SHisping Lin 	memcpy(SharedMem1.buffer, &lock_state, SharedMem1.size);
494ae8ec5e1SHisping Lin 
495ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
496ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
497ae8ec5e1SHisping Lin 
498ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
499ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
500ae8ec5e1SHisping Lin 
501ae8ec5e1SHisping Lin 
502ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
503ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
504ae8ec5e1SHisping Lin 						TEEC_NONE,
505ae8ec5e1SHisping Lin 						TEEC_NONE);
506ae8ec5e1SHisping Lin 
507ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
508ae8ec5e1SHisping Lin 					1,
509ae8ec5e1SHisping Lin 					&TeecOperation,
510ae8ec5e1SHisping Lin 					&ErrorOrigin);
511ae8ec5e1SHisping Lin 
512ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
513ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
514ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
515ae8ec5e1SHisping Lin 	TeecResult = TEEC_FinalizeContext(&TeecContext);
516ae8ec5e1SHisping Lin 	debug("testmm end\n");
517ae8ec5e1SHisping Lin 
518ae8ec5e1SHisping Lin 	return TeecResult;
519ae8ec5e1SHisping Lin }
520ae8ec5e1SHisping Lin 
521ae8ec5e1SHisping Lin uint32_t trusty_read_flash_lock_state(uint8_t *flash_lock_state)
522ae8ec5e1SHisping Lin {
523ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
524ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
525ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
526ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
527ae8ec5e1SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
528ae8ec5e1SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
529ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
530ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
531ae8ec5e1SHisping Lin 
532ae8ec5e1SHisping Lin 	debug("testmm start\n");
533ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
534ae8ec5e1SHisping Lin 
535ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
536ae8ec5e1SHisping Lin 
537ae8ec5e1SHisping Lin 
538ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
539ae8ec5e1SHisping Lin 				&TeecSession,
540ae8ec5e1SHisping Lin 				TeecUuid,
541ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
542ae8ec5e1SHisping Lin 				NULL,
543ae8ec5e1SHisping Lin 				NULL,
544ae8ec5e1SHisping Lin 				&ErrorOrigin);
545ae8ec5e1SHisping Lin 
546ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
547ae8ec5e1SHisping Lin 
548ae8ec5e1SHisping Lin 	SharedMem0.size = sizeof("flash_lock_state");
549ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
550ae8ec5e1SHisping Lin 
551ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
552ae8ec5e1SHisping Lin 
553ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, "flash_lock_state", SharedMem0.size);
554ae8ec5e1SHisping Lin 
555ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
556ae8ec5e1SHisping Lin 
557ae8ec5e1SHisping Lin 	SharedMem1.size = 1;
558ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
559ae8ec5e1SHisping Lin 
560ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
561ae8ec5e1SHisping Lin 
562ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
563ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
564ae8ec5e1SHisping Lin 
565ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
566ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
567ae8ec5e1SHisping Lin 
568ae8ec5e1SHisping Lin 
569ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
570ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
571ae8ec5e1SHisping Lin 						TEEC_NONE,
572ae8ec5e1SHisping Lin 						TEEC_NONE);
573ae8ec5e1SHisping Lin 
574ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
575ae8ec5e1SHisping Lin 					0,
576ae8ec5e1SHisping Lin 					&TeecOperation,
577ae8ec5e1SHisping Lin 					&ErrorOrigin);
578ae8ec5e1SHisping Lin 
579ae8ec5e1SHisping Lin 	memcpy(flash_lock_state, SharedMem1.buffer, SharedMem1.size);
580ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
581ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
582ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
583ae8ec5e1SHisping Lin 	TeecResult = TEEC_FinalizeContext(&TeecContext);
584ae8ec5e1SHisping Lin 	debug("testmm end\n");
585ae8ec5e1SHisping Lin 
586ae8ec5e1SHisping Lin 	return TeecResult;
587ae8ec5e1SHisping Lin }
588ae8ec5e1SHisping Lin 
589ae8ec5e1SHisping Lin 
590ae8ec5e1SHisping Lin uint32_t trusty_write_flash_lock_state(uint8_t flash_lock_state)
591ae8ec5e1SHisping Lin {
592ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
593ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
594ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
595ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
596ae8ec5e1SHisping Lin 	TEEC_UUID  tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
597ae8ec5e1SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
598ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
599ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
600ae8ec5e1SHisping Lin 
601ae8ec5e1SHisping Lin 	debug("testmm start\n");
602ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
603ae8ec5e1SHisping Lin 
604ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
605ae8ec5e1SHisping Lin 
606ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
607ae8ec5e1SHisping Lin 				&TeecSession,
608ae8ec5e1SHisping Lin 				TeecUuid,
609ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
610ae8ec5e1SHisping Lin 				NULL,
611ae8ec5e1SHisping Lin 				NULL,
612ae8ec5e1SHisping Lin 				&ErrorOrigin);
613ae8ec5e1SHisping Lin 
614ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
615ae8ec5e1SHisping Lin 
616ae8ec5e1SHisping Lin 	SharedMem0.size = sizeof("flash_lock_state");
617ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
618ae8ec5e1SHisping Lin 
619ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
620ae8ec5e1SHisping Lin 
621ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, "flash_lock_state", SharedMem0.size);
622ae8ec5e1SHisping Lin 
623ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
624ae8ec5e1SHisping Lin 
625ae8ec5e1SHisping Lin 	SharedMem1.size = 1;
626ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
627ae8ec5e1SHisping Lin 
628ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
629ae8ec5e1SHisping Lin 
630ae8ec5e1SHisping Lin 	memcpy(SharedMem1.buffer, &flash_lock_state, SharedMem1.size);
631ae8ec5e1SHisping Lin 
632ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
633ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
634ae8ec5e1SHisping Lin 
635ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
636ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
637ae8ec5e1SHisping Lin 
638ae8ec5e1SHisping Lin 
639ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
640ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
641ae8ec5e1SHisping Lin 						TEEC_NONE,
642ae8ec5e1SHisping Lin 						TEEC_NONE);
643ae8ec5e1SHisping Lin 
644ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
645ae8ec5e1SHisping Lin 					1,
646ae8ec5e1SHisping Lin 					&TeecOperation,
647ae8ec5e1SHisping Lin 					&ErrorOrigin);
648ae8ec5e1SHisping Lin 
649ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
650ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
651ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
652ae8ec5e1SHisping Lin 	TeecResult = TEEC_FinalizeContext(&TeecContext);
653ae8ec5e1SHisping Lin 	debug("testmm end\n");
654ae8ec5e1SHisping Lin 
655ae8ec5e1SHisping Lin 	return TeecResult;
656ae8ec5e1SHisping Lin }
657ae8ec5e1SHisping Lin 
658ae8ec5e1SHisping Lin uint32_t write_to_keymaster(uint8_t *filename,
659ae8ec5e1SHisping Lin 		uint32_t filename_size,
660ae8ec5e1SHisping Lin 		uint8_t *data,
661ae8ec5e1SHisping Lin 		uint32_t data_size)
662ae8ec5e1SHisping Lin {
663ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
664ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
665ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
666ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
667ae8ec5e1SHisping Lin 
668ae8ec5e1SHisping Lin 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
669ae8ec5e1SHisping Lin 		{ 0xa8, 0x69, 0x9c, 0xe6, 0x88, 0x6c, 0x5d, 0x5d } };
670ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
671ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
672ae8ec5e1SHisping Lin 
673ae8ec5e1SHisping Lin 	debug("write_to_keymaster\n");
674ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
675ae8ec5e1SHisping Lin 
676ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
677ae8ec5e1SHisping Lin 
678ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
679ae8ec5e1SHisping Lin 				&TeecSession,
680ae8ec5e1SHisping Lin 				TeecUuid,
681ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
682ae8ec5e1SHisping Lin 				NULL,
683ae8ec5e1SHisping Lin 				NULL,
684ae8ec5e1SHisping Lin 				&ErrorOrigin);
685ae8ec5e1SHisping Lin 
686ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
687ae8ec5e1SHisping Lin 
688ae8ec5e1SHisping Lin 	SharedMem0.size = filename_size;
689ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
690ae8ec5e1SHisping Lin 
691ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
692ae8ec5e1SHisping Lin 
693ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, filename, SharedMem0.size);
694ae8ec5e1SHisping Lin 
695ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
696ae8ec5e1SHisping Lin 
697ae8ec5e1SHisping Lin 	SharedMem1.size = data_size;
698ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
699ae8ec5e1SHisping Lin 
700ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
701ae8ec5e1SHisping Lin 
702ae8ec5e1SHisping Lin 	memcpy(SharedMem1.buffer, data, SharedMem1.size);
703ae8ec5e1SHisping Lin 
704ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
705ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
706ae8ec5e1SHisping Lin 
707ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
708ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
709ae8ec5e1SHisping Lin 
710ae8ec5e1SHisping Lin 
711ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
712ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
713ae8ec5e1SHisping Lin 						TEEC_NONE,
714ae8ec5e1SHisping Lin 						TEEC_NONE);
715ae8ec5e1SHisping Lin 
716ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
717ae8ec5e1SHisping Lin 					139,
718ae8ec5e1SHisping Lin 					&TeecOperation,
719ae8ec5e1SHisping Lin 					&ErrorOrigin);
720ae8ec5e1SHisping Lin 
721ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
722ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
723ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
724ae8ec5e1SHisping Lin 	TeecResult = TEEC_FinalizeContext(&TeecContext);
725ae8ec5e1SHisping Lin 	debug("testmm end\n");
726ae8ec5e1SHisping Lin 	debug("TeecResult %x\n", TeecResult);
727ae8ec5e1SHisping Lin 
728ae8ec5e1SHisping Lin 	return TeecResult;
729ae8ec5e1SHisping Lin }
730*6ef445a4SHisping Lin 
731*6ef445a4SHisping Lin uint32_t trusty_read_attribute_hash(uint32_t *buf, uint32_t length)
732*6ef445a4SHisping Lin {
733*6ef445a4SHisping Lin 	TEEC_Result TeecResult;
734*6ef445a4SHisping Lin 	TEEC_Context TeecContext;
735*6ef445a4SHisping Lin 	TEEC_Session TeecSession;
736*6ef445a4SHisping Lin 	uint32_t ErrorOrigin;
737*6ef445a4SHisping Lin 
738*6ef445a4SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, \
739*6ef445a4SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
740*6ef445a4SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
741*6ef445a4SHisping Lin 	TEEC_Operation TeecOperation = {0};
742*6ef445a4SHisping Lin 
743*6ef445a4SHisping Lin 	OpteeClientApiLibInitialize();
744*6ef445a4SHisping Lin 
745*6ef445a4SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
746*6ef445a4SHisping Lin 
747*6ef445a4SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
748*6ef445a4SHisping Lin 				&TeecSession,
749*6ef445a4SHisping Lin 				TeecUuid,
750*6ef445a4SHisping Lin 				TEEC_LOGIN_PUBLIC,
751*6ef445a4SHisping Lin 				NULL,
752*6ef445a4SHisping Lin 				NULL,
753*6ef445a4SHisping Lin 				&ErrorOrigin);
754*6ef445a4SHisping Lin 
755*6ef445a4SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
756*6ef445a4SHisping Lin 
757*6ef445a4SHisping Lin 	SharedMem0.size = length * sizeof(uint32_t);
758*6ef445a4SHisping Lin 	SharedMem0.flags = 0;
759*6ef445a4SHisping Lin 
760*6ef445a4SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
761*6ef445a4SHisping Lin 
762*6ef445a4SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
763*6ef445a4SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
764*6ef445a4SHisping Lin 
765*6ef445a4SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT,
766*6ef445a4SHisping Lin 						TEEC_NONE,
767*6ef445a4SHisping Lin 						TEEC_NONE,
768*6ef445a4SHisping Lin 						TEEC_NONE);
769*6ef445a4SHisping Lin 
770*6ef445a4SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
771*6ef445a4SHisping Lin 					0,
772*6ef445a4SHisping Lin 					&TeecOperation,
773*6ef445a4SHisping Lin 					&ErrorOrigin);
774*6ef445a4SHisping Lin 
775*6ef445a4SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
776*6ef445a4SHisping Lin 		memcpy(buf, SharedMem0.buffer, SharedMem0.size);
777*6ef445a4SHisping Lin 
778*6ef445a4SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
779*6ef445a4SHisping Lin 	TEEC_CloseSession(&TeecSession);
780*6ef445a4SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
781*6ef445a4SHisping Lin 
782*6ef445a4SHisping Lin 	return TeecResult;
783*6ef445a4SHisping Lin }
784*6ef445a4SHisping Lin 
785*6ef445a4SHisping Lin uint32_t trusty_write_attribute_hash(uint32_t *buf, uint32_t length)
786*6ef445a4SHisping Lin {
787*6ef445a4SHisping Lin 	TEEC_Result TeecResult;
788*6ef445a4SHisping Lin 	TEEC_Context TeecContext;
789*6ef445a4SHisping Lin 	TEEC_Session TeecSession;
790*6ef445a4SHisping Lin 	uint32_t ErrorOrigin;
791*6ef445a4SHisping Lin 
792*6ef445a4SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, \
793*6ef445a4SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
794*6ef445a4SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
795*6ef445a4SHisping Lin 	TEEC_Operation TeecOperation = {0};
796*6ef445a4SHisping Lin 
797*6ef445a4SHisping Lin 	OpteeClientApiLibInitialize();
798*6ef445a4SHisping Lin 
799*6ef445a4SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
800*6ef445a4SHisping Lin 
801*6ef445a4SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
802*6ef445a4SHisping Lin 				&TeecSession,
803*6ef445a4SHisping Lin 				TeecUuid,
804*6ef445a4SHisping Lin 				TEEC_LOGIN_PUBLIC,
805*6ef445a4SHisping Lin 				NULL,
806*6ef445a4SHisping Lin 				NULL,
807*6ef445a4SHisping Lin 				&ErrorOrigin);
808*6ef445a4SHisping Lin 
809*6ef445a4SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
810*6ef445a4SHisping Lin 
811*6ef445a4SHisping Lin 	SharedMem0.size = length * sizeof(uint32_t);
812*6ef445a4SHisping Lin 	SharedMem0.flags = 0;
813*6ef445a4SHisping Lin 
814*6ef445a4SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
815*6ef445a4SHisping Lin 
816*6ef445a4SHisping Lin 	memcpy(SharedMem0.buffer, buf, SharedMem0.size);
817*6ef445a4SHisping Lin 
818*6ef445a4SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
819*6ef445a4SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
820*6ef445a4SHisping Lin 
821*6ef445a4SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
822*6ef445a4SHisping Lin 						TEEC_NONE,
823*6ef445a4SHisping Lin 						TEEC_NONE,
824*6ef445a4SHisping Lin 						TEEC_NONE);
825*6ef445a4SHisping Lin 
826*6ef445a4SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
827*6ef445a4SHisping Lin 					1,
828*6ef445a4SHisping Lin 					&TeecOperation,
829*6ef445a4SHisping Lin 					&ErrorOrigin);
830*6ef445a4SHisping Lin 
831*6ef445a4SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
832*6ef445a4SHisping Lin 	TEEC_CloseSession(&TeecSession);
833*6ef445a4SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
834*6ef445a4SHisping Lin 
835*6ef445a4SHisping Lin 	return TeecResult;
836*6ef445a4SHisping Lin }
837