1f8a3a2c4SEtienne Carriere // SPDX-License-Identifier: BSD-2-Clause 2f8a3a2c4SEtienne Carriere /* 3f8a3a2c4SEtienne Carriere * Copyright (c) 2018-2020, Linaro Limited 4f8a3a2c4SEtienne Carriere */ 5f8a3a2c4SEtienne Carriere 6f8a3a2c4SEtienne Carriere #include <compiler.h> 76ea5aa6cSEtienne Carriere #include <pkcs11_ta.h> 8f8a3a2c4SEtienne Carriere #include <tee_internal_api.h> 960290f69SEtienne Carriere #include <tee_internal_api_extensions.h> 10*d34f3266SEtienne Carriere #include <util.h> 1160290f69SEtienne Carriere 1260290f69SEtienne Carriere #include "pkcs11_helpers.h" 13f8a3a2c4SEtienne Carriere 14f8a3a2c4SEtienne Carriere TEE_Result TA_CreateEntryPoint(void) 15f8a3a2c4SEtienne Carriere { 16f8a3a2c4SEtienne Carriere return TEE_SUCCESS; 17f8a3a2c4SEtienne Carriere } 18f8a3a2c4SEtienne Carriere 19f8a3a2c4SEtienne Carriere void TA_DestroyEntryPoint(void) 20f8a3a2c4SEtienne Carriere { 21f8a3a2c4SEtienne Carriere } 22f8a3a2c4SEtienne Carriere 23f8a3a2c4SEtienne Carriere TEE_Result TA_OpenSessionEntryPoint(uint32_t __unused param_types, 24f8a3a2c4SEtienne Carriere TEE_Param __unused params[4], 25f8a3a2c4SEtienne Carriere void **session) 26f8a3a2c4SEtienne Carriere { 27f8a3a2c4SEtienne Carriere *session = NULL; 28f8a3a2c4SEtienne Carriere 29f8a3a2c4SEtienne Carriere return TEE_SUCCESS; 30f8a3a2c4SEtienne Carriere } 31f8a3a2c4SEtienne Carriere 32f8a3a2c4SEtienne Carriere void TA_CloseSessionEntryPoint(void *session __unused) 33f8a3a2c4SEtienne Carriere { 34f8a3a2c4SEtienne Carriere } 35f8a3a2c4SEtienne Carriere 36f8a3a2c4SEtienne Carriere /* 376ea5aa6cSEtienne Carriere * Entry point for invocation command PKCS11_CMD_PING 386ea5aa6cSEtienne Carriere * 396ea5aa6cSEtienne Carriere * @ctrl - param memref[0] or NULL: expected NULL 406ea5aa6cSEtienne Carriere * @in - param memref[1] or NULL: expected NULL 416ea5aa6cSEtienne Carriere * @out - param memref[2] or NULL 426ea5aa6cSEtienne Carriere * 43*d34f3266SEtienne Carriere * Return a PKCS11_CKR_* value 446ea5aa6cSEtienne Carriere */ 456ea5aa6cSEtienne Carriere static TEE_Result entry_ping(TEE_Param *ctrl, TEE_Param *in, TEE_Param *out) 466ea5aa6cSEtienne Carriere { 476ea5aa6cSEtienne Carriere const uint32_t ver[] = { 486ea5aa6cSEtienne Carriere PKCS11_TA_VERSION_MAJOR, 496ea5aa6cSEtienne Carriere PKCS11_TA_VERSION_MINOR, 506ea5aa6cSEtienne Carriere PKCS11_TA_VERSION_PATCH, 516ea5aa6cSEtienne Carriere }; 526ea5aa6cSEtienne Carriere size_t size = 0; 536ea5aa6cSEtienne Carriere 546ea5aa6cSEtienne Carriere if (ctrl || in) 556ea5aa6cSEtienne Carriere return TEE_ERROR_BAD_PARAMETERS; 566ea5aa6cSEtienne Carriere 576ea5aa6cSEtienne Carriere if (!out) 586ea5aa6cSEtienne Carriere return TEE_SUCCESS; 596ea5aa6cSEtienne Carriere 606ea5aa6cSEtienne Carriere size = out->memref.size; 616ea5aa6cSEtienne Carriere out->memref.size = sizeof(ver); 626ea5aa6cSEtienne Carriere 636ea5aa6cSEtienne Carriere if (size < sizeof(ver)) 646ea5aa6cSEtienne Carriere return TEE_ERROR_SHORT_BUFFER; 656ea5aa6cSEtienne Carriere 666ea5aa6cSEtienne Carriere TEE_MemMove(out->memref.buffer, ver, sizeof(ver)); 676ea5aa6cSEtienne Carriere 68*d34f3266SEtienne Carriere return PKCS11_CKR_OK; 696ea5aa6cSEtienne Carriere } 706ea5aa6cSEtienne Carriere 716ea5aa6cSEtienne Carriere /* 72f8a3a2c4SEtienne Carriere * Entry point for PKCS11 TA commands 73f8a3a2c4SEtienne Carriere */ 74f8a3a2c4SEtienne Carriere TEE_Result TA_InvokeCommandEntryPoint(void *tee_session __unused, uint32_t cmd, 756ea5aa6cSEtienne Carriere uint32_t ptypes, 766ea5aa6cSEtienne Carriere TEE_Param params[TEE_NUM_PARAMS]) 77f8a3a2c4SEtienne Carriere { 786ea5aa6cSEtienne Carriere TEE_Param *ctrl = NULL; 796ea5aa6cSEtienne Carriere TEE_Param *p1_in = NULL; 806ea5aa6cSEtienne Carriere TEE_Param __maybe_unused *p2_in = NULL; 816ea5aa6cSEtienne Carriere TEE_Param *p2_out = NULL; 826ea5aa6cSEtienne Carriere TEE_Result res = TEE_ERROR_GENERIC; 83*d34f3266SEtienne Carriere uint32_t rc = 0; 84f8a3a2c4SEtienne Carriere 856ea5aa6cSEtienne Carriere /* Param#0: none or in-out buffer with serialized arguments */ 866ea5aa6cSEtienne Carriere switch (TEE_PARAM_TYPE_GET(ptypes, 0)) { 876ea5aa6cSEtienne Carriere case TEE_PARAM_TYPE_NONE: 886ea5aa6cSEtienne Carriere break; 896ea5aa6cSEtienne Carriere case TEE_PARAM_TYPE_MEMREF_INOUT: 906ea5aa6cSEtienne Carriere ctrl = ¶ms[0]; 916ea5aa6cSEtienne Carriere break; 926ea5aa6cSEtienne Carriere default: 936ea5aa6cSEtienne Carriere return TEE_ERROR_BAD_PARAMETERS; 946ea5aa6cSEtienne Carriere } 956ea5aa6cSEtienne Carriere 966ea5aa6cSEtienne Carriere /* Param#1: none or input data buffer */ 976ea5aa6cSEtienne Carriere switch (TEE_PARAM_TYPE_GET(ptypes, 1)) { 986ea5aa6cSEtienne Carriere case TEE_PARAM_TYPE_NONE: 996ea5aa6cSEtienne Carriere break; 1006ea5aa6cSEtienne Carriere case TEE_PARAM_TYPE_MEMREF_INPUT: 1016ea5aa6cSEtienne Carriere p1_in = ¶ms[1]; 1026ea5aa6cSEtienne Carriere break; 1036ea5aa6cSEtienne Carriere default: 1046ea5aa6cSEtienne Carriere return TEE_ERROR_BAD_PARAMETERS; 1056ea5aa6cSEtienne Carriere } 1066ea5aa6cSEtienne Carriere 1076ea5aa6cSEtienne Carriere /* Param#2: none or input data buffer */ 1086ea5aa6cSEtienne Carriere switch (TEE_PARAM_TYPE_GET(ptypes, 2)) { 1096ea5aa6cSEtienne Carriere case TEE_PARAM_TYPE_NONE: 1106ea5aa6cSEtienne Carriere break; 1116ea5aa6cSEtienne Carriere case TEE_PARAM_TYPE_MEMREF_INPUT: 1126ea5aa6cSEtienne Carriere p2_in = ¶ms[2]; 1136ea5aa6cSEtienne Carriere break; 1146ea5aa6cSEtienne Carriere case TEE_PARAM_TYPE_MEMREF_OUTPUT: 1156ea5aa6cSEtienne Carriere p2_out = ¶ms[2]; 1166ea5aa6cSEtienne Carriere break; 1176ea5aa6cSEtienne Carriere default: 1186ea5aa6cSEtienne Carriere return TEE_ERROR_BAD_PARAMETERS; 1196ea5aa6cSEtienne Carriere } 1206ea5aa6cSEtienne Carriere 1216ea5aa6cSEtienne Carriere /* Param#3: currently unused */ 1226ea5aa6cSEtienne Carriere switch (TEE_PARAM_TYPE_GET(ptypes, 3)) { 1236ea5aa6cSEtienne Carriere case TEE_PARAM_TYPE_NONE: 1246ea5aa6cSEtienne Carriere break; 1256ea5aa6cSEtienne Carriere default: 1266ea5aa6cSEtienne Carriere return TEE_ERROR_BAD_PARAMETERS; 1276ea5aa6cSEtienne Carriere } 1286ea5aa6cSEtienne Carriere 12960290f69SEtienne Carriere DMSG("%s ctrl %"PRIu32"@%p, %s %"PRIu32"@%p, %s %"PRIu32"@%p", 13060290f69SEtienne Carriere id2str_ta_cmd(cmd), 13160290f69SEtienne Carriere ctrl ? ctrl->memref.size : 0, ctrl ? ctrl->memref.buffer : 0, 13260290f69SEtienne Carriere p1_in ? "in" : "---", p1_in ? p1_in->memref.size : 0, 13360290f69SEtienne Carriere p1_in ? p1_in->memref.buffer : NULL, 13460290f69SEtienne Carriere p2_out ? "out" : (p2_in ? "in" : "---"), 13560290f69SEtienne Carriere p2_out ? p2_out->memref.size : (p2_in ? p2_in->memref.size : 0), 13660290f69SEtienne Carriere p2_out ? p2_out->memref.buffer : 13760290f69SEtienne Carriere (p2_in ? p2_in->memref.buffer : NULL)); 13860290f69SEtienne Carriere 1396ea5aa6cSEtienne Carriere switch (cmd) { 1406ea5aa6cSEtienne Carriere case PKCS11_CMD_PING: 141*d34f3266SEtienne Carriere rc = entry_ping(ctrl, p1_in, p2_out); 1426ea5aa6cSEtienne Carriere break; 1436ea5aa6cSEtienne Carriere 1446ea5aa6cSEtienne Carriere default: 1456ea5aa6cSEtienne Carriere EMSG("Command 0x%"PRIx32" is not supported", cmd); 146f8a3a2c4SEtienne Carriere return TEE_ERROR_NOT_SUPPORTED; 147f8a3a2c4SEtienne Carriere } 1486ea5aa6cSEtienne Carriere 1496ea5aa6cSEtienne Carriere /* Currently no output data stored in output param#0 */ 1506ea5aa6cSEtienne Carriere if (TEE_PARAM_TYPE_GET(ptypes, 0) == TEE_PARAM_TYPE_MEMREF_INOUT) 1516ea5aa6cSEtienne Carriere ctrl->memref.size = 0; 1526ea5aa6cSEtienne Carriere 153*d34f3266SEtienne Carriere res = pkcs2tee_error(rc); 154*d34f3266SEtienne Carriere 155*d34f3266SEtienne Carriere DMSG("%s rc 0x%08"PRIx32"/%s, TEE rc %"PRIx32, 156*d34f3266SEtienne Carriere id2str_ta_cmd(cmd), rc, id2str_rc(rc), res); 157*d34f3266SEtienne Carriere 1586ea5aa6cSEtienne Carriere return res; 1596ea5aa6cSEtienne Carriere } 160