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> 7*6ea5aa6cSEtienne Carriere #include <pkcs11_ta.h> 8f8a3a2c4SEtienne Carriere #include <tee_internal_api.h> 9f8a3a2c4SEtienne Carriere 10f8a3a2c4SEtienne Carriere TEE_Result TA_CreateEntryPoint(void) 11f8a3a2c4SEtienne Carriere { 12f8a3a2c4SEtienne Carriere return TEE_SUCCESS; 13f8a3a2c4SEtienne Carriere } 14f8a3a2c4SEtienne Carriere 15f8a3a2c4SEtienne Carriere void TA_DestroyEntryPoint(void) 16f8a3a2c4SEtienne Carriere { 17f8a3a2c4SEtienne Carriere } 18f8a3a2c4SEtienne Carriere 19f8a3a2c4SEtienne Carriere TEE_Result TA_OpenSessionEntryPoint(uint32_t __unused param_types, 20f8a3a2c4SEtienne Carriere TEE_Param __unused params[4], 21f8a3a2c4SEtienne Carriere void **session) 22f8a3a2c4SEtienne Carriere { 23f8a3a2c4SEtienne Carriere *session = NULL; 24f8a3a2c4SEtienne Carriere 25f8a3a2c4SEtienne Carriere return TEE_SUCCESS; 26f8a3a2c4SEtienne Carriere } 27f8a3a2c4SEtienne Carriere 28f8a3a2c4SEtienne Carriere void TA_CloseSessionEntryPoint(void *session __unused) 29f8a3a2c4SEtienne Carriere { 30f8a3a2c4SEtienne Carriere } 31f8a3a2c4SEtienne Carriere 32f8a3a2c4SEtienne Carriere /* 33*6ea5aa6cSEtienne Carriere * Entry point for invocation command PKCS11_CMD_PING 34*6ea5aa6cSEtienne Carriere * 35*6ea5aa6cSEtienne Carriere * @ctrl - param memref[0] or NULL: expected NULL 36*6ea5aa6cSEtienne Carriere * @in - param memref[1] or NULL: expected NULL 37*6ea5aa6cSEtienne Carriere * @out - param memref[2] or NULL 38*6ea5aa6cSEtienne Carriere * 39*6ea5aa6cSEtienne Carriere * Return a TEE_Result value 40*6ea5aa6cSEtienne Carriere */ 41*6ea5aa6cSEtienne Carriere static TEE_Result entry_ping(TEE_Param *ctrl, TEE_Param *in, TEE_Param *out) 42*6ea5aa6cSEtienne Carriere { 43*6ea5aa6cSEtienne Carriere const uint32_t ver[] = { 44*6ea5aa6cSEtienne Carriere PKCS11_TA_VERSION_MAJOR, 45*6ea5aa6cSEtienne Carriere PKCS11_TA_VERSION_MINOR, 46*6ea5aa6cSEtienne Carriere PKCS11_TA_VERSION_PATCH, 47*6ea5aa6cSEtienne Carriere }; 48*6ea5aa6cSEtienne Carriere size_t size = 0; 49*6ea5aa6cSEtienne Carriere 50*6ea5aa6cSEtienne Carriere if (ctrl || in) 51*6ea5aa6cSEtienne Carriere return TEE_ERROR_BAD_PARAMETERS; 52*6ea5aa6cSEtienne Carriere 53*6ea5aa6cSEtienne Carriere if (!out) 54*6ea5aa6cSEtienne Carriere return TEE_SUCCESS; 55*6ea5aa6cSEtienne Carriere 56*6ea5aa6cSEtienne Carriere size = out->memref.size; 57*6ea5aa6cSEtienne Carriere out->memref.size = sizeof(ver); 58*6ea5aa6cSEtienne Carriere 59*6ea5aa6cSEtienne Carriere if (size < sizeof(ver)) 60*6ea5aa6cSEtienne Carriere return TEE_ERROR_SHORT_BUFFER; 61*6ea5aa6cSEtienne Carriere 62*6ea5aa6cSEtienne Carriere TEE_MemMove(out->memref.buffer, ver, sizeof(ver)); 63*6ea5aa6cSEtienne Carriere 64*6ea5aa6cSEtienne Carriere return TEE_SUCCESS; 65*6ea5aa6cSEtienne Carriere } 66*6ea5aa6cSEtienne Carriere 67*6ea5aa6cSEtienne Carriere /* 68f8a3a2c4SEtienne Carriere * Entry point for PKCS11 TA commands 69f8a3a2c4SEtienne Carriere */ 70f8a3a2c4SEtienne Carriere TEE_Result TA_InvokeCommandEntryPoint(void *tee_session __unused, uint32_t cmd, 71*6ea5aa6cSEtienne Carriere uint32_t ptypes, 72*6ea5aa6cSEtienne Carriere TEE_Param params[TEE_NUM_PARAMS]) 73f8a3a2c4SEtienne Carriere { 74*6ea5aa6cSEtienne Carriere TEE_Param *ctrl = NULL; 75*6ea5aa6cSEtienne Carriere TEE_Param *p1_in = NULL; 76*6ea5aa6cSEtienne Carriere TEE_Param __maybe_unused *p2_in = NULL; 77*6ea5aa6cSEtienne Carriere TEE_Param *p2_out = NULL; 78*6ea5aa6cSEtienne Carriere TEE_Result res = TEE_ERROR_GENERIC; 79f8a3a2c4SEtienne Carriere 80*6ea5aa6cSEtienne Carriere /* Param#0: none or in-out buffer with serialized arguments */ 81*6ea5aa6cSEtienne Carriere switch (TEE_PARAM_TYPE_GET(ptypes, 0)) { 82*6ea5aa6cSEtienne Carriere case TEE_PARAM_TYPE_NONE: 83*6ea5aa6cSEtienne Carriere break; 84*6ea5aa6cSEtienne Carriere case TEE_PARAM_TYPE_MEMREF_INOUT: 85*6ea5aa6cSEtienne Carriere ctrl = ¶ms[0]; 86*6ea5aa6cSEtienne Carriere break; 87*6ea5aa6cSEtienne Carriere default: 88*6ea5aa6cSEtienne Carriere return TEE_ERROR_BAD_PARAMETERS; 89*6ea5aa6cSEtienne Carriere } 90*6ea5aa6cSEtienne Carriere 91*6ea5aa6cSEtienne Carriere /* Param#1: none or input data buffer */ 92*6ea5aa6cSEtienne Carriere switch (TEE_PARAM_TYPE_GET(ptypes, 1)) { 93*6ea5aa6cSEtienne Carriere case TEE_PARAM_TYPE_NONE: 94*6ea5aa6cSEtienne Carriere break; 95*6ea5aa6cSEtienne Carriere case TEE_PARAM_TYPE_MEMREF_INPUT: 96*6ea5aa6cSEtienne Carriere p1_in = ¶ms[1]; 97*6ea5aa6cSEtienne Carriere break; 98*6ea5aa6cSEtienne Carriere default: 99*6ea5aa6cSEtienne Carriere return TEE_ERROR_BAD_PARAMETERS; 100*6ea5aa6cSEtienne Carriere } 101*6ea5aa6cSEtienne Carriere 102*6ea5aa6cSEtienne Carriere /* Param#2: none or input data buffer */ 103*6ea5aa6cSEtienne Carriere switch (TEE_PARAM_TYPE_GET(ptypes, 2)) { 104*6ea5aa6cSEtienne Carriere case TEE_PARAM_TYPE_NONE: 105*6ea5aa6cSEtienne Carriere break; 106*6ea5aa6cSEtienne Carriere case TEE_PARAM_TYPE_MEMREF_INPUT: 107*6ea5aa6cSEtienne Carriere p2_in = ¶ms[2]; 108*6ea5aa6cSEtienne Carriere break; 109*6ea5aa6cSEtienne Carriere case TEE_PARAM_TYPE_MEMREF_OUTPUT: 110*6ea5aa6cSEtienne Carriere p2_out = ¶ms[2]; 111*6ea5aa6cSEtienne Carriere break; 112*6ea5aa6cSEtienne Carriere default: 113*6ea5aa6cSEtienne Carriere return TEE_ERROR_BAD_PARAMETERS; 114*6ea5aa6cSEtienne Carriere } 115*6ea5aa6cSEtienne Carriere 116*6ea5aa6cSEtienne Carriere /* Param#3: currently unused */ 117*6ea5aa6cSEtienne Carriere switch (TEE_PARAM_TYPE_GET(ptypes, 3)) { 118*6ea5aa6cSEtienne Carriere case TEE_PARAM_TYPE_NONE: 119*6ea5aa6cSEtienne Carriere break; 120*6ea5aa6cSEtienne Carriere default: 121*6ea5aa6cSEtienne Carriere return TEE_ERROR_BAD_PARAMETERS; 122*6ea5aa6cSEtienne Carriere } 123*6ea5aa6cSEtienne Carriere 124*6ea5aa6cSEtienne Carriere switch (cmd) { 125*6ea5aa6cSEtienne Carriere case PKCS11_CMD_PING: 126*6ea5aa6cSEtienne Carriere res = entry_ping(ctrl, p1_in, p2_out); 127*6ea5aa6cSEtienne Carriere break; 128*6ea5aa6cSEtienne Carriere 129*6ea5aa6cSEtienne Carriere default: 130*6ea5aa6cSEtienne Carriere EMSG("Command 0x%"PRIx32" is not supported", cmd); 131f8a3a2c4SEtienne Carriere return TEE_ERROR_NOT_SUPPORTED; 132f8a3a2c4SEtienne Carriere } 133*6ea5aa6cSEtienne Carriere 134*6ea5aa6cSEtienne Carriere /* Currently no output data stored in output param#0 */ 135*6ea5aa6cSEtienne Carriere if (TEE_PARAM_TYPE_GET(ptypes, 0) == TEE_PARAM_TYPE_MEMREF_INOUT) 136*6ea5aa6cSEtienne Carriere ctrl->memref.size = 0; 137*6ea5aa6cSEtienne Carriere 138*6ea5aa6cSEtienne Carriere return res; 139*6ea5aa6cSEtienne Carriere } 140