• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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