xref: /optee_os/ta/pkcs11/src/pkcs11_helpers.c (revision d34f326650ce6bd37cceead87c677035faad26f5)
1f7d7fcd9SEtienne Carriere // SPDX-License-Identifier: BSD-2-Clause
2f7d7fcd9SEtienne Carriere /*
3f7d7fcd9SEtienne Carriere  * Copyright (c) 2018-2020, Linaro Limited
4f7d7fcd9SEtienne Carriere  */
5f7d7fcd9SEtienne Carriere 
6f7d7fcd9SEtienne Carriere #include <pkcs11_ta.h>
7f7d7fcd9SEtienne Carriere #include <string.h>
8f7d7fcd9SEtienne Carriere #include <tee_internal_api.h>
9f7d7fcd9SEtienne Carriere #include <util.h>
10f7d7fcd9SEtienne Carriere 
11f7d7fcd9SEtienne Carriere #include "pkcs11_helpers.h"
12f7d7fcd9SEtienne Carriere 
13f7d7fcd9SEtienne Carriere static const char __maybe_unused unknown[] = "<unknown-identifier>";
14f7d7fcd9SEtienne Carriere 
15f7d7fcd9SEtienne Carriere struct any_id {
16f7d7fcd9SEtienne Carriere 	uint32_t id;
17f7d7fcd9SEtienne Carriere #if CFG_TEE_TA_LOG_LEVEL > 0
18f7d7fcd9SEtienne Carriere 	const char *string;
19f7d7fcd9SEtienne Carriere #endif
20f7d7fcd9SEtienne Carriere };
21f7d7fcd9SEtienne Carriere 
22f7d7fcd9SEtienne Carriere /*
23f7d7fcd9SEtienne Carriere  * Macro PKCS11_ID() can be used to define cells in ID list arrays
24f7d7fcd9SEtienne Carriere  * or ID/string conversion arrays.
25f7d7fcd9SEtienne Carriere  */
26f7d7fcd9SEtienne Carriere #if CFG_TEE_TA_LOG_LEVEL > 0
27f7d7fcd9SEtienne Carriere #define PKCS11_ID(_id)		{ .id = _id, .string = #_id }
28f7d7fcd9SEtienne Carriere #else
29f7d7fcd9SEtienne Carriere #define PKCS11_ID(_id)		{ .id = _id }
30f7d7fcd9SEtienne Carriere #endif
31f7d7fcd9SEtienne Carriere 
32f7d7fcd9SEtienne Carriere #define ID2STR(id, table, prefix)	\
33f7d7fcd9SEtienne Carriere 	id2str(id, table, ARRAY_SIZE(table), prefix)
34f7d7fcd9SEtienne Carriere 
3560290f69SEtienne Carriere #if CFG_TEE_TA_LOG_LEVEL > 0
36f7d7fcd9SEtienne Carriere /* Convert a PKCS11 ID into its label string */
3760290f69SEtienne Carriere static const char *id2str(uint32_t id, const struct any_id *table,
38f7d7fcd9SEtienne Carriere 			  size_t count, const char *prefix)
39f7d7fcd9SEtienne Carriere {
40f7d7fcd9SEtienne Carriere 	size_t n = 0;
41f7d7fcd9SEtienne Carriere 	const char *str = NULL;
42f7d7fcd9SEtienne Carriere 
43f7d7fcd9SEtienne Carriere 	for (n = 0; n < count; n++) {
44f7d7fcd9SEtienne Carriere 		if (id != table[n].id)
45f7d7fcd9SEtienne Carriere 			continue;
46f7d7fcd9SEtienne Carriere 
47f7d7fcd9SEtienne Carriere 		str = table[n].string;
48f7d7fcd9SEtienne Carriere 
49f7d7fcd9SEtienne Carriere 		/* Skip prefix provided matches found */
50f7d7fcd9SEtienne Carriere 		if (prefix && !TEE_MemCompare(str, prefix, strlen(prefix)))
51f7d7fcd9SEtienne Carriere 			str += strlen(prefix);
52f7d7fcd9SEtienne Carriere 
53f7d7fcd9SEtienne Carriere 		return str;
54f7d7fcd9SEtienne Carriere 	}
55f7d7fcd9SEtienne Carriere 
56f7d7fcd9SEtienne Carriere 	return unknown;
57f7d7fcd9SEtienne Carriere }
5860290f69SEtienne Carriere #endif /* CFG_TEE_TA_LOG_LEVEL > 0 */
59f7d7fcd9SEtienne Carriere 
60f7d7fcd9SEtienne Carriere /*
61f7d7fcd9SEtienne Carriere  * TA command IDs: used only as ID/string conversion for debug trace support
62f7d7fcd9SEtienne Carriere  */
63f7d7fcd9SEtienne Carriere static const struct any_id __maybe_unused string_ta_cmd[] = {
64f7d7fcd9SEtienne Carriere 	PKCS11_ID(PKCS11_CMD_PING),
65f7d7fcd9SEtienne Carriere };
66f7d7fcd9SEtienne Carriere 
67*d34f3266SEtienne Carriere static const struct any_id __maybe_unused string_rc[] = {
68*d34f3266SEtienne Carriere 	PKCS11_ID(PKCS11_CKR_OK),
69*d34f3266SEtienne Carriere 	PKCS11_ID(PKCS11_CKR_GENERAL_ERROR),
70*d34f3266SEtienne Carriere 	PKCS11_ID(PKCS11_CKR_DEVICE_MEMORY),
71*d34f3266SEtienne Carriere 	PKCS11_ID(PKCS11_CKR_ARGUMENTS_BAD),
72*d34f3266SEtienne Carriere 	PKCS11_ID(PKCS11_CKR_BUFFER_TOO_SMALL),
73*d34f3266SEtienne Carriere 	PKCS11_ID(PKCS11_CKR_FUNCTION_FAILED),
74*d34f3266SEtienne Carriere 	PKCS11_ID(PKCS11_CKR_SIGNATURE_INVALID),
75*d34f3266SEtienne Carriere 	PKCS11_ID(PKCS11_CKR_ATTRIBUTE_TYPE_INVALID),
76*d34f3266SEtienne Carriere 	PKCS11_ID(PKCS11_CKR_ATTRIBUTE_VALUE_INVALID),
77*d34f3266SEtienne Carriere 	PKCS11_ID(PKCS11_CKR_OBJECT_HANDLE_INVALID),
78*d34f3266SEtienne Carriere 	PKCS11_ID(PKCS11_CKR_KEY_HANDLE_INVALID),
79*d34f3266SEtienne Carriere 	PKCS11_ID(PKCS11_CKR_MECHANISM_INVALID),
80*d34f3266SEtienne Carriere 	PKCS11_ID(PKCS11_CKR_SESSION_HANDLE_INVALID),
81*d34f3266SEtienne Carriere 	PKCS11_ID(PKCS11_CKR_SLOT_ID_INVALID),
82*d34f3266SEtienne Carriere 	PKCS11_ID(PKCS11_CKR_MECHANISM_PARAM_INVALID),
83*d34f3266SEtienne Carriere 	PKCS11_ID(PKCS11_CKR_TEMPLATE_INCONSISTENT),
84*d34f3266SEtienne Carriere 	PKCS11_ID(PKCS11_CKR_TEMPLATE_INCOMPLETE),
85*d34f3266SEtienne Carriere 	PKCS11_ID(PKCS11_CKR_PIN_INCORRECT),
86*d34f3266SEtienne Carriere 	PKCS11_ID(PKCS11_CKR_PIN_LOCKED),
87*d34f3266SEtienne Carriere 	PKCS11_ID(PKCS11_CKR_PIN_EXPIRED),
88*d34f3266SEtienne Carriere 	PKCS11_ID(PKCS11_CKR_PIN_INVALID),
89*d34f3266SEtienne Carriere 	PKCS11_ID(PKCS11_CKR_PIN_LEN_RANGE),
90*d34f3266SEtienne Carriere 	PKCS11_ID(PKCS11_CKR_SESSION_EXISTS),
91*d34f3266SEtienne Carriere 	PKCS11_ID(PKCS11_CKR_SESSION_READ_ONLY),
92*d34f3266SEtienne Carriere 	PKCS11_ID(PKCS11_CKR_SESSION_READ_WRITE_SO_EXISTS),
93*d34f3266SEtienne Carriere 	PKCS11_ID(PKCS11_CKR_OPERATION_ACTIVE),
94*d34f3266SEtienne Carriere 	PKCS11_ID(PKCS11_CKR_KEY_FUNCTION_NOT_PERMITTED),
95*d34f3266SEtienne Carriere 	PKCS11_ID(PKCS11_CKR_OPERATION_NOT_INITIALIZED),
96*d34f3266SEtienne Carriere 	PKCS11_ID(PKCS11_CKR_TOKEN_WRITE_PROTECTED),
97*d34f3266SEtienne Carriere 	PKCS11_ID(PKCS11_CKR_TOKEN_NOT_PRESENT),
98*d34f3266SEtienne Carriere 	PKCS11_ID(PKCS11_CKR_TOKEN_NOT_RECOGNIZED),
99*d34f3266SEtienne Carriere 	PKCS11_ID(PKCS11_CKR_ACTION_PROHIBITED),
100*d34f3266SEtienne Carriere 	PKCS11_ID(PKCS11_CKR_ATTRIBUTE_READ_ONLY),
101*d34f3266SEtienne Carriere 	PKCS11_ID(PKCS11_CKR_PIN_TOO_WEAK),
102*d34f3266SEtienne Carriere 	PKCS11_ID(PKCS11_CKR_CURVE_NOT_SUPPORTED),
103*d34f3266SEtienne Carriere 	PKCS11_ID(PKCS11_CKR_DOMAIN_PARAMS_INVALID),
104*d34f3266SEtienne Carriere 	PKCS11_ID(PKCS11_CKR_USER_ALREADY_LOGGED_IN),
105*d34f3266SEtienne Carriere 	PKCS11_ID(PKCS11_CKR_USER_ANOTHER_ALREADY_LOGGED_IN),
106*d34f3266SEtienne Carriere 	PKCS11_ID(PKCS11_CKR_USER_NOT_LOGGED_IN),
107*d34f3266SEtienne Carriere 	PKCS11_ID(PKCS11_CKR_USER_PIN_NOT_INITIALIZED),
108*d34f3266SEtienne Carriere 	PKCS11_ID(PKCS11_CKR_USER_TOO_MANY_TYPES),
109*d34f3266SEtienne Carriere 	PKCS11_ID(PKCS11_CKR_USER_TYPE_INVALID),
110*d34f3266SEtienne Carriere 	PKCS11_ID(PKCS11_CKR_SESSION_READ_ONLY_EXISTS),
111*d34f3266SEtienne Carriere 	PKCS11_ID(PKCS11_RV_NOT_FOUND),
112*d34f3266SEtienne Carriere 	PKCS11_ID(PKCS11_RV_NOT_IMPLEMENTED),
113*d34f3266SEtienne Carriere };
114*d34f3266SEtienne Carriere 
115f7d7fcd9SEtienne Carriere #if CFG_TEE_TA_LOG_LEVEL > 0
116*d34f3266SEtienne Carriere const char *id2str_rc(uint32_t id)
117*d34f3266SEtienne Carriere {
118*d34f3266SEtienne Carriere 	return ID2STR(id, string_rc, "PKCS11_CKR_");
119*d34f3266SEtienne Carriere }
120*d34f3266SEtienne Carriere 
121f7d7fcd9SEtienne Carriere const char *id2str_ta_cmd(uint32_t id)
122f7d7fcd9SEtienne Carriere {
123f7d7fcd9SEtienne Carriere 	return ID2STR(id, string_ta_cmd, NULL);
124f7d7fcd9SEtienne Carriere }
125f7d7fcd9SEtienne Carriere #endif /*CFG_TEE_TA_LOG_LEVEL*/
126