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