xref: /optee_os/lib/libutee/include/utee_syscalls.h (revision 6240c6e1d2de517c6f4e0cb7740456527961bf2d)
11bb92983SJerome Forissier /* SPDX-License-Identifier: BSD-2-Clause */
2b0104773SPascal Brand /*
3e86f1266SJens Wiklander  * Copyright (c) 2015, Linaro Limited
4b0104773SPascal Brand  * Copyright (c) 2014, STMicroelectronics International N.V.
5b0104773SPascal Brand  */
6b0104773SPascal Brand #ifndef UTEE_SYSCALLS_H
7b0104773SPascal Brand #define UTEE_SYSCALLS_H
8b0104773SPascal Brand 
9cebdec51SJens Wiklander #include <compiler.h>
10b0104773SPascal Brand #include <stddef.h>
11b0104773SPascal Brand #include <stdint.h>
12b0104773SPascal Brand 
13b0104773SPascal Brand #include <utee_types.h>
14b0104773SPascal Brand #include <tee_api_types.h>
154de4bebcSJens Wiklander #include <trace.h>
16b0104773SPascal Brand 
17e86f1266SJens Wiklander /*
189102ce21SJens Wiklander  * Arguments must use the native register width, unless it's a signed
199102ce21SJens Wiklander  * argument then it must be a 32-bit value instead to avoid problems with
209102ce21SJens Wiklander  * sign extension. To keep it simple, only use pointers, int32_t, unsigned
219102ce21SJens Wiklander  * long and size_t. Pointers may only point structures or types based on
229102ce21SJens Wiklander  * fixed width integer types. Only exception are buffers with opaque data.
23e86f1266SJens Wiklander  *
24e86f1266SJens Wiklander  * Return values should not use a fixed width larger than 32 bits, unsigned
25e86f1266SJens Wiklander  * long and pointers are OK though.
26e86f1266SJens Wiklander  *
27e86f1266SJens Wiklander  * Members in structs on the other hand should only use fixed width integer
28e86f1266SJens Wiklander  * types; uint32_t, uint64_t etc. To keep it simple, use uint64_t for all
29e86f1266SJens Wiklander  * length fields.
30e86f1266SJens Wiklander  */
31e86f1266SJens Wiklander 
322c028fdeSJerome Forissier void _utee_return(unsigned long ret) __noreturn;
33b0104773SPascal Brand 
342c028fdeSJerome Forissier void _utee_log(const void *buf, size_t len);
35b0104773SPascal Brand 
360e1c6e8eSJerome Forissier /* This is not __noreturn because AArch32 stack unwinding fails otherwise */
372c028fdeSJerome Forissier void _utee_panic(unsigned long code);
38b0104773SPascal Brand 
3964a5011eSPascal Brand /* prop_set is TEE_PROPSET_xxx*/
402c028fdeSJerome Forissier TEE_Result _utee_get_property(unsigned long prop_set, unsigned long index,
412c028fdeSJerome Forissier 			      void *name, uint32_t *name_len, void *buf,
422c028fdeSJerome Forissier 			      uint32_t *blen, uint32_t *prop_type);
432c028fdeSJerome Forissier 
442c028fdeSJerome Forissier TEE_Result _utee_get_property_name_to_index(unsigned long prop_set,
458f07fe6fSJerome Forissier 					    const void *name,
4664a5011eSPascal Brand 					    unsigned long name_len,
4764a5011eSPascal Brand 					    uint32_t *index);
4864a5011eSPascal Brand 
492c028fdeSJerome Forissier /* sess has type TEE_TASessionHandle */
502c028fdeSJerome Forissier TEE_Result _utee_open_ta_session(const TEE_UUID *dest,
512c028fdeSJerome Forissier 				 unsigned long cancel_req_to,
522c028fdeSJerome Forissier 				 struct utee_params *params, uint32_t *sess,
532c028fdeSJerome Forissier 				 uint32_t *ret_orig);
54b0104773SPascal Brand 
55e86f1266SJens Wiklander /* sess has type TEE_TASessionHandle */
562c028fdeSJerome Forissier TEE_Result _utee_close_ta_session(unsigned long sess);
57b0104773SPascal Brand 
58e86f1266SJens Wiklander /* sess has type TEE_TASessionHandle */
592c028fdeSJerome Forissier TEE_Result _utee_invoke_ta_command(unsigned long sess,
602c028fdeSJerome Forissier 				   unsigned long cancel_req_to,
612c028fdeSJerome Forissier 				   unsigned long cmd_id,
622c028fdeSJerome Forissier 				   struct utee_params *params,
632c028fdeSJerome Forissier 				   uint32_t *ret_orig);
64b0104773SPascal Brand 
652c028fdeSJerome Forissier TEE_Result _utee_check_access_rights(uint32_t flags, const void *buf,
66b0104773SPascal Brand 				     size_t len);
67b0104773SPascal Brand 
68e86f1266SJens Wiklander /* cancel has type bool */
692c028fdeSJerome Forissier TEE_Result _utee_get_cancellation_flag(uint32_t *cancel);
70b0104773SPascal Brand 
71e86f1266SJens Wiklander /* old_mask has type bool */
722c028fdeSJerome Forissier TEE_Result _utee_unmask_cancellation(uint32_t *old_mask);
73b0104773SPascal Brand 
74e86f1266SJens Wiklander /* old_mask has type bool */
752c028fdeSJerome Forissier TEE_Result _utee_mask_cancellation(uint32_t *old_mask);
76b0104773SPascal Brand 
772c028fdeSJerome Forissier TEE_Result _utee_wait(unsigned long timeout);
78b0104773SPascal Brand 
792c028fdeSJerome Forissier /* cat has type enum _utee_time_category */
802c028fdeSJerome Forissier TEE_Result _utee_get_time(unsigned long cat, TEE_Time *time);
81b0104773SPascal Brand 
822c028fdeSJerome Forissier TEE_Result _utee_set_ta_time(const TEE_Time *time);
83b0104773SPascal Brand 
842c028fdeSJerome Forissier TEE_Result _utee_cryp_state_alloc(unsigned long algo, unsigned long op_mode,
85e86f1266SJens Wiklander 				  unsigned long key1, unsigned long key2,
86b0104773SPascal Brand 				  uint32_t *state);
872c028fdeSJerome Forissier TEE_Result _utee_cryp_state_copy(unsigned long dst, unsigned long src);
882c028fdeSJerome Forissier TEE_Result _utee_cryp_state_free(unsigned long state);
89b0104773SPascal Brand 
90b0104773SPascal Brand /* iv and iv_len are ignored for some algorithms */
912c028fdeSJerome Forissier TEE_Result _utee_hash_init(unsigned long state, const void *iv, size_t iv_len);
922c028fdeSJerome Forissier TEE_Result _utee_hash_update(unsigned long state, const void *chunk,
93b0104773SPascal Brand 			     size_t chunk_size);
942c028fdeSJerome Forissier TEE_Result _utee_hash_final(unsigned long state, const void *chunk,
95e86f1266SJens Wiklander 			    size_t chunk_size, void *hash, uint64_t *hash_len);
96b0104773SPascal Brand 
972c028fdeSJerome Forissier TEE_Result _utee_cipher_init(unsigned long state, const void *iv,
982c028fdeSJerome Forissier 			     size_t iv_len);
992c028fdeSJerome Forissier TEE_Result _utee_cipher_update(unsigned long state, const void *src,
100e86f1266SJens Wiklander 			       size_t src_len, void *dest, uint64_t *dest_len);
1012c028fdeSJerome Forissier TEE_Result _utee_cipher_final(unsigned long state, const void *src,
102e86f1266SJens Wiklander 			      size_t src_len, void *dest, uint64_t *dest_len);
103b0104773SPascal Brand 
104b0104773SPascal Brand /* Generic Object Functions */
105*75d6a373SJens Wiklander TEE_Result _utee_cryp_obj_get_info(unsigned long obj,
106*75d6a373SJens Wiklander 				   struct utee_object_info *info);
1072c028fdeSJerome Forissier TEE_Result _utee_cryp_obj_restrict_usage(unsigned long obj,
1082c028fdeSJerome Forissier 					 unsigned long usage);
1092c028fdeSJerome Forissier TEE_Result _utee_cryp_obj_get_attr(unsigned long obj, unsigned long attr_id,
110e86f1266SJens Wiklander 				   void *buffer, uint64_t *size);
111b0104773SPascal Brand 
112b0104773SPascal Brand /* Transient Object Functions */
113e86f1266SJens Wiklander /* type has type TEE_ObjectType */
1142c028fdeSJerome Forissier TEE_Result _utee_cryp_obj_alloc(unsigned long type, unsigned long max_size,
115b0104773SPascal Brand 				uint32_t *obj);
1162c028fdeSJerome Forissier TEE_Result _utee_cryp_obj_close(unsigned long obj);
1172c028fdeSJerome Forissier TEE_Result _utee_cryp_obj_reset(unsigned long obj);
1182c028fdeSJerome Forissier TEE_Result _utee_cryp_obj_populate(unsigned long obj,
1192c028fdeSJerome Forissier 				   struct utee_attribute *attrs,
1202c028fdeSJerome Forissier 				   unsigned long attr_count);
1212c028fdeSJerome Forissier TEE_Result _utee_cryp_obj_copy(unsigned long dst_obj, unsigned long src_obj);
122b0104773SPascal Brand 
1232c028fdeSJerome Forissier TEE_Result _utee_cryp_obj_generate_key(unsigned long obj,
1242c028fdeSJerome Forissier 				       unsigned long key_size,
125e86f1266SJens Wiklander 				       const struct utee_attribute *params,
126e86f1266SJens Wiklander 				       unsigned long param_count);
127b0104773SPascal Brand 
1282c028fdeSJerome Forissier TEE_Result _utee_cryp_derive_key(unsigned long state,
129e86f1266SJens Wiklander 				 const struct utee_attribute *params,
1302c028fdeSJerome Forissier 				 unsigned long param_count,
1312c028fdeSJerome Forissier 				 unsigned long derived_key);
132b0104773SPascal Brand 
1332c028fdeSJerome Forissier TEE_Result _utee_cryp_random_number_generate(void *buf, size_t blen);
134b0104773SPascal Brand 
1352c028fdeSJerome Forissier TEE_Result _utee_authenc_init(unsigned long state, const void *nonce,
136b0104773SPascal Brand 			      size_t nonce_len, size_t tag_len, size_t aad_len,
137b0104773SPascal Brand 			      size_t payload_len);
1382c028fdeSJerome Forissier TEE_Result _utee_authenc_update_aad(unsigned long state, const void *aad_data,
139b0104773SPascal Brand 				    size_t aad_data_len);
1402c028fdeSJerome Forissier TEE_Result _utee_authenc_update_payload(unsigned long state,
1412c028fdeSJerome Forissier 					const void *src_data, size_t src_len,
1422c028fdeSJerome Forissier 					void *dest_data, uint64_t *dest_len);
1432c028fdeSJerome Forissier TEE_Result _utee_authenc_enc_final(unsigned long state, const void *src_data,
1442c028fdeSJerome Forissier 				   size_t src_len, void *dest_data,
1452c028fdeSJerome Forissier 				   uint64_t *dest_len, void *tag,
1462c028fdeSJerome Forissier 				   uint64_t *tag_len);
1472c028fdeSJerome Forissier TEE_Result _utee_authenc_dec_final(unsigned long state, const void *src_data,
1482c028fdeSJerome Forissier 				   size_t src_len, void *dest_data,
1492c028fdeSJerome Forissier 				   uint64_t *dest_len, const void *tag,
1502c028fdeSJerome Forissier 				   size_t tag_len);
151b0104773SPascal Brand 
1522c028fdeSJerome Forissier TEE_Result _utee_asymm_operate(unsigned long state,
153e86f1266SJens Wiklander 			       const struct utee_attribute *params,
154e86f1266SJens Wiklander 			       unsigned long num_params, const void *src_data,
1552c028fdeSJerome Forissier 			       size_t src_len, void *dest_data,
1562c028fdeSJerome Forissier 			       uint64_t *dest_len);
157b0104773SPascal Brand 
1582c028fdeSJerome Forissier TEE_Result _utee_asymm_verify(unsigned long state,
159e86f1266SJens Wiklander 			      const struct utee_attribute *params,
160e86f1266SJens Wiklander 			      unsigned long num_params, const void *data,
161e86f1266SJens Wiklander 			      size_t data_len, const void *sig, size_t sig_len);
162b0104773SPascal Brand 
163b0104773SPascal Brand /* Persistant Object Functions */
164e86f1266SJens Wiklander /* obj is of type TEE_ObjectHandle */
1652c028fdeSJerome Forissier TEE_Result _utee_storage_obj_open(unsigned long storage_id,
1662c028fdeSJerome Forissier 				  const void *object_id, size_t object_id_len,
1672c028fdeSJerome Forissier 				  unsigned long flags, uint32_t *obj);
168b0104773SPascal Brand 
169e86f1266SJens Wiklander /*
170e86f1266SJens Wiklander  * attr is of type TEE_ObjectHandle
171e86f1266SJens Wiklander  * obj is of type TEE_ObjectHandle
172e86f1266SJens Wiklander  */
1732c028fdeSJerome Forissier TEE_Result _utee_storage_obj_create(unsigned long storage_id,
1748f07fe6fSJerome Forissier 				    const void *object_id,
175e86f1266SJens Wiklander 				    size_t object_id_len, unsigned long flags,
176e86f1266SJens Wiklander 				    unsigned long attr, const void *data,
177e86f1266SJens Wiklander 				    size_t len, uint32_t *obj);
178b0104773SPascal Brand 
179e86f1266SJens Wiklander /* obj is of type TEE_ObjectHandle */
1802c028fdeSJerome Forissier TEE_Result _utee_storage_obj_del(unsigned long obj);
181b0104773SPascal Brand 
182e86f1266SJens Wiklander /* obj is of type TEE_ObjectHandle */
1832c028fdeSJerome Forissier TEE_Result _utee_storage_obj_rename(unsigned long obj, const void *new_obj_id,
184b0104773SPascal Brand 				    size_t new_obj_id_len);
185b0104773SPascal Brand 
186b0104773SPascal Brand /* Persistent Object Enumeration Functions */
187e86f1266SJens Wiklander /* obj_enum is of type TEE_ObjectEnumHandle */
1882c028fdeSJerome Forissier TEE_Result _utee_storage_alloc_enum(uint32_t *obj_enum);
189b0104773SPascal Brand 
190b0104773SPascal Brand 
191e86f1266SJens Wiklander /* obj_enum is of type TEE_ObjectEnumHandle */
1922c028fdeSJerome Forissier TEE_Result _utee_storage_free_enum(unsigned long obj_enum);
193b0104773SPascal Brand 
194e86f1266SJens Wiklander /* obj_enum is of type TEE_ObjectEnumHandle */
1952c028fdeSJerome Forissier TEE_Result _utee_storage_reset_enum(unsigned long obj_enum);
196b0104773SPascal Brand 
197e86f1266SJens Wiklander /* obj_enum is of type TEE_ObjectEnumHandle */
1982c028fdeSJerome Forissier TEE_Result _utee_storage_start_enum(unsigned long obj_enum,
199e86f1266SJens Wiklander 				    unsigned long storage_id);
200e86f1266SJens Wiklander 
201e86f1266SJens Wiklander /* obj_enum is of type TEE_ObjectEnumHandle */
202*75d6a373SJens Wiklander TEE_Result _utee_storage_next_enum(unsigned long obj_enum,
203*75d6a373SJens Wiklander 				   struct utee_object_info *info,
204e86f1266SJens Wiklander 				   void *obj_id, uint64_t *len);
205b0104773SPascal Brand 
206b0104773SPascal Brand /* Data Stream Access Functions */
207e86f1266SJens Wiklander /* obj is of type TEE_ObjectHandle */
2082c028fdeSJerome Forissier TEE_Result _utee_storage_obj_read(unsigned long obj, void *data, size_t len,
209e86f1266SJens Wiklander 				  uint64_t *count);
210b0104773SPascal Brand 
211e86f1266SJens Wiklander /* obj is of type TEE_ObjectHandle */
2122c028fdeSJerome Forissier TEE_Result _utee_storage_obj_write(unsigned long obj, const void *data,
213b0104773SPascal Brand 				   size_t len);
214b0104773SPascal Brand 
215e86f1266SJens Wiklander /* obj is of type TEE_ObjectHandle */
2162c028fdeSJerome Forissier TEE_Result _utee_storage_obj_trunc(unsigned long obj, size_t len);
217b0104773SPascal Brand 
218e86f1266SJens Wiklander /* obj is of type TEE_ObjectHandle */
219e86f1266SJens Wiklander /* whence is of type TEE_Whence */
2202c028fdeSJerome Forissier TEE_Result _utee_storage_obj_seek(unsigned long obj, int32_t offset,
221e86f1266SJens Wiklander 				  unsigned long whence);
222b0104773SPascal Brand 
2232c028fdeSJerome Forissier /* op is of type enum _utee_cache_operation */
2242c028fdeSJerome Forissier TEE_Result _utee_cache_operation(void *va, size_t l, unsigned long op);
225fa530828SPascal Brand 
2262c028fdeSJerome Forissier TEE_Result _utee_gprof_send(void *buf, size_t size, uint32_t *id);
227883c4be3SJerome Forissier 
228b0104773SPascal Brand #endif /* UTEE_SYSCALLS_H */
229