1 // SPDX-License-Identifier: BSD-2-Clause 2 /* 3 * Copyright (C) Foundries Ltd. 2021 - All Rights Reserved 4 * Author: Jorge Ramirez <jorge@foundries.io> 5 */ 6 #include <crypto/crypto_se.h> 7 #include <kernel/pseudo_ta.h> 8 #include <pta_apdu.h> 9 10 #define PTA_NAME "pta.apdu" 11 12 static TEE_Result get_apdu_type(uint32_t val, enum crypto_apdu_type *type) 13 { 14 switch (val) { 15 case PTA_APDU_TXRX_CASE_NO_HINT: 16 *type = CRYPTO_APDU_CASE_NO_HINT; 17 break; 18 case PTA_APDU_TXRX_CASE_1: 19 *type = CRYPTO_APDU_CASE_1; 20 break; 21 case PTA_APDU_TXRX_CASE_2: 22 *type = CRYPTO_APDU_CASE_2; 23 break; 24 case PTA_APDU_TXRX_CASE_2E: 25 *type = CRYPTO_APDU_CASE_2E; 26 break; 27 case PTA_APDU_TXRX_CASE_3: 28 *type = CRYPTO_APDU_CASE_3; 29 break; 30 case PTA_APDU_TXRX_CASE_3E: 31 *type = CRYPTO_APDU_CASE_3E; 32 break; 33 case PTA_APDU_TXRX_CASE_4: 34 *type = CRYPTO_APDU_CASE_4; 35 break; 36 case PTA_APDU_TXRX_CASE_4E: 37 *type = CRYPTO_APDU_CASE_4E; 38 break; 39 default: 40 return TEE_ERROR_BAD_PARAMETERS; 41 } 42 return TEE_SUCCESS; 43 } 44 45 static TEE_Result invoke_command(void *session_context __unused, 46 uint32_t command_id, uint32_t pt, 47 TEE_Param params[TEE_NUM_PARAMS]) 48 { 49 const uint32_t exp_pt = TEE_PARAM_TYPES(TEE_PARAM_TYPE_VALUE_INPUT, 50 TEE_PARAM_TYPE_MEMREF_INPUT, 51 TEE_PARAM_TYPE_MEMREF_INPUT, 52 TEE_PARAM_TYPE_MEMREF_OUTPUT); 53 enum crypto_apdu_type type = CRYPTO_APDU_CASE_NO_HINT; 54 TEE_Result ret = TEE_ERROR_NOT_IMPLEMENTED; 55 size_t len = 0; 56 57 FMSG("command entry point for pseudo-TA \"%s\"", PTA_NAME); 58 59 if (pt != exp_pt) 60 return TEE_ERROR_BAD_PARAMETERS; 61 62 switch (command_id) { 63 case PTA_CMD_TXRX_APDU_RAW_FRAME: 64 ret = get_apdu_type(params[0].value.a, &type); 65 if (ret) 66 return ret; 67 68 len = params[3].memref.size; 69 ret = crypto_se_do_apdu(type, 70 params[1].memref.buffer, 71 params[1].memref.size, 72 params[2].memref.buffer, 73 params[2].memref.size, 74 params[3].memref.buffer, 75 &len); 76 if (!ret) 77 params[3].memref.size = len; 78 break; 79 default: 80 return TEE_ERROR_NOT_IMPLEMENTED; 81 } 82 83 return ret; 84 } 85 86 pseudo_ta_register(.uuid = PTA_APDU_UUID, .name = PTA_NAME, 87 .flags = PTA_DEFAULT_FLAGS, 88 .invoke_command_entry_point = invoke_command); 89