xref: /optee_os/ta/pkcs11/src/entry.c (revision d34f326650ce6bd37cceead87c677035faad26f5)
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 = &params[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 = &params[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 = &params[2];
1136ea5aa6cSEtienne Carriere 		break;
1146ea5aa6cSEtienne Carriere 	case TEE_PARAM_TYPE_MEMREF_OUTPUT:
1156ea5aa6cSEtienne Carriere 		p2_out = &params[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