1 /*
2 * Copyright (C) 2022 Huawei Technologies Co., Ltd.
3 * Licensed under the Mulan PSL v2.
4 * You can use this software according to the terms and conditions of the Mulan PSL v2.
5 * You may obtain a copy of Mulan PSL v2 at:
6 * http://license.coscl.org.cn/MulanPSL2
7 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR
8 * IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR
9 * PURPOSE.
10 * See the Mulan PSL v2 for more details.
11 */
12 #include <stdbool.h>
13 #ifndef CONFIG_SMART_LOCK_PLATFORM
14 #include <hilog/log_c.h>
15 #endif
16 #include <securec.h>
17 #include "tee_log.h"
18 #include "tlogcat.h"
19 #include "proc_tag.h"
20
21 static char g_logItemBuffer[LOG_ITEM_MAX_LEN];
OpenTeeLog(void)22 void OpenTeeLog(void)
23 {
24 }
25
CloseTeeLog(void)26 void CloseTeeLog(void)
27 {
28 }
29
30 #ifndef CONFIG_SMART_LOCK_PLATFORM
31 #ifdef LOG_TAG
32 #undef LOG_TAG
33 #endif
34 #define LOG_TAG "tlogcat"
35
36 #define LOG_DOMAIN_TEEOS 0xD005B01
37 #define LOG_DOMAIN_PLATDRV 0xD005BFE
38 #define LOG_DOMAIN_UNKNOWN 0x5BFF
39
40 typedef struct LogDomain {
41 uint32_t domain;
42 char uuid[UUID_MAX_STR_LEN];
43 } LogDomain;
44
45 const static LogDomain g_log_domain_info[] = {
46 {0x5B01, "A0F02C44F7A5469194C498565A44D934"}, /* TEE_CODE_PROTECT */
47 {0x5B02, "5FCE3EA5FA714152A30FF46BE8C924BF"}, /* TA_HuaweiNfcActiveCard */
48 {0x5B03, "6F4EAE1E2EC249678B6875554F36E8FA"}, /* facerecognize_algo */
49 {0x5B04, "49FBC428AF4411ECB9090242AC120002"}, /* HUKS */
50 {0x5B05, "1074B0CA3EFB42C9AB6378711E542B1B"}, /* task_permservice */
51 {0x5B06, "A3A7796FD071475B918B6E0C71316069"}, /* TEE_USER_AUTH */
52 {0x5B07, "D77C4D60D2794425AFA87F94559EAE16"}, /* FIAE */
53 {0x5B08, "D902F26F71534E46A79C94844AF8B007"}, /* task_vltmm_service */
54 {0x5B09, "DCA5AE8A769E4E24896B7D06442C1C0E"}, /* task_secisp */
55 {0x5B0A, "E8014913E5014D44A9D6058EC3B93B90"}, /* TEE_FACE_AUTH */
56 {0x5B0B, "F4A8816DB6FB4D4FA2B97DAE573313C0"}, /* ai */
57 {0x5B0C, "54FF868F0D8D44959D958E24B2A08274"}, /* task_file_encry */
58 {0x5B0D, "86310D18565947C9B212841A3CA4F814"}, /* HW_DCM */
59 {0x5B0E, "A423E43DABFD441FB89D39E39F3D7F65"}, /* TEE_FINGERPRINT_AUTH */
60 {0x5B0F, "EBEED547CF6A4592B0F12AE4A8CD43DA"}, /* TEE_PIN_AUTH */
61 {0x5B10, "FD1BBFB29A624B278FDBA503529076AF"}, /* TA_SensorInfo */
62 {0x5B11, "95B9AD1E0AF8420198910DBE8602F35F"}, /* CHINADRM_COMMON_TA */
63 {0x5B12, "A32B3D00CB5711E39C1A0800200C9A66"}, /* TEE_FINGERPRINT_AUTH-2 */
64 {0x5B13, "4AE7BA5128104CEEABBEA42307B4ACE3"}, /* TA_HuaweiWallet */
65 {0x5B14, "4D06A2AAD05A46F4AD58DE2D758070C9"}, /* TA_activation_lock */
66 {0x5B15, "9DB3A5C655F643AE8DAD6F4BF9FDBA55"}, /* trusted_ring_service */
67 {0x5B16, "C123C6435B5B4C9F9098BB09564D6EDA"}, /* ai_security */
68 {0x5B18, "ABE89147CD61F43F71C41A317E405312"}, /* vsim_sw */
69 {0x5B19, "2F4A54A12B3D4EC7914EC4F770905F7A"}, /* task_sec_auth */
70 {0x5B1A, "7E60394321226F7990D0B2D8A7801025"}, /* dstb_service */
71 {0x5B1B, "9FC2B7115FFA43909C457A1AF90F99AE"}, /* dstb_mgr_agent */
72 {0x5B1C, "B2733D6C3DE54BAE8BD955A2C528B6AA"}, /* task_dev_secinfo_auth */
73 {0x5B1D, "F8028DCAABA011E680F576304DEC7EB7"} /* secmem */
74 };
75 const static uint32_t g_log_domain_info_size = sizeof(g_log_domain_info) / sizeof(g_log_domain_info[0]);
76
TeeGetTaLogDomain(struct TeeUuid * uuid)77 static uint32_t TeeGetTaLogDomain(struct TeeUuid *uuid)
78 {
79 char uuidAscii[UUID_MAX_STR_LEN] = {0};
80 uint32_t i;
81
82 GetUuidStr(uuid, uuidAscii, sizeof(uuidAscii));
83 for (i = 0; i < g_log_domain_info_size; i++) {
84 if (strcmp(uuidAscii, g_log_domain_info[i].uuid) == 0) {
85 return g_log_domain_info[i].domain;
86 }
87 }
88 return LOG_DOMAIN_UNKNOWN;
89 }
90
TeeGetTeeosOrPlatdrvLogDomain(uint8_t logSourceType,const char * logItemBuffer,uint16_t bufferLen)91 static uint32_t TeeGetTeeosOrPlatdrvLogDomain(uint8_t logSourceType, const char *logItemBuffer, uint16_t bufferLen)
92 {
93 uint16_t i;
94 const char *drvTag = "platdrv";
95 const uint16_t drvTagLen = strlen(drvTag);
96
97 if (logSourceType != 0) {
98 return LOG_DOMAIN_PLATDRV;
99 }
100
101 for (i = 0; i < bufferLen; i++) {
102 if (logItemBuffer[i] == '[') {
103 break;
104 }
105 }
106
107 if ((bufferLen - i > drvTagLen) && (strncmp(&logItemBuffer[i + 1], drvTag, drvTagLen) == 0)) {
108 return LOG_DOMAIN_PLATDRV;
109 }
110
111 return LOG_DOMAIN_TEEOS;
112 }
113
TeeHilogPrint(const struct LogItem * logItem,const char * logItemBuffer,bool isTa)114 static void TeeHilogPrint(const struct LogItem *logItem, const char *logItemBuffer, bool isTa)
115 {
116 uint8_t logLevel = logItem->logLevel;
117 uint32_t hiLogLevel[TOTAL_LEVEL_NUMS] = {LOG_ERROR, LOG_WARN, LOG_INFO, LOG_DEBUG, LOG_DEBUG};
118 const char *logTag = LOG_TEEOS_TAG;
119 uint32_t log_domain;
120 uint32_t log_type;
121
122 if (isTa) {
123 log_type = LOG_APP;
124 log_domain = TeeGetTaLogDomain((struct TeeUuid *)logItem->uuid);
125 } else {
126 log_type = LOG_CORE;
127 log_domain = TeeGetTeeosOrPlatdrvLogDomain(logItem->logSourceType, logItemBuffer, logItem->logRealLen);
128 }
129
130 JudgeLogTag(logItem, isTa, &logTag);
131
132 if (logLevel < TOTAL_LEVEL_NUMS) {
133 logLevel = hiLogLevel[logLevel];
134 } else {
135 logLevel = LOG_INFO;
136 }
137
138 HILOG_IMPL(log_type, logLevel, log_domain, logTag, "index: %{public}u: %{public}s",
139 logItem->serialNo, logItemBuffer);
140 }
141 #else
TeeHilogPrint(const struct LogItem * logItem,const char * logItemBuffer,bool isTa)142 static void TeeHilogPrint(const struct LogItem *logItem, const char *logItemBuffer, bool isTa)
143 {
144 (void)isTa;
145 switch (logItem->logLevel) {
146 case LOG_LEVEL_ERROR:
147 HILOG_ERROR(HILOG_MODULE_SEC, "[%s] index: %u: %s",
148 LOG_TEEOS_TAG, logItem->serialNo, logItemBuffer);
149 break;
150 case LOG_LEVEL_WARN:
151 HILOG_WARN(HILOG_MODULE_SEC, "[%s] index: %u: %s",
152 LOG_TEEOS_TAG, logItem->serialNo, logItemBuffer);
153 break;
154 case LOG_LEVEL_INFO:
155 HILOG_INFO(HILOG_MODULE_SEC, "[%s] index: %u: %s",
156 LOG_TEEOS_TAG, logItem->serialNo, logItemBuffer);
157 break;
158 case LOG_LEVEL_DEBUG:
159 case LOG_LEVEL_VERBO:
160 HILOG_DEBUG(HILOG_MODULE_SEC, "[%s] index: %u: %s",
161 LOG_TEEOS_TAG, logItem->serialNo, logItemBuffer);
162 break;
163 default:
164 HILOG_INFO(HILOG_MODULE_SEC, "[%s] index: %u: %s",
165 LOG_TEEOS_TAG, logItem->serialNo, logItemBuffer);
166 break;
167 }
168 }
169 #endif
170
LogWriteSysLog(const struct LogItem * logItem,bool isTa)171 void LogWriteSysLog(const struct LogItem *logItem, bool isTa)
172 {
173 if (logItem == NULL || logItem->logRealLen <= 0) {
174 return;
175 }
176 if (memcpy_s(g_logItemBuffer, LOG_ITEM_MAX_LEN, logItem->logBuffer, logItem->logRealLen) == EOK) {
177 g_logItemBuffer[logItem->logRealLen - 1] = '\0';
178 TeeHilogPrint(logItem, (const char*)g_logItemBuffer, isTa);
179 }
180 }
181