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