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