xref: /optee_os/lib/libutee/include/utee_syscalls.h (revision 2c028fdebbedee91f88f6c5325b5064a124dfe46)
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 
32*2c028fdeSJerome Forissier void _utee_return(unsigned long ret) __noreturn;
33b0104773SPascal Brand 
34*2c028fdeSJerome Forissier void _utee_log(const void *buf, size_t len);
35b0104773SPascal Brand 
360e1c6e8eSJerome Forissier /* This is not __noreturn because AArch32 stack unwinding fails otherwise */
37*2c028fdeSJerome Forissier void _utee_panic(unsigned long code);
38b0104773SPascal Brand 
3964a5011eSPascal Brand /* prop_set is TEE_PROPSET_xxx*/
40*2c028fdeSJerome Forissier TEE_Result _utee_get_property(unsigned long prop_set, unsigned long index,
41*2c028fdeSJerome Forissier 			      void *name, uint32_t *name_len, void *buf,
42*2c028fdeSJerome Forissier 			      uint32_t *blen, uint32_t *prop_type);
43*2c028fdeSJerome Forissier 
44*2c028fdeSJerome 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 
49*2c028fdeSJerome Forissier /* sess has type TEE_TASessionHandle */
50*2c028fdeSJerome Forissier TEE_Result _utee_open_ta_session(const TEE_UUID *dest,
51*2c028fdeSJerome Forissier 				 unsigned long cancel_req_to,
52*2c028fdeSJerome Forissier 				 struct utee_params *params, uint32_t *sess,
53*2c028fdeSJerome Forissier 				 uint32_t *ret_orig);
54b0104773SPascal Brand 
55e86f1266SJens Wiklander /* sess has type TEE_TASessionHandle */
56*2c028fdeSJerome Forissier TEE_Result _utee_close_ta_session(unsigned long sess);
57b0104773SPascal Brand 
58e86f1266SJens Wiklander /* sess has type TEE_TASessionHandle */
59*2c028fdeSJerome Forissier TEE_Result _utee_invoke_ta_command(unsigned long sess,
60*2c028fdeSJerome Forissier 				   unsigned long cancel_req_to,
61*2c028fdeSJerome Forissier 				   unsigned long cmd_id,
62*2c028fdeSJerome Forissier 				   struct utee_params *params,
63*2c028fdeSJerome Forissier 				   uint32_t *ret_orig);
64b0104773SPascal Brand 
65*2c028fdeSJerome 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 */
69*2c028fdeSJerome Forissier TEE_Result _utee_get_cancellation_flag(uint32_t *cancel);
70b0104773SPascal Brand 
71e86f1266SJens Wiklander /* old_mask has type bool */
72*2c028fdeSJerome Forissier TEE_Result _utee_unmask_cancellation(uint32_t *old_mask);
73b0104773SPascal Brand 
74e86f1266SJens Wiklander /* old_mask has type bool */
75*2c028fdeSJerome Forissier TEE_Result _utee_mask_cancellation(uint32_t *old_mask);
76b0104773SPascal Brand 
77*2c028fdeSJerome Forissier TEE_Result _utee_wait(unsigned long timeout);
78b0104773SPascal Brand 
79*2c028fdeSJerome Forissier /* cat has type enum _utee_time_category */
80*2c028fdeSJerome Forissier TEE_Result _utee_get_time(unsigned long cat, TEE_Time *time);
81b0104773SPascal Brand 
82*2c028fdeSJerome Forissier TEE_Result _utee_set_ta_time(const TEE_Time *time);
83b0104773SPascal Brand 
84*2c028fdeSJerome 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);
87*2c028fdeSJerome Forissier TEE_Result _utee_cryp_state_copy(unsigned long dst, unsigned long src);
88*2c028fdeSJerome Forissier TEE_Result _utee_cryp_state_free(unsigned long state);
89b0104773SPascal Brand 
90b0104773SPascal Brand /* iv and iv_len are ignored for some algorithms */
91*2c028fdeSJerome Forissier TEE_Result _utee_hash_init(unsigned long state, const void *iv, size_t iv_len);
92*2c028fdeSJerome Forissier TEE_Result _utee_hash_update(unsigned long state, const void *chunk,
93b0104773SPascal Brand 			     size_t chunk_size);
94*2c028fdeSJerome 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 
97*2c028fdeSJerome Forissier TEE_Result _utee_cipher_init(unsigned long state, const void *iv,
98*2c028fdeSJerome Forissier 			     size_t iv_len);
99*2c028fdeSJerome Forissier TEE_Result _utee_cipher_update(unsigned long state, const void *src,
100e86f1266SJens Wiklander 			       size_t src_len, void *dest, uint64_t *dest_len);
101*2c028fdeSJerome 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*2c028fdeSJerome Forissier TEE_Result _utee_cryp_obj_get_info(unsigned long obj, TEE_ObjectInfo *info);
106*2c028fdeSJerome Forissier TEE_Result _utee_cryp_obj_restrict_usage(unsigned long obj,
107*2c028fdeSJerome Forissier 					 unsigned long usage);
108*2c028fdeSJerome Forissier TEE_Result _utee_cryp_obj_get_attr(unsigned long obj, unsigned long attr_id,
109e86f1266SJens Wiklander 				   void *buffer, uint64_t *size);
110b0104773SPascal Brand 
111b0104773SPascal Brand /* Transient Object Functions */
112e86f1266SJens Wiklander /* type has type TEE_ObjectType */
113*2c028fdeSJerome Forissier TEE_Result _utee_cryp_obj_alloc(unsigned long type, unsigned long max_size,
114b0104773SPascal Brand 				uint32_t *obj);
115*2c028fdeSJerome Forissier TEE_Result _utee_cryp_obj_close(unsigned long obj);
116*2c028fdeSJerome Forissier TEE_Result _utee_cryp_obj_reset(unsigned long obj);
117*2c028fdeSJerome Forissier TEE_Result _utee_cryp_obj_populate(unsigned long obj,
118*2c028fdeSJerome Forissier 				   struct utee_attribute *attrs,
119*2c028fdeSJerome Forissier 				   unsigned long attr_count);
120*2c028fdeSJerome Forissier TEE_Result _utee_cryp_obj_copy(unsigned long dst_obj, unsigned long src_obj);
121b0104773SPascal Brand 
122*2c028fdeSJerome Forissier TEE_Result _utee_cryp_obj_generate_key(unsigned long obj,
123*2c028fdeSJerome Forissier 				       unsigned long key_size,
124e86f1266SJens Wiklander 				       const struct utee_attribute *params,
125e86f1266SJens Wiklander 				       unsigned long param_count);
126b0104773SPascal Brand 
127*2c028fdeSJerome Forissier TEE_Result _utee_cryp_derive_key(unsigned long state,
128e86f1266SJens Wiklander 				 const struct utee_attribute *params,
129*2c028fdeSJerome Forissier 				 unsigned long param_count,
130*2c028fdeSJerome Forissier 				 unsigned long derived_key);
131b0104773SPascal Brand 
132*2c028fdeSJerome Forissier TEE_Result _utee_cryp_random_number_generate(void *buf, size_t blen);
133b0104773SPascal Brand 
134*2c028fdeSJerome Forissier TEE_Result _utee_authenc_init(unsigned long state, const void *nonce,
135b0104773SPascal Brand 			      size_t nonce_len, size_t tag_len, size_t aad_len,
136b0104773SPascal Brand 			      size_t payload_len);
137*2c028fdeSJerome Forissier TEE_Result _utee_authenc_update_aad(unsigned long state, const void *aad_data,
138b0104773SPascal Brand 				    size_t aad_data_len);
139*2c028fdeSJerome Forissier TEE_Result _utee_authenc_update_payload(unsigned long state,
140*2c028fdeSJerome Forissier 					const void *src_data, size_t src_len,
141*2c028fdeSJerome Forissier 					void *dest_data, uint64_t *dest_len);
142*2c028fdeSJerome Forissier TEE_Result _utee_authenc_enc_final(unsigned long state, const void *src_data,
143*2c028fdeSJerome Forissier 				   size_t src_len, void *dest_data,
144*2c028fdeSJerome Forissier 				   uint64_t *dest_len, void *tag,
145*2c028fdeSJerome Forissier 				   uint64_t *tag_len);
146*2c028fdeSJerome Forissier TEE_Result _utee_authenc_dec_final(unsigned long state, const void *src_data,
147*2c028fdeSJerome Forissier 				   size_t src_len, void *dest_data,
148*2c028fdeSJerome Forissier 				   uint64_t *dest_len, const void *tag,
149*2c028fdeSJerome Forissier 				   size_t tag_len);
150b0104773SPascal Brand 
151*2c028fdeSJerome Forissier TEE_Result _utee_asymm_operate(unsigned long state,
152e86f1266SJens Wiklander 			       const struct utee_attribute *params,
153e86f1266SJens Wiklander 			       unsigned long num_params, const void *src_data,
154*2c028fdeSJerome Forissier 			       size_t src_len, void *dest_data,
155*2c028fdeSJerome Forissier 			       uint64_t *dest_len);
156b0104773SPascal Brand 
157*2c028fdeSJerome Forissier TEE_Result _utee_asymm_verify(unsigned long state,
158e86f1266SJens Wiklander 			      const struct utee_attribute *params,
159e86f1266SJens Wiklander 			      unsigned long num_params, const void *data,
160e86f1266SJens Wiklander 			      size_t data_len, const void *sig, size_t sig_len);
161b0104773SPascal Brand 
162b0104773SPascal Brand /* Persistant Object Functions */
163e86f1266SJens Wiklander /* obj is of type TEE_ObjectHandle */
164*2c028fdeSJerome Forissier TEE_Result _utee_storage_obj_open(unsigned long storage_id,
165*2c028fdeSJerome Forissier 				  const void *object_id, size_t object_id_len,
166*2c028fdeSJerome Forissier 				  unsigned long flags, uint32_t *obj);
167b0104773SPascal Brand 
168e86f1266SJens Wiklander /*
169e86f1266SJens Wiklander  * attr is of type TEE_ObjectHandle
170e86f1266SJens Wiklander  * obj is of type TEE_ObjectHandle
171e86f1266SJens Wiklander  */
172*2c028fdeSJerome Forissier TEE_Result _utee_storage_obj_create(unsigned long storage_id,
1738f07fe6fSJerome Forissier 				    const void *object_id,
174e86f1266SJens Wiklander 				    size_t object_id_len, unsigned long flags,
175e86f1266SJens Wiklander 				    unsigned long attr, const void *data,
176e86f1266SJens Wiklander 				    size_t len, uint32_t *obj);
177b0104773SPascal Brand 
178e86f1266SJens Wiklander /* obj is of type TEE_ObjectHandle */
179*2c028fdeSJerome Forissier TEE_Result _utee_storage_obj_del(unsigned long obj);
180b0104773SPascal Brand 
181e86f1266SJens Wiklander /* obj is of type TEE_ObjectHandle */
182*2c028fdeSJerome Forissier TEE_Result _utee_storage_obj_rename(unsigned long obj, const void *new_obj_id,
183b0104773SPascal Brand 				    size_t new_obj_id_len);
184b0104773SPascal Brand 
185b0104773SPascal Brand /* Persistent Object Enumeration Functions */
186e86f1266SJens Wiklander /* obj_enum is of type TEE_ObjectEnumHandle */
187*2c028fdeSJerome Forissier TEE_Result _utee_storage_alloc_enum(uint32_t *obj_enum);
188b0104773SPascal Brand 
189b0104773SPascal Brand 
190e86f1266SJens Wiklander /* obj_enum is of type TEE_ObjectEnumHandle */
191*2c028fdeSJerome Forissier TEE_Result _utee_storage_free_enum(unsigned long obj_enum);
192b0104773SPascal Brand 
193e86f1266SJens Wiklander /* obj_enum is of type TEE_ObjectEnumHandle */
194*2c028fdeSJerome Forissier TEE_Result _utee_storage_reset_enum(unsigned long obj_enum);
195b0104773SPascal Brand 
196e86f1266SJens Wiklander /* obj_enum is of type TEE_ObjectEnumHandle */
197*2c028fdeSJerome Forissier TEE_Result _utee_storage_start_enum(unsigned long obj_enum,
198e86f1266SJens Wiklander 				    unsigned long storage_id);
199e86f1266SJens Wiklander 
200e86f1266SJens Wiklander /* obj_enum is of type TEE_ObjectEnumHandle */
201*2c028fdeSJerome Forissier TEE_Result _utee_storage_next_enum(unsigned long obj_enum, TEE_ObjectInfo *info,
202e86f1266SJens Wiklander 				   void *obj_id, uint64_t *len);
203b0104773SPascal Brand 
204b0104773SPascal Brand /* Data Stream Access Functions */
205e86f1266SJens Wiklander /* obj is of type TEE_ObjectHandle */
206*2c028fdeSJerome Forissier TEE_Result _utee_storage_obj_read(unsigned long obj, void *data, size_t len,
207e86f1266SJens Wiklander 				  uint64_t *count);
208b0104773SPascal Brand 
209e86f1266SJens Wiklander /* obj is of type TEE_ObjectHandle */
210*2c028fdeSJerome Forissier TEE_Result _utee_storage_obj_write(unsigned long obj, const void *data,
211b0104773SPascal Brand 				   size_t len);
212b0104773SPascal Brand 
213e86f1266SJens Wiklander /* obj is of type TEE_ObjectHandle */
214*2c028fdeSJerome Forissier TEE_Result _utee_storage_obj_trunc(unsigned long obj, size_t len);
215b0104773SPascal Brand 
216e86f1266SJens Wiklander /* obj is of type TEE_ObjectHandle */
217e86f1266SJens Wiklander /* whence is of type TEE_Whence */
218*2c028fdeSJerome Forissier TEE_Result _utee_storage_obj_seek(unsigned long obj, int32_t offset,
219e86f1266SJens Wiklander 				  unsigned long whence);
220b0104773SPascal Brand 
221e86f1266SJens Wiklander /* seServiceHandle is of type TEE_SEServiceHandle */
222*2c028fdeSJerome Forissier TEE_Result _utee_se_service_open(uint32_t *seServiceHandle);
223197d17e7SSY Chiu 
224e86f1266SJens Wiklander /* seServiceHandle is of type TEE_SEServiceHandle */
225*2c028fdeSJerome Forissier TEE_Result _utee_se_service_close(unsigned long seServiceHandle);
226197d17e7SSY Chiu 
227e86f1266SJens Wiklander /*
228e86f1266SJens Wiklander  * seServiceHandle is of type TEE_SEServiceHandle
229e86f1266SJens Wiklander  * r is of type TEE_SEReaderHandle
230e86f1266SJens Wiklander  */
231*2c028fdeSJerome Forissier TEE_Result _utee_se_service_get_readers(unsigned long seServiceHandle,
232e86f1266SJens Wiklander 					uint32_t *r, uint64_t *len);
233197d17e7SSY Chiu 
234e86f1266SJens Wiklander /*
235e86f1266SJens Wiklander  * r is of type TEE_SEReaderHandle
236e86f1266SJens Wiklander  * p is defined with defines UTEE_SE_READER_*
237e86f1266SJens Wiklander  */
238*2c028fdeSJerome Forissier TEE_Result _utee_se_reader_get_prop(unsigned long r, uint32_t *p);
239197d17e7SSY Chiu 
240e86f1266SJens Wiklander /* r is of type TEE_SEReaderHandle */
241*2c028fdeSJerome Forissier TEE_Result _utee_se_reader_get_name(unsigned long r, char *name,
242*2c028fdeSJerome Forissier 				    uint64_t *name_len);
243197d17e7SSY Chiu 
244e86f1266SJens Wiklander /*
245e86f1266SJens Wiklander  * r is of type TEE_SEReaderHandle
246e86f1266SJens Wiklander  * s if of type TEE_SESessionHandle
247e86f1266SJens Wiklander  */
248*2c028fdeSJerome Forissier TEE_Result _utee_se_reader_open_session(unsigned long r, uint32_t *s);
249197d17e7SSY Chiu 
250e86f1266SJens Wiklander /* r is of type TEE_SEReaderHandle */
251*2c028fdeSJerome Forissier TEE_Result _utee_se_reader_close_sessions(unsigned long r);
252197d17e7SSY Chiu 
253e86f1266SJens Wiklander /* s is of type TEE_SESessionHandle */
254*2c028fdeSJerome Forissier TEE_Result _utee_se_session_is_closed(unsigned long s);
255197d17e7SSY Chiu 
256e86f1266SJens Wiklander /* s is of type TEE_SESessionHandle */
257*2c028fdeSJerome Forissier TEE_Result _utee_se_session_get_atr(unsigned long s, void *atr,
258e86f1266SJens Wiklander 				    uint64_t *atr_len);
259197d17e7SSY Chiu 
260e86f1266SJens Wiklander /*
261e86f1266SJens Wiklander  * s is of type TEE_SESessionHandle
262e86f1266SJens Wiklander  * c is of type TEE_SEChannelHandle
263e86f1266SJens Wiklander  */
264*2c028fdeSJerome Forissier TEE_Result _utee_se_session_open_channel(unsigned long s,
265*2c028fdeSJerome Forissier 					 unsigned long is_logical,
266*2c028fdeSJerome Forissier 					 const void *aid_buffer,
267e86f1266SJens Wiklander 					 size_t aid_buffer_len, uint32_t *c);
268197d17e7SSY Chiu 
269e86f1266SJens Wiklander /* s is of type TEE_SESessionHandle */
270*2c028fdeSJerome Forissier TEE_Result _utee_se_session_close(unsigned long s);
271197d17e7SSY Chiu 
272e86f1266SJens Wiklander /* c is of type TEE_SEChannelHandle */
273*2c028fdeSJerome Forissier TEE_Result _utee_se_channel_select_next(unsigned long c);
274197d17e7SSY Chiu 
275e86f1266SJens Wiklander /* c is of type TEE_SEChannelHandle */
276*2c028fdeSJerome Forissier TEE_Result _utee_se_channel_get_select_resp(unsigned long c, void *resp,
277e86f1266SJens Wiklander 					    uint64_t *resp_len);
278197d17e7SSY Chiu 
279e86f1266SJens Wiklander /* c is of type TEE_SEChannelHandle */
280*2c028fdeSJerome Forissier TEE_Result _utee_se_channel_transmit(unsigned long c, void *cmd, size_t cmd_len,
281*2c028fdeSJerome Forissier 				     void *resp, uint64_t *resp_len);
282197d17e7SSY Chiu 
283e86f1266SJens Wiklander /* c is of type TEE_SEChannelHandle */
284*2c028fdeSJerome Forissier TEE_Result _utee_se_channel_close(unsigned long c);
285197d17e7SSY Chiu 
286*2c028fdeSJerome Forissier /* op is of type enum _utee_cache_operation */
287*2c028fdeSJerome Forissier TEE_Result _utee_cache_operation(void *va, size_t l, unsigned long op);
288fa530828SPascal Brand 
289*2c028fdeSJerome Forissier TEE_Result _utee_gprof_send(void *buf, size_t size, uint32_t *id);
290883c4be3SJerome Forissier 
291b0104773SPascal Brand #endif /* UTEE_SYSCALLS_H */
292