xref: /optee_os/ta/pkcs11/src/pkcs11_helpers.c (revision 60290f69503c1371e896f3ee944b67d952142c17)
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 
35*60290f69SEtienne Carriere #if CFG_TEE_TA_LOG_LEVEL > 0
36f7d7fcd9SEtienne Carriere /* Convert a PKCS11 ID into its label string */
37*60290f69SEtienne 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 }
58*60290f69SEtienne 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 
67f7d7fcd9SEtienne Carriere #if CFG_TEE_TA_LOG_LEVEL > 0
68f7d7fcd9SEtienne Carriere const char *id2str_ta_cmd(uint32_t id)
69f7d7fcd9SEtienne Carriere {
70f7d7fcd9SEtienne Carriere 	return ID2STR(id, string_ta_cmd, NULL);
71f7d7fcd9SEtienne Carriere }
72f7d7fcd9SEtienne Carriere #endif /*CFG_TEE_TA_LOG_LEVEL*/
73