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> 9*60290f69SEtienne Carriere #include <tee_internal_api_extensions.h> 10*60290f69SEtienne Carriere 11*60290f69SEtienne Carriere #include "pkcs11_helpers.h" 12f8a3a2c4SEtienne Carriere 13f8a3a2c4SEtienne Carriere TEE_Result TA_CreateEntryPoint(void) 14f8a3a2c4SEtienne Carriere { 15f8a3a2c4SEtienne Carriere return TEE_SUCCESS; 16f8a3a2c4SEtienne Carriere } 17f8a3a2c4SEtienne Carriere 18f8a3a2c4SEtienne Carriere void TA_DestroyEntryPoint(void) 19f8a3a2c4SEtienne Carriere { 20f8a3a2c4SEtienne Carriere } 21f8a3a2c4SEtienne Carriere 22f8a3a2c4SEtienne Carriere TEE_Result TA_OpenSessionEntryPoint(uint32_t __unused param_types, 23f8a3a2c4SEtienne Carriere TEE_Param __unused params[4], 24f8a3a2c4SEtienne Carriere void **session) 25f8a3a2c4SEtienne Carriere { 26f8a3a2c4SEtienne Carriere *session = NULL; 27f8a3a2c4SEtienne Carriere 28f8a3a2c4SEtienne Carriere return TEE_SUCCESS; 29f8a3a2c4SEtienne Carriere } 30f8a3a2c4SEtienne Carriere 31f8a3a2c4SEtienne Carriere void TA_CloseSessionEntryPoint(void *session __unused) 32f8a3a2c4SEtienne Carriere { 33f8a3a2c4SEtienne Carriere } 34f8a3a2c4SEtienne Carriere 35f8a3a2c4SEtienne Carriere /* 366ea5aa6cSEtienne Carriere * Entry point for invocation command PKCS11_CMD_PING 376ea5aa6cSEtienne Carriere * 386ea5aa6cSEtienne Carriere * @ctrl - param memref[0] or NULL: expected NULL 396ea5aa6cSEtienne Carriere * @in - param memref[1] or NULL: expected NULL 406ea5aa6cSEtienne Carriere * @out - param memref[2] or NULL 416ea5aa6cSEtienne Carriere * 426ea5aa6cSEtienne Carriere * Return a TEE_Result value 436ea5aa6cSEtienne Carriere */ 446ea5aa6cSEtienne Carriere static TEE_Result entry_ping(TEE_Param *ctrl, TEE_Param *in, TEE_Param *out) 456ea5aa6cSEtienne Carriere { 466ea5aa6cSEtienne Carriere const uint32_t ver[] = { 476ea5aa6cSEtienne Carriere PKCS11_TA_VERSION_MAJOR, 486ea5aa6cSEtienne Carriere PKCS11_TA_VERSION_MINOR, 496ea5aa6cSEtienne Carriere PKCS11_TA_VERSION_PATCH, 506ea5aa6cSEtienne Carriere }; 516ea5aa6cSEtienne Carriere size_t size = 0; 526ea5aa6cSEtienne Carriere 536ea5aa6cSEtienne Carriere if (ctrl || in) 546ea5aa6cSEtienne Carriere return TEE_ERROR_BAD_PARAMETERS; 556ea5aa6cSEtienne Carriere 566ea5aa6cSEtienne Carriere if (!out) 576ea5aa6cSEtienne Carriere return TEE_SUCCESS; 586ea5aa6cSEtienne Carriere 596ea5aa6cSEtienne Carriere size = out->memref.size; 606ea5aa6cSEtienne Carriere out->memref.size = sizeof(ver); 616ea5aa6cSEtienne Carriere 626ea5aa6cSEtienne Carriere if (size < sizeof(ver)) 636ea5aa6cSEtienne Carriere return TEE_ERROR_SHORT_BUFFER; 646ea5aa6cSEtienne Carriere 656ea5aa6cSEtienne Carriere TEE_MemMove(out->memref.buffer, ver, sizeof(ver)); 666ea5aa6cSEtienne Carriere 676ea5aa6cSEtienne Carriere return TEE_SUCCESS; 686ea5aa6cSEtienne Carriere } 696ea5aa6cSEtienne Carriere 706ea5aa6cSEtienne Carriere /* 71f8a3a2c4SEtienne Carriere * Entry point for PKCS11 TA commands 72f8a3a2c4SEtienne Carriere */ 73f8a3a2c4SEtienne Carriere TEE_Result TA_InvokeCommandEntryPoint(void *tee_session __unused, uint32_t cmd, 746ea5aa6cSEtienne Carriere uint32_t ptypes, 756ea5aa6cSEtienne Carriere TEE_Param params[TEE_NUM_PARAMS]) 76f8a3a2c4SEtienne Carriere { 776ea5aa6cSEtienne Carriere TEE_Param *ctrl = NULL; 786ea5aa6cSEtienne Carriere TEE_Param *p1_in = NULL; 796ea5aa6cSEtienne Carriere TEE_Param __maybe_unused *p2_in = NULL; 806ea5aa6cSEtienne Carriere TEE_Param *p2_out = NULL; 816ea5aa6cSEtienne Carriere TEE_Result res = TEE_ERROR_GENERIC; 82f8a3a2c4SEtienne Carriere 836ea5aa6cSEtienne Carriere /* Param#0: none or in-out buffer with serialized arguments */ 846ea5aa6cSEtienne Carriere switch (TEE_PARAM_TYPE_GET(ptypes, 0)) { 856ea5aa6cSEtienne Carriere case TEE_PARAM_TYPE_NONE: 866ea5aa6cSEtienne Carriere break; 876ea5aa6cSEtienne Carriere case TEE_PARAM_TYPE_MEMREF_INOUT: 886ea5aa6cSEtienne Carriere ctrl = ¶ms[0]; 896ea5aa6cSEtienne Carriere break; 906ea5aa6cSEtienne Carriere default: 916ea5aa6cSEtienne Carriere return TEE_ERROR_BAD_PARAMETERS; 926ea5aa6cSEtienne Carriere } 936ea5aa6cSEtienne Carriere 946ea5aa6cSEtienne Carriere /* Param#1: none or input data buffer */ 956ea5aa6cSEtienne Carriere switch (TEE_PARAM_TYPE_GET(ptypes, 1)) { 966ea5aa6cSEtienne Carriere case TEE_PARAM_TYPE_NONE: 976ea5aa6cSEtienne Carriere break; 986ea5aa6cSEtienne Carriere case TEE_PARAM_TYPE_MEMREF_INPUT: 996ea5aa6cSEtienne Carriere p1_in = ¶ms[1]; 1006ea5aa6cSEtienne Carriere break; 1016ea5aa6cSEtienne Carriere default: 1026ea5aa6cSEtienne Carriere return TEE_ERROR_BAD_PARAMETERS; 1036ea5aa6cSEtienne Carriere } 1046ea5aa6cSEtienne Carriere 1056ea5aa6cSEtienne Carriere /* Param#2: none or input data buffer */ 1066ea5aa6cSEtienne Carriere switch (TEE_PARAM_TYPE_GET(ptypes, 2)) { 1076ea5aa6cSEtienne Carriere case TEE_PARAM_TYPE_NONE: 1086ea5aa6cSEtienne Carriere break; 1096ea5aa6cSEtienne Carriere case TEE_PARAM_TYPE_MEMREF_INPUT: 1106ea5aa6cSEtienne Carriere p2_in = ¶ms[2]; 1116ea5aa6cSEtienne Carriere break; 1126ea5aa6cSEtienne Carriere case TEE_PARAM_TYPE_MEMREF_OUTPUT: 1136ea5aa6cSEtienne Carriere p2_out = ¶ms[2]; 1146ea5aa6cSEtienne Carriere break; 1156ea5aa6cSEtienne Carriere default: 1166ea5aa6cSEtienne Carriere return TEE_ERROR_BAD_PARAMETERS; 1176ea5aa6cSEtienne Carriere } 1186ea5aa6cSEtienne Carriere 1196ea5aa6cSEtienne Carriere /* Param#3: currently unused */ 1206ea5aa6cSEtienne Carriere switch (TEE_PARAM_TYPE_GET(ptypes, 3)) { 1216ea5aa6cSEtienne Carriere case TEE_PARAM_TYPE_NONE: 1226ea5aa6cSEtienne Carriere break; 1236ea5aa6cSEtienne Carriere default: 1246ea5aa6cSEtienne Carriere return TEE_ERROR_BAD_PARAMETERS; 1256ea5aa6cSEtienne Carriere } 1266ea5aa6cSEtienne Carriere 127*60290f69SEtienne Carriere DMSG("%s ctrl %"PRIu32"@%p, %s %"PRIu32"@%p, %s %"PRIu32"@%p", 128*60290f69SEtienne Carriere id2str_ta_cmd(cmd), 129*60290f69SEtienne Carriere ctrl ? ctrl->memref.size : 0, ctrl ? ctrl->memref.buffer : 0, 130*60290f69SEtienne Carriere p1_in ? "in" : "---", p1_in ? p1_in->memref.size : 0, 131*60290f69SEtienne Carriere p1_in ? p1_in->memref.buffer : NULL, 132*60290f69SEtienne Carriere p2_out ? "out" : (p2_in ? "in" : "---"), 133*60290f69SEtienne Carriere p2_out ? p2_out->memref.size : (p2_in ? p2_in->memref.size : 0), 134*60290f69SEtienne Carriere p2_out ? p2_out->memref.buffer : 135*60290f69SEtienne Carriere (p2_in ? p2_in->memref.buffer : NULL)); 136*60290f69SEtienne Carriere 1376ea5aa6cSEtienne Carriere switch (cmd) { 1386ea5aa6cSEtienne Carriere case PKCS11_CMD_PING: 1396ea5aa6cSEtienne Carriere res = entry_ping(ctrl, p1_in, p2_out); 1406ea5aa6cSEtienne Carriere break; 1416ea5aa6cSEtienne Carriere 1426ea5aa6cSEtienne Carriere default: 1436ea5aa6cSEtienne Carriere EMSG("Command 0x%"PRIx32" is not supported", cmd); 144f8a3a2c4SEtienne Carriere return TEE_ERROR_NOT_SUPPORTED; 145f8a3a2c4SEtienne Carriere } 1466ea5aa6cSEtienne Carriere 1476ea5aa6cSEtienne Carriere /* Currently no output data stored in output param#0 */ 1486ea5aa6cSEtienne Carriere if (TEE_PARAM_TYPE_GET(ptypes, 0) == TEE_PARAM_TYPE_MEMREF_INOUT) 1496ea5aa6cSEtienne Carriere ctrl->memref.size = 0; 1506ea5aa6cSEtienne Carriere 1516ea5aa6cSEtienne Carriere return res; 1526ea5aa6cSEtienne Carriere } 153