xref: /optee_os/ta/pkcs11/src/pkcs11_helpers.c (revision f7d7fcd96a435ca48111c94e84857874ce12f89a)
1*f7d7fcd9SEtienne Carriere // SPDX-License-Identifier: BSD-2-Clause
2*f7d7fcd9SEtienne Carriere /*
3*f7d7fcd9SEtienne Carriere  * Copyright (c) 2018-2020, Linaro Limited
4*f7d7fcd9SEtienne Carriere  */
5*f7d7fcd9SEtienne Carriere 
6*f7d7fcd9SEtienne Carriere #include <pkcs11_ta.h>
7*f7d7fcd9SEtienne Carriere #include <string.h>
8*f7d7fcd9SEtienne Carriere #include <tee_internal_api.h>
9*f7d7fcd9SEtienne Carriere #include <util.h>
10*f7d7fcd9SEtienne Carriere 
11*f7d7fcd9SEtienne Carriere #include "pkcs11_helpers.h"
12*f7d7fcd9SEtienne Carriere 
13*f7d7fcd9SEtienne Carriere static const char __maybe_unused unknown[] = "<unknown-identifier>";
14*f7d7fcd9SEtienne Carriere 
15*f7d7fcd9SEtienne Carriere struct any_id {
16*f7d7fcd9SEtienne Carriere 	uint32_t id;
17*f7d7fcd9SEtienne Carriere #if CFG_TEE_TA_LOG_LEVEL > 0
18*f7d7fcd9SEtienne Carriere 	const char *string;
19*f7d7fcd9SEtienne Carriere #endif
20*f7d7fcd9SEtienne Carriere };
21*f7d7fcd9SEtienne Carriere 
22*f7d7fcd9SEtienne Carriere /*
23*f7d7fcd9SEtienne Carriere  * Macro PKCS11_ID() can be used to define cells in ID list arrays
24*f7d7fcd9SEtienne Carriere  * or ID/string conversion arrays.
25*f7d7fcd9SEtienne Carriere  */
26*f7d7fcd9SEtienne Carriere #if CFG_TEE_TA_LOG_LEVEL > 0
27*f7d7fcd9SEtienne Carriere #define PKCS11_ID(_id)		{ .id = _id, .string = #_id }
28*f7d7fcd9SEtienne Carriere #else
29*f7d7fcd9SEtienne Carriere #define PKCS11_ID(_id)		{ .id = _id }
30*f7d7fcd9SEtienne Carriere #endif
31*f7d7fcd9SEtienne Carriere 
32*f7d7fcd9SEtienne Carriere #define ID2STR(id, table, prefix)	\
33*f7d7fcd9SEtienne Carriere 	id2str(id, table, ARRAY_SIZE(table), prefix)
34*f7d7fcd9SEtienne Carriere 
35*f7d7fcd9SEtienne Carriere /* Convert a PKCS11 ID into its label string */
36*f7d7fcd9SEtienne Carriere static const char __maybe_unused *id2str(uint32_t id,
37*f7d7fcd9SEtienne Carriere 					 const struct any_id *table,
38*f7d7fcd9SEtienne Carriere 					 size_t count, const char *prefix)
39*f7d7fcd9SEtienne Carriere {
40*f7d7fcd9SEtienne Carriere 	size_t n = 0;
41*f7d7fcd9SEtienne Carriere 	const char *str = NULL;
42*f7d7fcd9SEtienne Carriere 
43*f7d7fcd9SEtienne Carriere 	for (n = 0; n < count; n++) {
44*f7d7fcd9SEtienne Carriere 		if (id != table[n].id)
45*f7d7fcd9SEtienne Carriere 			continue;
46*f7d7fcd9SEtienne Carriere 
47*f7d7fcd9SEtienne Carriere 		str = table[n].string;
48*f7d7fcd9SEtienne Carriere 
49*f7d7fcd9SEtienne Carriere 		/* Skip prefix provided matches found */
50*f7d7fcd9SEtienne Carriere 		if (prefix && !TEE_MemCompare(str, prefix, strlen(prefix)))
51*f7d7fcd9SEtienne Carriere 			str += strlen(prefix);
52*f7d7fcd9SEtienne Carriere 
53*f7d7fcd9SEtienne Carriere 		return str;
54*f7d7fcd9SEtienne Carriere 	}
55*f7d7fcd9SEtienne Carriere 
56*f7d7fcd9SEtienne Carriere 	return unknown;
57*f7d7fcd9SEtienne Carriere }
58*f7d7fcd9SEtienne Carriere 
59*f7d7fcd9SEtienne Carriere /*
60*f7d7fcd9SEtienne Carriere  * TA command IDs: used only as ID/string conversion for debug trace support
61*f7d7fcd9SEtienne Carriere  */
62*f7d7fcd9SEtienne Carriere static const struct any_id __maybe_unused string_ta_cmd[] = {
63*f7d7fcd9SEtienne Carriere 	PKCS11_ID(PKCS11_CMD_PING),
64*f7d7fcd9SEtienne Carriere };
65*f7d7fcd9SEtienne Carriere 
66*f7d7fcd9SEtienne Carriere #if CFG_TEE_TA_LOG_LEVEL > 0
67*f7d7fcd9SEtienne Carriere const char *id2str_ta_cmd(uint32_t id)
68*f7d7fcd9SEtienne Carriere {
69*f7d7fcd9SEtienne Carriere 	return ID2STR(id, string_ta_cmd, NULL);
70*f7d7fcd9SEtienne Carriere }
71*f7d7fcd9SEtienne Carriere #endif /*CFG_TEE_TA_LOG_LEVEL*/
72