15843bb75SJerome Forissier // SPDX-License-Identifier: BSD-2-Clause 25843bb75SJerome Forissier /* 35843bb75SJerome Forissier * Copyright (c) 2018-2019, Linaro Limited 46cb02818SJelle Sels * Copyright (c) 2020, Arm Limited. 5e4ad5ccdSAleksandr Anisimov * Copyright (c) 2020, Open Mobile Platform LLC 65843bb75SJerome Forissier */ 75843bb75SJerome Forissier 85843bb75SJerome Forissier #include <assert.h> 95843bb75SJerome Forissier #include <crypto/crypto.h> 105843bb75SJerome Forissier #include <kernel/handle.h> 115843bb75SJerome Forissier #include <kernel/huk_subkey.h> 12cbe7e1b8SBalint Dobszay #include <kernel/ldelf_loader.h> 135843bb75SJerome Forissier #include <kernel/misc.h> 145843bb75SJerome Forissier #include <kernel/msg_param.h> 155843bb75SJerome Forissier #include <kernel/pseudo_ta.h> 16a8e39e9cSJens Wiklander #include <kernel/tpm.h> 176cb02818SJelle Sels #include <kernel/ts_store.h> 189c34c0c7SBalint Dobszay #include <kernel/user_mode_ctx.h> 195843bb75SJerome Forissier #include <ldelf.h> 205843bb75SJerome Forissier #include <mm/file.h> 215843bb75SJerome Forissier #include <mm/fobj.h> 2289c9728dSJens Wiklander #include <mm/vm.h> 235843bb75SJerome Forissier #include <pta_system.h> 24a8e39e9cSJens Wiklander #include <stdlib_ext.h> 25a8e39e9cSJens Wiklander #include <stdlib.h> 265843bb75SJerome Forissier #include <string.h> 275843bb75SJerome Forissier #include <tee_api_defines_extensions.h> 285843bb75SJerome Forissier #include <tee_api_defines.h> 29e4ad5ccdSAleksandr Anisimov #include <tee/tee_supp_plugin_rpc.h> 30e4ad5ccdSAleksandr Anisimov #include <tee/uuid.h> 315843bb75SJerome Forissier #include <util.h> 325843bb75SJerome Forissier 335843bb75SJerome Forissier static unsigned int system_pnum; 345843bb75SJerome Forissier 359c34c0c7SBalint Dobszay static TEE_Result system_rng_reseed(uint32_t param_types, 365843bb75SJerome Forissier TEE_Param params[TEE_NUM_PARAMS]) 375843bb75SJerome Forissier { 3800b3b9a2SJens Wiklander size_t entropy_sz = 0; 3900b3b9a2SJens Wiklander uint8_t *entropy_input = NULL; 405843bb75SJerome Forissier uint32_t exp_pt = TEE_PARAM_TYPES(TEE_PARAM_TYPE_MEMREF_INPUT, 415843bb75SJerome Forissier TEE_PARAM_TYPE_NONE, 425843bb75SJerome Forissier TEE_PARAM_TYPE_NONE, 435843bb75SJerome Forissier TEE_PARAM_TYPE_NONE); 445843bb75SJerome Forissier 455843bb75SJerome Forissier if (exp_pt != param_types) 465843bb75SJerome Forissier return TEE_ERROR_BAD_PARAMETERS; 475843bb75SJerome Forissier entropy_input = params[0].memref.buffer; 485843bb75SJerome Forissier entropy_sz = params[0].memref.size; 495843bb75SJerome Forissier 50c2020b9dSJens Wiklander if (!entropy_sz || !entropy_input) 515843bb75SJerome Forissier return TEE_ERROR_BAD_PARAMETERS; 525843bb75SJerome Forissier 535843bb75SJerome Forissier crypto_rng_add_event(CRYPTO_RNG_SRC_NONSECURE, &system_pnum, 545843bb75SJerome Forissier entropy_input, entropy_sz); 555843bb75SJerome Forissier return TEE_SUCCESS; 565843bb75SJerome Forissier } 575843bb75SJerome Forissier 589c34c0c7SBalint Dobszay static TEE_Result system_derive_ta_unique_key(struct user_mode_ctx *uctx, 595843bb75SJerome Forissier uint32_t param_types, 605843bb75SJerome Forissier TEE_Param params[TEE_NUM_PARAMS]) 615843bb75SJerome Forissier { 625843bb75SJerome Forissier size_t data_len = sizeof(TEE_UUID); 635843bb75SJerome Forissier TEE_Result res = TEE_ERROR_GENERIC; 645843bb75SJerome Forissier uint8_t *data = NULL; 655843bb75SJerome Forissier uint32_t access_flags = 0; 665843bb75SJerome Forissier uint32_t exp_pt = TEE_PARAM_TYPES(TEE_PARAM_TYPE_MEMREF_INPUT, 675843bb75SJerome Forissier TEE_PARAM_TYPE_MEMREF_OUTPUT, 685843bb75SJerome Forissier TEE_PARAM_TYPE_NONE, 695843bb75SJerome Forissier TEE_PARAM_TYPE_NONE); 705843bb75SJerome Forissier 715843bb75SJerome Forissier if (exp_pt != param_types) 725843bb75SJerome Forissier return TEE_ERROR_BAD_PARAMETERS; 735843bb75SJerome Forissier 745843bb75SJerome Forissier if (params[0].memref.size > TA_DERIVED_EXTRA_DATA_MAX_SIZE || 755843bb75SJerome Forissier params[1].memref.size < TA_DERIVED_KEY_MIN_SIZE || 765843bb75SJerome Forissier params[1].memref.size > TA_DERIVED_KEY_MAX_SIZE) 775843bb75SJerome Forissier return TEE_ERROR_BAD_PARAMETERS; 785843bb75SJerome Forissier 795843bb75SJerome Forissier /* 805843bb75SJerome Forissier * The derived key shall not end up in non-secure memory by 815843bb75SJerome Forissier * mistake. 825843bb75SJerome Forissier * 835843bb75SJerome Forissier * Note that we're allowing shared memory as long as it's 845843bb75SJerome Forissier * secure. This is needed because a TA always uses shared memory 855843bb75SJerome Forissier * when communicating with another TA. 865843bb75SJerome Forissier */ 875843bb75SJerome Forissier access_flags = TEE_MEMORY_ACCESS_WRITE | TEE_MEMORY_ACCESS_ANY_OWNER | 885843bb75SJerome Forissier TEE_MEMORY_ACCESS_SECURE; 899c34c0c7SBalint Dobszay res = vm_check_access_rights(uctx, access_flags, 905843bb75SJerome Forissier (uaddr_t)params[1].memref.buffer, 915843bb75SJerome Forissier params[1].memref.size); 925843bb75SJerome Forissier if (res != TEE_SUCCESS) 935843bb75SJerome Forissier return TEE_ERROR_SECURITY; 945843bb75SJerome Forissier 955843bb75SJerome Forissier /* Take extra data into account. */ 965843bb75SJerome Forissier if (ADD_OVERFLOW(data_len, params[0].memref.size, &data_len)) 975843bb75SJerome Forissier return TEE_ERROR_SECURITY; 985843bb75SJerome Forissier 995843bb75SJerome Forissier data = calloc(data_len, 1); 1005843bb75SJerome Forissier if (!data) 1015843bb75SJerome Forissier return TEE_ERROR_OUT_OF_MEMORY; 1025843bb75SJerome Forissier 1039c34c0c7SBalint Dobszay memcpy(data, &uctx->ts_ctx->uuid, sizeof(TEE_UUID)); 1045843bb75SJerome Forissier 1055843bb75SJerome Forissier /* Append the user provided data */ 1065843bb75SJerome Forissier memcpy(data + sizeof(TEE_UUID), params[0].memref.buffer, 1075843bb75SJerome Forissier params[0].memref.size); 1085843bb75SJerome Forissier 1095843bb75SJerome Forissier res = huk_subkey_derive(HUK_SUBKEY_UNIQUE_TA, data, data_len, 1105843bb75SJerome Forissier params[1].memref.buffer, 1115843bb75SJerome Forissier params[1].memref.size); 112a8e39e9cSJens Wiklander free_wipe(data); 1135843bb75SJerome Forissier 1145843bb75SJerome Forissier return res; 1155843bb75SJerome Forissier } 1165843bb75SJerome Forissier 1179c34c0c7SBalint Dobszay static TEE_Result system_map_zi(struct user_mode_ctx *uctx, 1189c34c0c7SBalint Dobszay uint32_t param_types, 1195843bb75SJerome Forissier TEE_Param params[TEE_NUM_PARAMS]) 1205843bb75SJerome Forissier { 1215843bb75SJerome Forissier uint32_t exp_pt = TEE_PARAM_TYPES(TEE_PARAM_TYPE_VALUE_INPUT, 1225843bb75SJerome Forissier TEE_PARAM_TYPE_VALUE_INOUT, 1235843bb75SJerome Forissier TEE_PARAM_TYPE_VALUE_INPUT, 1245843bb75SJerome Forissier TEE_PARAM_TYPE_NONE); 1255843bb75SJerome Forissier uint32_t prot = TEE_MATTR_URW | TEE_MATTR_PRW; 1265843bb75SJerome Forissier TEE_Result res = TEE_ERROR_GENERIC; 1275843bb75SJerome Forissier struct mobj *mobj = NULL; 1285843bb75SJerome Forissier uint32_t pad_begin = 0; 129b9651492SJens Wiklander uint32_t vm_flags = 0; 1305843bb75SJerome Forissier struct fobj *f = NULL; 1315843bb75SJerome Forissier uint32_t pad_end = 0; 1325843bb75SJerome Forissier size_t num_bytes = 0; 1335843bb75SJerome Forissier vaddr_t va = 0; 1345843bb75SJerome Forissier 1355843bb75SJerome Forissier if (exp_pt != param_types) 1365843bb75SJerome Forissier return TEE_ERROR_BAD_PARAMETERS; 1375843bb75SJerome Forissier if (params[0].value.b & ~PTA_SYSTEM_MAP_FLAG_SHAREABLE) 1385843bb75SJerome Forissier return TEE_ERROR_BAD_PARAMETERS; 1395843bb75SJerome Forissier 1405843bb75SJerome Forissier if (params[0].value.b & PTA_SYSTEM_MAP_FLAG_SHAREABLE) 1415843bb75SJerome Forissier vm_flags |= VM_FLAG_SHAREABLE; 1425843bb75SJerome Forissier 1435843bb75SJerome Forissier num_bytes = params[0].value.a; 1445843bb75SJerome Forissier va = reg_pair_to_64(params[1].value.a, params[1].value.b); 1455843bb75SJerome Forissier pad_begin = params[2].value.a; 1465843bb75SJerome Forissier pad_end = params[2].value.b; 1475843bb75SJerome Forissier 148787295dfSJens Wiklander f = fobj_ta_mem_alloc(ROUNDUP_DIV(num_bytes, SMALL_PAGE_SIZE)); 1495843bb75SJerome Forissier if (!f) 1505843bb75SJerome Forissier return TEE_ERROR_OUT_OF_MEMORY; 1515843bb75SJerome Forissier mobj = mobj_with_fobj_alloc(f, NULL); 1525843bb75SJerome Forissier fobj_put(f); 1535843bb75SJerome Forissier if (!mobj) 1545843bb75SJerome Forissier return TEE_ERROR_OUT_OF_MEMORY; 1559c34c0c7SBalint Dobszay res = vm_map_pad(uctx, &va, num_bytes, prot, vm_flags, 156918e36c6SSughosh Ganu mobj, 0, pad_begin, pad_end, 0); 157b9651492SJens Wiklander mobj_put(mobj); 158b9651492SJens Wiklander if (!res) 1595843bb75SJerome Forissier reg_pair_from_64(va, ¶ms[1].value.a, ¶ms[1].value.b); 1605843bb75SJerome Forissier 1615843bb75SJerome Forissier return res; 1625843bb75SJerome Forissier } 1635843bb75SJerome Forissier 1649c34c0c7SBalint Dobszay static TEE_Result system_unmap(struct user_mode_ctx *uctx, uint32_t param_types, 1655843bb75SJerome Forissier TEE_Param params[TEE_NUM_PARAMS]) 1665843bb75SJerome Forissier { 1675843bb75SJerome Forissier uint32_t exp_pt = TEE_PARAM_TYPES(TEE_PARAM_TYPE_VALUE_INPUT, 1685843bb75SJerome Forissier TEE_PARAM_TYPE_VALUE_INPUT, 1695843bb75SJerome Forissier TEE_PARAM_TYPE_NONE, 1705843bb75SJerome Forissier TEE_PARAM_TYPE_NONE); 17179f22013SJens Wiklander TEE_Result res = TEE_SUCCESS; 17279f22013SJens Wiklander uint32_t vm_flags = 0; 173095b07ceSJens Wiklander vaddr_t end_va = 0; 17479f22013SJens Wiklander vaddr_t va = 0; 17579f22013SJens Wiklander size_t sz = 0; 1765843bb75SJerome Forissier 1775843bb75SJerome Forissier if (exp_pt != param_types) 1785843bb75SJerome Forissier return TEE_ERROR_BAD_PARAMETERS; 1795843bb75SJerome Forissier 1805843bb75SJerome Forissier if (params[0].value.b) 1815843bb75SJerome Forissier return TEE_ERROR_BAD_PARAMETERS; 1825843bb75SJerome Forissier 18379f22013SJens Wiklander va = reg_pair_to_64(params[1].value.a, params[1].value.b); 18479f22013SJens Wiklander sz = ROUNDUP(params[0].value.a, SMALL_PAGE_SIZE); 18579f22013SJens Wiklander 186095b07ceSJens Wiklander /* 187095b07ceSJens Wiklander * The vm_get_flags() and vm_unmap() are supposed to detect or 188095b07ceSJens Wiklander * handle overflow directly or indirectly. However, this function 189095b07ceSJens Wiklander * an API function so an extra guard here is in order. If nothing 190095b07ceSJens Wiklander * else to make it easier to review the code. 191095b07ceSJens Wiklander */ 192095b07ceSJens Wiklander if (ADD_OVERFLOW(va, sz, &end_va)) 193095b07ceSJens Wiklander return TEE_ERROR_BAD_PARAMETERS; 194095b07ceSJens Wiklander 1959c34c0c7SBalint Dobszay res = vm_get_flags(uctx, va, sz, &vm_flags); 19679f22013SJens Wiklander if (res) 19779f22013SJens Wiklander return res; 19879f22013SJens Wiklander if (vm_flags & VM_FLAG_PERMANENT) 19979f22013SJens Wiklander return TEE_ERROR_ACCESS_DENIED; 20079f22013SJens Wiklander 2019c34c0c7SBalint Dobszay return vm_unmap(uctx, va, sz); 2025843bb75SJerome Forissier } 2035843bb75SJerome Forissier 2049c34c0c7SBalint Dobszay static TEE_Result system_dlopen(struct user_mode_ctx *uctx, 2059c34c0c7SBalint Dobszay uint32_t param_types, 2065843bb75SJerome Forissier TEE_Param params[TEE_NUM_PARAMS]) 2075843bb75SJerome Forissier { 2085843bb75SJerome Forissier uint32_t exp_pt = TEE_PARAM_TYPES(TEE_PARAM_TYPE_MEMREF_INPUT, 2095843bb75SJerome Forissier TEE_PARAM_TYPE_VALUE_INPUT, 2105843bb75SJerome Forissier TEE_PARAM_TYPE_NONE, 2115843bb75SJerome Forissier TEE_PARAM_TYPE_NONE); 2125843bb75SJerome Forissier TEE_Result res = TEE_ERROR_GENERIC; 21300b3b9a2SJens Wiklander struct ts_session *s = NULL; 2145843bb75SJerome Forissier TEE_UUID *uuid = NULL; 2155843bb75SJerome Forissier uint32_t flags = 0; 2165843bb75SJerome Forissier 2175843bb75SJerome Forissier if (exp_pt != param_types) 2185843bb75SJerome Forissier return TEE_ERROR_BAD_PARAMETERS; 2195843bb75SJerome Forissier 2205843bb75SJerome Forissier uuid = params[0].memref.buffer; 2215843bb75SJerome Forissier if (!uuid || params[0].memref.size != sizeof(*uuid)) 2225843bb75SJerome Forissier return TEE_ERROR_BAD_PARAMETERS; 2235843bb75SJerome Forissier 2245843bb75SJerome Forissier flags = params[1].value.a; 2255843bb75SJerome Forissier 22600b3b9a2SJens Wiklander s = ts_pop_current_session(); 227cbe7e1b8SBalint Dobszay res = ldelf_dlopen(uctx, uuid, flags); 22800b3b9a2SJens Wiklander ts_push_current_session(s); 2295843bb75SJerome Forissier 2305843bb75SJerome Forissier return res; 2315843bb75SJerome Forissier } 2325843bb75SJerome Forissier 2339c34c0c7SBalint Dobszay static TEE_Result system_dlsym(struct user_mode_ctx *uctx, uint32_t param_types, 2345843bb75SJerome Forissier TEE_Param params[TEE_NUM_PARAMS]) 2355843bb75SJerome Forissier { 2365843bb75SJerome Forissier uint32_t exp_pt = TEE_PARAM_TYPES(TEE_PARAM_TYPE_MEMREF_INPUT, 2375843bb75SJerome Forissier TEE_PARAM_TYPE_MEMREF_INPUT, 2385843bb75SJerome Forissier TEE_PARAM_TYPE_VALUE_OUTPUT, 2395843bb75SJerome Forissier TEE_PARAM_TYPE_NONE); 2405843bb75SJerome Forissier TEE_Result res = TEE_ERROR_GENERIC; 24100b3b9a2SJens Wiklander struct ts_session *s = NULL; 2425843bb75SJerome Forissier const char *sym = NULL; 2435843bb75SJerome Forissier TEE_UUID *uuid = NULL; 2445843bb75SJerome Forissier size_t maxlen = 0; 2455843bb75SJerome Forissier vaddr_t va = 0; 2465843bb75SJerome Forissier 2475843bb75SJerome Forissier if (exp_pt != param_types) 2485843bb75SJerome Forissier return TEE_ERROR_BAD_PARAMETERS; 2495843bb75SJerome Forissier 2505843bb75SJerome Forissier uuid = params[0].memref.buffer; 251*3dd5cda2SJens Wiklander if (!uuid || params[0].memref.size != sizeof(*uuid)) 2525843bb75SJerome Forissier return TEE_ERROR_BAD_PARAMETERS; 2535843bb75SJerome Forissier 2545843bb75SJerome Forissier sym = params[1].memref.buffer; 2555843bb75SJerome Forissier if (!sym) 2565843bb75SJerome Forissier return TEE_ERROR_BAD_PARAMETERS; 2575843bb75SJerome Forissier maxlen = params[1].memref.size; 2585843bb75SJerome Forissier 25900b3b9a2SJens Wiklander s = ts_pop_current_session(); 260cbe7e1b8SBalint Dobszay res = ldelf_dlsym(uctx, uuid, sym, maxlen, &va); 26100b3b9a2SJens Wiklander ts_push_current_session(s); 2625843bb75SJerome Forissier 2635843bb75SJerome Forissier if (!res) 2645843bb75SJerome Forissier reg_pair_from_64(va, ¶ms[2].value.a, ¶ms[2].value.b); 2655843bb75SJerome Forissier 2665843bb75SJerome Forissier return res; 2675843bb75SJerome Forissier } 2685843bb75SJerome Forissier 269dd333f03SJavier Almansa Sobrino static TEE_Result system_get_tpm_event_log(uint32_t param_types, 270dd333f03SJavier Almansa Sobrino TEE_Param params[TEE_NUM_PARAMS]) 271dd333f03SJavier Almansa Sobrino { 272dd333f03SJavier Almansa Sobrino uint32_t exp_pt = TEE_PARAM_TYPES(TEE_PARAM_TYPE_MEMREF_OUTPUT, 273dd333f03SJavier Almansa Sobrino TEE_PARAM_TYPE_NONE, 274dd333f03SJavier Almansa Sobrino TEE_PARAM_TYPE_NONE, 275dd333f03SJavier Almansa Sobrino TEE_PARAM_TYPE_NONE); 276dd333f03SJavier Almansa Sobrino size_t size = 0; 277dd333f03SJavier Almansa Sobrino TEE_Result res = TEE_SUCCESS; 278dd333f03SJavier Almansa Sobrino 279dd333f03SJavier Almansa Sobrino if (exp_pt != param_types) 280dd333f03SJavier Almansa Sobrino return TEE_ERROR_BAD_PARAMETERS; 281dd333f03SJavier Almansa Sobrino 282dd333f03SJavier Almansa Sobrino size = params[0].memref.size; 283dd333f03SJavier Almansa Sobrino res = tpm_get_event_log(params[0].memref.buffer, &size); 284dd333f03SJavier Almansa Sobrino params[0].memref.size = size; 285dd333f03SJavier Almansa Sobrino 286dd333f03SJavier Almansa Sobrino return res; 287dd333f03SJavier Almansa Sobrino } 288dd333f03SJavier Almansa Sobrino 289e4ad5ccdSAleksandr Anisimov static TEE_Result system_supp_plugin_invoke(uint32_t param_types, 290e4ad5ccdSAleksandr Anisimov TEE_Param params[TEE_NUM_PARAMS]) 291e4ad5ccdSAleksandr Anisimov { 292e4ad5ccdSAleksandr Anisimov uint32_t exp_pt = TEE_PARAM_TYPES(TEE_PARAM_TYPE_MEMREF_INPUT, 293e4ad5ccdSAleksandr Anisimov TEE_PARAM_TYPE_VALUE_INPUT, 294e4ad5ccdSAleksandr Anisimov TEE_PARAM_TYPE_MEMREF_INOUT, 295e4ad5ccdSAleksandr Anisimov TEE_PARAM_TYPE_VALUE_OUTPUT); 296e4ad5ccdSAleksandr Anisimov TEE_Result res = TEE_ERROR_GENERIC; 297e4ad5ccdSAleksandr Anisimov size_t outlen = 0; 298e4ad5ccdSAleksandr Anisimov 299e4ad5ccdSAleksandr Anisimov if (exp_pt != param_types) 300e4ad5ccdSAleksandr Anisimov return TEE_ERROR_BAD_PARAMETERS; 301e4ad5ccdSAleksandr Anisimov 302e4ad5ccdSAleksandr Anisimov res = tee_invoke_supp_plugin_rpc(params[0].memref.buffer, /* uuid */ 303e4ad5ccdSAleksandr Anisimov params[1].value.a, /* cmd */ 304e4ad5ccdSAleksandr Anisimov params[1].value.b, /* sub_cmd */ 305e4ad5ccdSAleksandr Anisimov params[2].memref.buffer, /* data */ 306e4ad5ccdSAleksandr Anisimov params[2].memref.size, /* in len */ 307e4ad5ccdSAleksandr Anisimov &outlen); 308e4ad5ccdSAleksandr Anisimov params[3].value.a = (uint32_t)outlen; 309e4ad5ccdSAleksandr Anisimov 310e4ad5ccdSAleksandr Anisimov return res; 311e4ad5ccdSAleksandr Anisimov } 312e4ad5ccdSAleksandr Anisimov 3135843bb75SJerome Forissier static TEE_Result open_session(uint32_t param_types __unused, 3145843bb75SJerome Forissier TEE_Param params[TEE_NUM_PARAMS] __unused, 315baa5161dSBalint Dobszay void **sess_ctx __unused) 3165843bb75SJerome Forissier { 31700b3b9a2SJens Wiklander struct ts_session *s = NULL; 3185843bb75SJerome Forissier 3195843bb75SJerome Forissier /* Check that we're called from a user TA */ 32000b3b9a2SJens Wiklander s = ts_get_calling_session(); 3215843bb75SJerome Forissier if (!s) 3225843bb75SJerome Forissier return TEE_ERROR_ACCESS_DENIED; 3235843bb75SJerome Forissier if (!is_user_ta_ctx(s->ctx)) 3245843bb75SJerome Forissier return TEE_ERROR_ACCESS_DENIED; 3255843bb75SJerome Forissier 3265843bb75SJerome Forissier return TEE_SUCCESS; 3275843bb75SJerome Forissier } 3285843bb75SJerome Forissier 329baa5161dSBalint Dobszay static TEE_Result invoke_command(void *sess_ctx __unused, uint32_t cmd_id, 3305843bb75SJerome Forissier uint32_t param_types, 3315843bb75SJerome Forissier TEE_Param params[TEE_NUM_PARAMS]) 3325843bb75SJerome Forissier { 33300b3b9a2SJens Wiklander struct ts_session *s = ts_get_calling_session(); 3349c34c0c7SBalint Dobszay struct user_mode_ctx *uctx = to_user_mode_ctx(s->ctx); 3355843bb75SJerome Forissier 3365843bb75SJerome Forissier switch (cmd_id) { 3375843bb75SJerome Forissier case PTA_SYSTEM_ADD_RNG_ENTROPY: 3389c34c0c7SBalint Dobszay return system_rng_reseed(param_types, params); 3395843bb75SJerome Forissier case PTA_SYSTEM_DERIVE_TA_UNIQUE_KEY: 3409c34c0c7SBalint Dobszay return system_derive_ta_unique_key(uctx, param_types, params); 3415843bb75SJerome Forissier case PTA_SYSTEM_MAP_ZI: 3429c34c0c7SBalint Dobszay return system_map_zi(uctx, param_types, params); 3435843bb75SJerome Forissier case PTA_SYSTEM_UNMAP: 3449c34c0c7SBalint Dobszay return system_unmap(uctx, param_types, params); 3455843bb75SJerome Forissier case PTA_SYSTEM_DLOPEN: 3469c34c0c7SBalint Dobszay return system_dlopen(uctx, param_types, params); 3475843bb75SJerome Forissier case PTA_SYSTEM_DLSYM: 3489c34c0c7SBalint Dobszay return system_dlsym(uctx, param_types, params); 349dd333f03SJavier Almansa Sobrino case PTA_SYSTEM_GET_TPM_EVENT_LOG: 350dd333f03SJavier Almansa Sobrino return system_get_tpm_event_log(param_types, params); 351e4ad5ccdSAleksandr Anisimov case PTA_SYSTEM_SUPP_PLUGIN_INVOKE: 352e4ad5ccdSAleksandr Anisimov return system_supp_plugin_invoke(param_types, params); 3535843bb75SJerome Forissier default: 3545843bb75SJerome Forissier break; 3555843bb75SJerome Forissier } 3565843bb75SJerome Forissier 3575843bb75SJerome Forissier return TEE_ERROR_NOT_IMPLEMENTED; 3585843bb75SJerome Forissier } 3595843bb75SJerome Forissier 3605843bb75SJerome Forissier pseudo_ta_register(.uuid = PTA_SYSTEM_UUID, .name = "system.pta", 3615843bb75SJerome Forissier .flags = PTA_DEFAULT_FLAGS | TA_FLAG_CONCURRENT, 3625843bb75SJerome Forissier .open_session_entry_point = open_session, 3635843bb75SJerome Forissier .invoke_command_entry_point = invoke_command); 364