xref: /optee_os/lib/libutee/include/utee_syscalls.h (revision 51ac0e23b5c2b3c84469a0de79c9f027a46d5747)
1 /*
2  * Copyright (c) 2015, Linaro Limited
3  * Copyright (c) 2014, STMicroelectronics International N.V.
4  * All rights reserved.
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions are met:
8  *
9  * 1. Redistributions of source code must retain the above copyright notice,
10  * this list of conditions and the following disclaimer.
11  *
12  * 2. Redistributions in binary form must reproduce the above copyright notice,
13  * this list of conditions and the following disclaimer in the documentation
14  * and/or other materials provided with the distribution.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
20  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26  * POSSIBILITY OF SUCH DAMAGE.
27  */
28 #ifndef UTEE_SYSCALLS_H
29 #define UTEE_SYSCALLS_H
30 
31 #include <compiler.h>
32 #include <stddef.h>
33 #include <stdint.h>
34 
35 #include <utee_types.h>
36 #include <tee_api_types.h>
37 #include <trace.h>
38 
39 /*
40  * Arguments must use the native register width. To keep it simple, only
41  * use pointers, long, unsigned long and size_t. Pointers may only point
42  * structures or types based on fixed width integer types. Only exception
43  * are buffers with opaque data.
44  *
45  * Return values should not use a fixed width larger than 32 bits, unsigned
46  * long and pointers are OK though.
47  *
48  * Members in structs on the other hand should only use fixed width integer
49  * types; uint32_t, uint64_t etc. To keep it simple, use uint64_t for all
50  * length fields.
51  */
52 
53 void utee_return(unsigned long ret) __noreturn;
54 
55 void utee_log(const void *buf, size_t len);
56 
57 void utee_panic(unsigned long code) __noreturn;
58 
59 /* prop_set is TEE_PROPSET_xxx*/
60 TEE_Result utee_get_property(unsigned long prop_set, unsigned long index,
61 			     void *name, uint32_t *name_len,
62 			     void *buf, uint32_t *blen,
63 				uint32_t *prop_type);
64 TEE_Result utee_get_property_name_to_index(unsigned long prop_set, void *name,
65 					   unsigned long name_len,
66 					   uint32_t *index);
67 
68 
69 /* sess has type TEE_TASessionHandle */
70 TEE_Result utee_open_ta_session(const TEE_UUID *dest,
71 			unsigned long cancel_req_to, struct utee_params *params,
72 			uint32_t *sess, uint32_t *ret_orig);
73 
74 /* sess has type TEE_TASessionHandle */
75 TEE_Result utee_close_ta_session(unsigned long sess);
76 
77 /* sess has type TEE_TASessionHandle */
78 TEE_Result utee_invoke_ta_command(unsigned long sess,
79 			unsigned long cancel_req_to, unsigned long cmd_id,
80 			struct utee_params *params, uint32_t *ret_orig);
81 
82 TEE_Result utee_check_access_rights(uint32_t flags, const void *buf,
83 				    size_t len);
84 
85 /* cancel has type bool */
86 TEE_Result utee_get_cancellation_flag(uint32_t *cancel);
87 
88 /* old_mask has type bool */
89 TEE_Result utee_unmask_cancellation(uint32_t *old_mask);
90 
91 /* old_mask has type bool */
92 TEE_Result utee_mask_cancellation(uint32_t *old_mask);
93 
94 TEE_Result utee_wait(unsigned long timeout);
95 
96 /* cat has type enum utee_time_category */
97 TEE_Result utee_get_time(unsigned long cat, TEE_Time *time);
98 
99 TEE_Result utee_set_ta_time(const TEE_Time *time);
100 
101 TEE_Result utee_cryp_state_alloc(unsigned long algo, unsigned long op_mode,
102 				 unsigned long key1, unsigned long key2,
103 				 uint32_t *state);
104 TEE_Result utee_cryp_state_copy(unsigned long dst, unsigned long src);
105 TEE_Result utee_cryp_state_free(unsigned long state);
106 
107 /* iv and iv_len are ignored for some algorithms */
108 TEE_Result utee_hash_init(unsigned long state, const void *iv, size_t iv_len);
109 TEE_Result utee_hash_update(unsigned long state, const void *chunk,
110 			    size_t chunk_size);
111 TEE_Result utee_hash_final(unsigned long state, const void *chunk,
112 			   size_t chunk_size, void *hash, uint64_t *hash_len);
113 
114 TEE_Result utee_cipher_init(unsigned long state, const void *iv, size_t iv_len);
115 TEE_Result utee_cipher_update(unsigned long state, const void *src,
116 			size_t src_len, void *dest, uint64_t *dest_len);
117 TEE_Result utee_cipher_final(unsigned long state, const void *src,
118 			size_t src_len, void *dest, uint64_t *dest_len);
119 
120 /* Generic Object Functions */
121 TEE_Result utee_cryp_obj_get_info(unsigned long obj, TEE_ObjectInfo *info);
122 TEE_Result utee_cryp_obj_restrict_usage(unsigned long obj, unsigned long usage);
123 TEE_Result utee_cryp_obj_get_attr(unsigned long obj, unsigned long attr_id,
124 			void *buffer, uint64_t *size);
125 
126 /* Transient Object Functions */
127 /* type has type TEE_ObjectType */
128 TEE_Result utee_cryp_obj_alloc(unsigned long type, unsigned long max_size,
129 			uint32_t *obj);
130 TEE_Result utee_cryp_obj_close(unsigned long obj);
131 TEE_Result utee_cryp_obj_reset(unsigned long obj);
132 TEE_Result utee_cryp_obj_populate(unsigned long obj,
133 			struct utee_attribute *attrs, unsigned long attr_count);
134 TEE_Result utee_cryp_obj_copy(unsigned long dst_obj, unsigned long src_obj);
135 
136 TEE_Result utee_cryp_obj_generate_key(unsigned long obj, unsigned long key_size,
137 			const struct utee_attribute *params,
138 			unsigned long param_count);
139 
140 TEE_Result utee_cryp_derive_key(unsigned long state,
141 			const struct utee_attribute *params,
142 			unsigned long param_count, unsigned long derived_key);
143 
144 TEE_Result utee_cryp_random_number_generate(void *buf, size_t blen);
145 
146 TEE_Result utee_authenc_init(unsigned long state, const void *nonce,
147 			size_t nonce_len, size_t tag_len, size_t aad_len,
148 			size_t payload_len);
149 TEE_Result utee_authenc_update_aad(unsigned long state, const void *aad_data,
150 			size_t aad_data_len);
151 TEE_Result utee_authenc_update_payload(unsigned long state,
152 			const void *src_data, size_t src_len, void *dest_data,
153 			uint64_t *dest_len);
154 TEE_Result utee_authenc_enc_final(unsigned long state, const void *src_data,
155 			size_t src_len, void *dest_data, uint64_t *dest_len,
156 			void *tag, uint64_t *tag_len);
157 TEE_Result utee_authenc_dec_final(unsigned long state, const void *src_data,
158 			size_t src_len, void *dest_data, uint64_t *dest_len,
159 			const void *tag, size_t tag_len);
160 
161 TEE_Result utee_asymm_operate(unsigned long state,
162 			const struct utee_attribute *params,
163 			unsigned long num_params, const void *src_data,
164 			size_t src_len, void *dest_data, uint64_t *dest_len);
165 
166 TEE_Result utee_asymm_verify(unsigned long state,
167 			const struct utee_attribute *params,
168 			unsigned long num_params, const void *data,
169 			size_t data_len, const void *sig, size_t sig_len);
170 
171 /* Persistant Object Functions */
172 /* obj is of type TEE_ObjectHandle */
173 TEE_Result utee_storage_obj_open(unsigned long storage_id, void *object_id,
174 				 size_t object_id_len, unsigned long flags,
175 				 uint32_t *obj);
176 
177 /*
178  * attr is of type TEE_ObjectHandle
179  * obj is of type TEE_ObjectHandle
180  */
181 TEE_Result utee_storage_obj_create(unsigned long storage_id, void *object_id,
182 				size_t object_id_len, unsigned long flags,
183 				unsigned long attr, const void *data,
184 				size_t len, uint32_t *obj);
185 
186 /* obj is of type TEE_ObjectHandle */
187 TEE_Result utee_storage_obj_del(unsigned long obj);
188 
189 /* obj is of type TEE_ObjectHandle */
190 TEE_Result utee_storage_obj_rename(unsigned long obj, const void *new_obj_id,
191 				size_t new_obj_id_len);
192 
193 /* Persistent Object Enumeration Functions */
194 /* obj_enum is of type TEE_ObjectEnumHandle */
195 TEE_Result utee_storage_alloc_enum(uint32_t *obj_enum);
196 
197 
198 /* obj_enum is of type TEE_ObjectEnumHandle */
199 TEE_Result utee_storage_free_enum(unsigned long obj_enum);
200 
201 /* obj_enum is of type TEE_ObjectEnumHandle */
202 TEE_Result utee_storage_reset_enum(unsigned long obj_enum);
203 
204 /* obj_enum is of type TEE_ObjectEnumHandle */
205 TEE_Result utee_storage_start_enum(unsigned long obj_enum,
206 			unsigned long storage_id);
207 
208 /* obj_enum is of type TEE_ObjectEnumHandle */
209 TEE_Result utee_storage_next_enum(unsigned long obj_enum, TEE_ObjectInfo *info,
210 			void *obj_id, uint64_t *len);
211 
212 /* Data Stream Access Functions */
213 /* obj is of type TEE_ObjectHandle */
214 TEE_Result utee_storage_obj_read(unsigned long obj, void *data, size_t len,
215 			uint64_t *count);
216 
217 /* obj is of type TEE_ObjectHandle */
218 TEE_Result utee_storage_obj_write(unsigned long obj, const void *data,
219 			size_t len);
220 
221 /* obj is of type TEE_ObjectHandle */
222 TEE_Result utee_storage_obj_trunc(unsigned long obj, size_t len);
223 
224 /* obj is of type TEE_ObjectHandle */
225 /* whence is of type TEE_Whence */
226 TEE_Result utee_storage_obj_seek(unsigned long obj, long offset,
227 				 unsigned long whence);
228 
229 /* seServiceHandle is of type TEE_SEServiceHandle */
230 TEE_Result utee_se_service_open(uint32_t *seServiceHandle);
231 
232 /* seServiceHandle is of type TEE_SEServiceHandle */
233 TEE_Result utee_se_service_close(unsigned long seServiceHandle);
234 
235 /*
236  * seServiceHandle is of type TEE_SEServiceHandle
237  * r is of type TEE_SEReaderHandle
238  */
239 TEE_Result utee_se_service_get_readers(unsigned long seServiceHandle,
240 			uint32_t *r, uint64_t *len);
241 
242 /*
243  * r is of type TEE_SEReaderHandle
244  * p is defined with defines UTEE_SE_READER_*
245  */
246 TEE_Result utee_se_reader_get_prop(unsigned long r, uint32_t *p);
247 
248 /* r is of type TEE_SEReaderHandle */
249 TEE_Result utee_se_reader_get_name(unsigned long r,
250 			char *name, uint64_t *name_len);
251 
252 /*
253  * r is of type TEE_SEReaderHandle
254  * s if of type TEE_SESessionHandle
255  */
256 TEE_Result utee_se_reader_open_session(unsigned long r, uint32_t *s);
257 
258 /* r is of type TEE_SEReaderHandle */
259 TEE_Result utee_se_reader_close_sessions(unsigned long r);
260 
261 /* s is of type TEE_SESessionHandle */
262 TEE_Result utee_se_session_is_closed(unsigned long s);
263 
264 /* s is of type TEE_SESessionHandle */
265 TEE_Result utee_se_session_get_atr(unsigned long s, void *atr,
266 			uint64_t *atr_len);
267 
268 /*
269  * s is of type TEE_SESessionHandle
270  * c is of type TEE_SEChannelHandle
271  */
272 TEE_Result utee_se_session_open_channel(unsigned long s,
273 			unsigned long is_logical, const void *aid_buffer,
274 			size_t aid_buffer_len, uint32_t *c);
275 
276 /* s is of type TEE_SESessionHandle */
277 TEE_Result utee_se_session_close(unsigned long s);
278 
279 /* c is of type TEE_SEChannelHandle */
280 TEE_Result utee_se_channel_select_next(unsigned long c);
281 
282 /* c is of type TEE_SEChannelHandle */
283 TEE_Result utee_se_channel_get_select_resp(unsigned long c, void *resp,
284 			uint64_t *resp_len);
285 
286 /* c is of type TEE_SEChannelHandle */
287 TEE_Result utee_se_channel_transmit(unsigned long c, void *cmd,
288 			size_t cmd_len, void *resp, uint64_t *resp_len);
289 
290 /* c is of type TEE_SEChannelHandle */
291 TEE_Result utee_se_channel_close(unsigned long c);
292 
293 /* op is of type enum utee_cache_operation */
294 TEE_Result utee_cache_operation(void *va, size_t l, unsigned long op);
295 
296 #endif /* UTEE_SYSCALLS_H */
297