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