xref: /optee_os/ta/pkcs11/src/entry.c (revision 6ea5aa6cf4571812f0a0237349993ffee86f7ff2)
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 = &params[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 = &params[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 = &params[2];
108*6ea5aa6cSEtienne Carriere 		break;
109*6ea5aa6cSEtienne Carriere 	case TEE_PARAM_TYPE_MEMREF_OUTPUT:
110*6ea5aa6cSEtienne Carriere 		p2_out = &params[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