• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include <locale.h>
17 #include "softbus_utils.h"
18 
19 #include <stdlib.h>
20 
21 #include "comm_log.h"
22 #include "securec.h"
23 #include "softbus_adapter_crypto.h"
24 #include "softbus_adapter_mem.h"
25 #include "softbus_adapter_thread.h"
26 #include "softbus_adapter_timer.h"
27 #include "softbus_common.h"
28 #include "softbus_def.h"
29 #include "softbus_error_code.h"
30 
31 #define WIDE_CHAR_MAX_LEN 8
32 #define WIDE_STR_MAX_LEN 128
33 
34 #define MAC_BIT_ZERO 0
35 #define MAC_BIT_ONE 1
36 #define MAC_BIT_TWO 2
37 #define MAC_BIT_THREE 3
38 #define MAC_BIT_FOUR 4
39 #define MAC_BIT_FIVE 5
40 
41 #define BT_ADDR_LEN 6
42 #define BT_ADDR_DELIMITER ":"
43 #define BT_ADDR_BASE 16
44 
45 #define BUF_BYTE_LEN 64
46 #define BUF_HEX_LEN 128
47 #define OFFSET 1
48 
49 #define MAC_DELIMITER_SECOND 2
50 #define MAC_DELIMITER_FOURTH 4
51 #define IP_DELIMITER_FIRST 1
52 #define IP_DELIMITER_THIRD 3
53 #define GET_ID_HALF_LEN 2
54 #define MAX_ID_LEN 65
55 #define MAX_IP_LEN 48
56 #define MAX_MAC_LEN 46
57 #define MAX_HANDLE_TIMES 3600
58 #define INT_TO_STRING_MAX_LEN 21
59 
60 #define ONE_BYTE_SIZE 8
61 
62 #ifdef SOFTBUS_STANDARD_OS
63 static int32_t *g_timerHandle = NULL;
64 #else
65 static void *g_timerId = NULL;
66 #endif
67 static TimerFunCallback g_timerFunList[SOFTBUS_MAX_TIMER_FUN_NUM] = {0};
68 static bool g_signalingMsgSwitch = false;
69 
CreateSoftBusList(void)70 SoftBusList *CreateSoftBusList(void)
71 {
72     SoftBusList *list = (SoftBusList *)SoftBusMalloc(sizeof(SoftBusList));
73     if (list == NULL) {
74         COMM_LOGE(COMM_UTILS, "malloc failed");
75         return NULL;
76     }
77     (void)memset_s(list, sizeof(SoftBusList), 0, sizeof(SoftBusList));
78 
79     SoftBusMutexAttr mutexAttr;
80     mutexAttr.type = SOFTBUS_MUTEX_RECURSIVE;
81     if (SoftBusMutexInit(&list->lock, &mutexAttr) != SOFTBUS_OK) {
82         COMM_LOGE(COMM_UTILS, "init lock failed");
83         SoftBusFree(list);
84         return NULL;
85     }
86     ListInit(&list->list);
87     return list;
88 }
89 
DestroySoftBusList(SoftBusList * list)90 void DestroySoftBusList(SoftBusList *list)
91 {
92     if (list == NULL) {
93         COMM_LOGE(COMM_UTILS, "list is null");
94         return;
95     }
96     ListDelInit(&list->list);
97     SoftBusMutexDestroy(&list->lock);
98     SoftBusFree(list);
99     return;
100 }
101 
RegisterTimeoutCallback(int32_t timerFunId,TimerFunCallback callback)102 int32_t RegisterTimeoutCallback(int32_t timerFunId, TimerFunCallback callback)
103 {
104     if (callback == NULL || timerFunId >= SOFTBUS_MAX_TIMER_FUN_NUM ||
105         timerFunId < SOFTBUS_CONN_TIMER_FUN) {
106         COMM_LOGE(COMM_UTILS, "invalid param");
107         return SOFTBUS_INVALID_PARAM;
108     }
109     if (g_timerFunList[timerFunId] != NULL) {
110         return SOFTBUS_OK;
111     }
112     g_timerFunList[timerFunId] = callback;
113     return SOFTBUS_OK;
114 }
115 
UnRegisterTimeoutCallback(int32_t timerFunId)116 int32_t UnRegisterTimeoutCallback(int32_t timerFunId)
117 {
118     if (timerFunId >= SOFTBUS_MAX_TIMER_FUN_NUM || timerFunId < SOFTBUS_CONN_TIMER_FUN) {
119         COMM_LOGE(COMM_UTILS, "invalid param");
120         return SOFTBUS_INVALID_PARAM;
121     }
122     g_timerFunList[timerFunId] = NULL;
123     return SOFTBUS_OK;
124 }
125 
HandleTimeoutFun(void)126 static void HandleTimeoutFun(void)
127 {
128     int32_t i;
129     for (i = 0; i < SOFTBUS_MAX_TIMER_FUN_NUM; i++) {
130         if (g_timerFunList[i] != NULL) {
131             g_timerFunList[i]();
132         }
133     }
134 }
135 
SoftBusTimerInit(void)136 int32_t SoftBusTimerInit(void)
137 {
138 #ifdef SOFTBUS_STANDARD_OS
139     if (g_timerHandle != NULL) {
140         return SOFTBUS_OK;
141     }
142     SetTimerFunc(HandleTimeoutFun);
143     g_timerHandle = (int32_t *)SoftBusCalloc(sizeof(int32_t));
144     if (g_timerHandle == NULL) {
145         COMM_LOGE(COMM_UTILS, "timerHandle calloc fail");
146         return SOFTBUS_MALLOC_ERR;
147     }
148     int32_t ret = SoftBusStartTimerWithFfrt(g_timerHandle, TIMER_TIMEOUT, true);
149     if (ret != SOFTBUS_OK) {
150         SoftBusFree(g_timerHandle);
151         g_timerHandle = NULL;
152         COMM_LOGE(COMM_UTILS, "softbus timer init fail, ret=%{public}d", ret);
153     }
154     return ret;
155 #else
156     if (g_timerId != NULL) {
157         return SOFTBUS_OK;
158     }
159     SetTimerFunc(HandleTimeoutFun);
160     g_timerId = SoftBusCreateTimer(&g_timerId, TIMER_TYPE_PERIOD);
161     if (SoftBusStartTimer(g_timerId, TIMER_TIMEOUT) != SOFTBUS_OK) {
162         COMM_LOGE(COMM_UTILS, "start timer failed.");
163         (void)SoftBusDeleteTimer(g_timerId);
164         g_timerId = NULL;
165         return SOFTBUS_ERR;
166     }
167     return SOFTBUS_OK;
168 #endif
169 }
170 
SoftBusTimerDeInit(void)171 void SoftBusTimerDeInit(void)
172 {
173 #ifdef SOFTBUS_STANDARD_OS
174     if (g_timerHandle != NULL) {
175         SoftBusStopTimerWithFfrt(*g_timerHandle);
176         SoftBusFree(g_timerHandle);
177         g_timerHandle = NULL;
178     }
179     return;
180 #else
181     if (g_timerId != NULL) {
182         (void)SoftBusDeleteTimer(g_timerId);
183         g_timerId = NULL;
184     }
185 #endif
186 }
187 
ConvertBytesToUpperCaseHexString(char * outBuf,uint32_t outBufLen,const unsigned char * inBuf,uint32_t inLen)188 int32_t ConvertBytesToUpperCaseHexString(char *outBuf, uint32_t outBufLen, const unsigned char * inBuf,
189     uint32_t inLen)
190 {
191     if ((outBuf == NULL) || (inBuf == NULL) || (outBufLen < HEXIFY_LEN(inLen))) {
192         COMM_LOGE(COMM_UTILS, "invalid param, inlen=%{public}u, outBufLen=%{public}u", inLen, outBufLen);
193         return SOFTBUS_ERR;
194     }
195 
196     while (inLen > 0) {
197         unsigned char h = *inBuf / HEX_MAX_NUM;
198         unsigned char l = *inBuf % HEX_MAX_NUM;
199         if (h < DEC_MAX_NUM) {
200             *outBuf++ = '0' + h;
201         } else {
202             *outBuf++ = 'A' + h - DEC_MAX_NUM;
203         }
204         if (l < DEC_MAX_NUM) {
205             *outBuf++ = '0' + l;
206         } else {
207             *outBuf++ = 'A' + l - DEC_MAX_NUM;
208         }
209         ++inBuf;
210         inLen--;
211     }
212     return SOFTBUS_OK;
213 }
214 
ConvertHexStringToBytes(unsigned char * outBuf,uint32_t outBufLen,const char * inBuf,uint32_t inLen)215 int32_t ConvertHexStringToBytes(unsigned char *outBuf, uint32_t outBufLen, const char *inBuf,
216     uint32_t inLen)
217 {
218     if ((outBuf == NULL) || (inBuf == NULL) || (inLen % HEXIFY_UNIT_LEN != 0)) {
219         COMM_LOGE(COMM_UTILS, "invalid param");
220         return SOFTBUS_INVALID_PARAM;
221     }
222 
223     uint32_t outLen = UN_HEXIFY_LEN(inLen);
224     if (outLen > outBufLen) {
225         COMM_LOGE(COMM_UTILS, "outLen > outBufLen");
226         return SOFTBUS_ERR;
227     }
228     uint32_t i = 0;
229     while (i < outLen) {
230         unsigned char c = *inBuf++;
231         if ((c >= '0') && (c <= '9')) {
232             c -= '0';
233         } else if ((c >= 'a') && (c <= 'f')) {
234             c -= 'a' - DEC_MAX_NUM;
235         } else if ((c >= 'A') && (c <= 'F')) {
236             c -= 'A' - DEC_MAX_NUM;
237         } else {
238             COMM_LOGE(COMM_UTILS, "HexToString Error! inBuf=%{public}c", c);
239             return SOFTBUS_ERR;
240         }
241         unsigned char c2 = *inBuf++;
242         if ((c2 >= '0') && (c2 <= '9')) {
243             c2 -= '0';
244         } else if ((c2 >= 'a') && (c2 <= 'f')) {
245             c2 -= 'a' - DEC_MAX_NUM;
246         } else if ((c2 >= 'A') && (c2 <= 'F')) {
247             c2 -= 'A' - DEC_MAX_NUM;
248         } else {
249             COMM_LOGE(COMM_UTILS, "HexToString Error! inBuf2=%{public}c", c2);
250             return SOFTBUS_ERR;
251         }
252         *outBuf++ = (c << HEX_MAX_BIT_NUM) | c2;
253         i++;
254     }
255     return SOFTBUS_OK;
256 }
257 
ConvertBytesToHexString(char * outBuf,uint32_t outBufLen,const unsigned char * inBuf,uint32_t inLen)258 int32_t ConvertBytesToHexString(char *outBuf, uint32_t outBufLen, const unsigned char *inBuf,
259     uint32_t inLen)
260 {
261     if ((outBuf == NULL) || (inBuf == NULL) || (outBufLen < HEXIFY_LEN(inLen))) {
262         COMM_LOGD(COMM_UTILS, "outBufLen=%{public}d, inLen=%{public}d", outBufLen, inLen);
263         return SOFTBUS_ERR;
264     }
265 
266     while (inLen > 0) {
267         unsigned char h = *inBuf / HEX_MAX_NUM;
268         unsigned char l = *inBuf % HEX_MAX_NUM;
269         if (h < DEC_MAX_NUM) {
270             *outBuf++ = '0' + h;
271         } else {
272             *outBuf++ = 'a' + h - DEC_MAX_NUM;
273         }
274         if (l < DEC_MAX_NUM) {
275             *outBuf++ = '0' + l;
276         } else {
277             *outBuf++ = 'a' + l - DEC_MAX_NUM;
278         }
279         ++inBuf;
280         inLen--;
281     }
282     return SOFTBUS_OK;
283 }
284 
GenerateRandomStr(char * str,uint32_t len)285 int32_t GenerateRandomStr(char *str, uint32_t len)
286 {
287     if ((str == NULL) ||  (len < HEXIFY_UNIT_LEN)) {
288         return SOFTBUS_INVALID_PARAM;
289     }
290 
291     uint32_t hexLen = len / HEXIFY_UNIT_LEN;
292     unsigned char *hexAuthId = (unsigned char *)SoftBusMalloc(hexLen);
293     if (hexAuthId == NULL) {
294         return SOFTBUS_MEM_ERR;
295     }
296     (void)memset_s(hexAuthId, hexLen, 0, hexLen);
297     if (SoftBusGenerateRandomArray(hexAuthId, hexLen) != SOFTBUS_OK) {
298         COMM_LOGE(COMM_UTILS, "Generate random array fail");
299         SoftBusFree(hexAuthId);
300         return SOFTBUS_ERR;
301     }
302     if (ConvertBytesToHexString(str, len, hexAuthId, hexLen) != SOFTBUS_OK) {
303         COMM_LOGE(COMM_UTILS, "Convert bytes to hexstring fail");
304         SoftBusFree(hexAuthId);
305         return SOFTBUS_ERR;
306     }
307     SoftBusFree(hexAuthId);
308     return SOFTBUS_OK;
309 }
310 
IsValidString(const char * input,uint32_t maxLen)311 bool IsValidString(const char *input, uint32_t maxLen)
312 {
313     if (input == NULL) {
314         COMM_LOGE(COMM_UTILS, "input is null");
315         return false;
316     }
317     uint32_t len = strlen(input);
318     if (len == 0 || len > maxLen) {
319         return false;
320     }
321     return true;
322 }
323 
ConvertBtMacToBinary(const char * strMac,uint32_t strMacLen,uint8_t * binMac,uint32_t binMacLen)324 int32_t ConvertBtMacToBinary(const char *strMac, uint32_t strMacLen, uint8_t *binMac,
325     uint32_t binMacLen)
326 {
327     const char *invalidAddr = "00:00:00:00:00:00";
328     if (strMac == NULL || strMacLen < BT_MAC_LEN || binMac == NULL || binMacLen < BT_ADDR_LEN ||
329         strncmp(strMac, invalidAddr, BT_MAC_LEN) == 0) {
330         COMM_LOGE(COMM_UTILS, "invalid param");
331         return SOFTBUS_INVALID_PARAM;
332     }
333     char *tmpMac = (char *)SoftBusMalloc(strMacLen * sizeof(char));
334     if (tmpMac == NULL) {
335         COMM_LOGE(COMM_UTILS, "tmpMac is null");
336         return SOFTBUS_MALLOC_ERR;
337     }
338     if (memcpy_s(tmpMac, strMacLen, strMac, strMacLen) != EOK) {
339         COMM_LOGE(COMM_UTILS, "memcpy tmpMac fail");
340         SoftBusFree(tmpMac);
341         return SOFTBUS_MEM_ERR;
342     }
343     char *nextTokenPtr = NULL;
344     char *token = strtok_r((char *)tmpMac, BT_ADDR_DELIMITER, &nextTokenPtr);
345     char *endptr = NULL;
346     for (int i = 0; i < BT_ADDR_LEN; i++) {
347         if (token == NULL) {
348             SoftBusFree(tmpMac);
349             return SOFTBUS_ERR;
350         }
351         binMac[i] = strtoul(token, &endptr, BT_ADDR_BASE);
352         token = strtok_r(NULL, BT_ADDR_DELIMITER, &nextTokenPtr);
353     }
354     SoftBusFree(tmpMac);
355     return SOFTBUS_OK;
356 }
357 
ConvertBtMacToStrNoColon(char * strMac,uint32_t strMacLen,const uint8_t * binMac,uint32_t binMacLen)358 int32_t ConvertBtMacToStrNoColon(char *strMac, uint32_t strMacLen, const uint8_t *binMac,
359     uint32_t binMacLen)
360 {
361     int32_t ret;
362 
363     if (strMac == NULL || strMacLen < BT_MAC_NO_COLON_LEN || binMac == NULL || binMacLen < BT_ADDR_LEN) {
364         COMM_LOGE(COMM_UTILS, "invalid param");
365         return SOFTBUS_INVALID_PARAM;
366     }
367     ret = snprintf_s(strMac, strMacLen, strMacLen - 1, "%02x%02x%02x%02x%02x%02x",
368         binMac[MAC_BIT_ZERO], binMac[MAC_BIT_ONE], binMac[MAC_BIT_TWO],
369         binMac[MAC_BIT_THREE], binMac[MAC_BIT_FOUR], binMac[MAC_BIT_FIVE]);
370     if (ret < 0) {
371         COMM_LOGE(COMM_UTILS, "snprintf_s fail");
372         return SOFTBUS_ERR;
373     }
374     return SOFTBUS_OK;
375 }
376 
ConvertBtMacToStr(char * strMac,uint32_t strMacLen,const uint8_t * binMac,uint32_t binMacLen)377 int32_t ConvertBtMacToStr(char *strMac, uint32_t strMacLen, const uint8_t *binMac,
378     uint32_t binMacLen)
379 {
380     int32_t ret;
381 
382     if (strMac == NULL || strMacLen < BT_MAC_LEN || binMac == NULL || binMacLen < BT_ADDR_LEN) {
383         COMM_LOGE(COMM_UTILS, "invalid param");
384         return SOFTBUS_INVALID_PARAM;
385     }
386     ret = snprintf_s(strMac, strMacLen, strMacLen - 1, "%02x:%02x:%02x:%02x:%02x:%02x",
387         binMac[MAC_BIT_ZERO], binMac[MAC_BIT_ONE], binMac[MAC_BIT_TWO],
388         binMac[MAC_BIT_THREE], binMac[MAC_BIT_FOUR], binMac[MAC_BIT_FIVE]);
389     if (ret < 0) {
390         COMM_LOGE(COMM_UTILS, "snprintf_s fail");
391         return SOFTBUS_ERR;
392     }
393     return SOFTBUS_OK;
394 }
395 
ConvertReverseBtMacToStr(char * strMac,uint32_t strMacLen,const uint8_t * binMac,uint32_t binMacLen)396 int32_t ConvertReverseBtMacToStr(char *strMac, uint32_t strMacLen, const uint8_t *binMac, uint32_t binMacLen)
397 {
398     int32_t ret;
399     if (strMac == NULL || strMacLen < BT_MAC_LEN || binMac == NULL || binMacLen < BT_ADDR_LEN) {
400         return SOFTBUS_INVALID_PARAM;
401     }
402     ret = snprintf_s(strMac, strMacLen, strMacLen - 1, "%02x:%02x:%02x:%02x:%02x:%02x",
403         binMac[MAC_BIT_FIVE], binMac[MAC_BIT_FOUR], binMac[MAC_BIT_THREE],
404         binMac[MAC_BIT_TWO], binMac[MAC_BIT_ONE], binMac[MAC_BIT_ZERO]);
405     if (ret < 0) {
406         return SOFTBUS_ERR;
407     }
408     return SOFTBUS_OK;
409 }
410 
ConvertBtMacToU64(const char * strMac,uint32_t strMacLen,uint64_t * u64Mac)411 int32_t ConvertBtMacToU64(const char *strMac, uint32_t strMacLen, uint64_t *u64Mac)
412 {
413     if (strMac == NULL || strMacLen < BT_MAC_LEN || u64Mac == NULL) {
414         COMM_LOGE(COMM_UTILS, "invalid param");
415         return SOFTBUS_INVALID_PARAM;
416     }
417     uint8_t binaryAddr[BT_ADDR_LEN] = { 0 };
418     int32_t status = ConvertBtMacToBinary(strMac, BT_MAC_LEN, binaryAddr, BT_ADDR_LEN);
419     if (status != SOFTBUS_OK) {
420         COMM_LOGE(COMM_UTILS, "Convert btMac to binary fail");
421         return SOFTBUS_ERR;
422     }
423     uint64_t u64Value = 0;
424     for (int i = 0; i < BT_ADDR_LEN; i++) {
425         u64Value = (u64Value << ONE_BYTE_SIZE) | binaryAddr[i];
426     }
427     *u64Mac = u64Value;
428     return SOFTBUS_OK;
429 }
430 
ConvertU64MacToStr(uint64_t u64Mac,char * strMac,uint32_t strMacLen)431 int32_t ConvertU64MacToStr(uint64_t u64Mac, char *strMac, uint32_t strMacLen)
432 {
433     if (strMac == NULL || strMacLen < BT_MAC_LEN || u64Mac == 0) {
434         return SOFTBUS_INVALID_PARAM;
435     }
436     uint8_t binaryAddr[BT_ADDR_LEN] = { 0 };
437     for (int i = BT_ADDR_LEN - 1; i >= 0; i--) {
438         binaryAddr[i] = u64Mac & 0xFF;
439         u64Mac = u64Mac >> ONE_BYTE_SIZE;
440     }
441     return ConvertBtMacToStr(strMac, strMacLen, binaryAddr, BT_ADDR_LEN);
442 }
ToUpperCase(char ch)443 static char ToUpperCase(char ch)
444 {
445     if (ch >= 'a' && ch <= 'z') {
446         return ch - 'a' + 'A';
447     }
448     return ch;
449 }
450 
ToLowerCase(char ch)451 static char ToLowerCase(char ch)
452 {
453     if (ch >= 'A' && ch <= 'Z') {
454         return ch - 'A' + 'a';
455     }
456     return ch;
457 }
458 
StringToUpperCase(const char * str,char * buf,int32_t size)459 int32_t StringToUpperCase(const char *str, char *buf, int32_t size)
460 {
461     if (str == NULL || buf == NULL) {
462         return SOFTBUS_ERR;
463     }
464     memset_s(buf, size, 0, size);
465     int32_t i;
466     for (i = 0; str[i] != '\0'; i++) {
467         buf[i] = ToUpperCase(str[i]);
468     }
469     return SOFTBUS_OK;
470 }
471 
StringToLowerCase(const char * str,char * buf,int32_t size)472 int32_t StringToLowerCase(const char *str, char *buf, int32_t size)
473 {
474     if (str == NULL || buf == NULL) {
475         return SOFTBUS_ERR;
476     }
477     memset_s(buf, size, 0, size);
478     int32_t i;
479     for (i = 0; str[i] != '\0'; i++) {
480         buf[i] = ToLowerCase(str[i]);
481     }
482     return SOFTBUS_OK;
483 }
484 
Int64ToString(int64_t src,char * buf,uint32_t bufLen)485 bool Int64ToString(int64_t src, char *buf, uint32_t bufLen)
486 {
487     if (buf == NULL) {
488         return false;
489     }
490     if (sprintf_s(buf, bufLen, "%" PRId64"", src) < 0) {
491         COMM_LOGE(COMM_UTILS, "convert int64 to str fail");
492         return false;
493     }
494     return true;
495 }
496 
StrCmpIgnoreCase(const char * str1,const char * str2)497 int32_t StrCmpIgnoreCase(const char *str1, const char *str2)
498 {
499     if (str1 == NULL || str2 == NULL) {
500         COMM_LOGD(COMM_UTILS, "invalid param");
501         return SOFTBUS_ERR;
502     }
503     int32_t i;
504     for (i = 0; str1[i] != '\0' && str2[i] != '\0'; i++) {
505         if (ToUpperCase(str1[i]) != ToUpperCase(str2[i])) {
506             return SOFTBUS_ERR;
507         }
508     }
509     if (str1[i] != '\0' || str2[i] != '\0') {
510         return SOFTBUS_ERR;
511     }
512     return SOFTBUS_OK;
513 }
514 
SetSignalingMsgSwitchOn(void)515 void SetSignalingMsgSwitchOn(void)
516 {
517     g_signalingMsgSwitch = true;
518 }
519 
SetSignalingMsgSwitchOff(void)520 void SetSignalingMsgSwitchOff(void)
521 {
522     g_signalingMsgSwitch = false;
523 }
524 
GetSignalingMsgSwitch(void)525 bool GetSignalingMsgSwitch(void)
526 {
527     return g_signalingMsgSwitch;
528 }
529 
SignalingMsgPrint(const char * distinguish,unsigned char * data,unsigned char dataLen,uint32_t module)530 void SignalingMsgPrint(const char *distinguish, unsigned char *data, unsigned char dataLen, uint32_t module)
531 {
532     int ret = 0;
533     char signalingMsgBuf[BUF_HEX_LEN] = {0};
534 
535     if (!GetSignalingMsgSwitch()) {
536         return;
537     }
538     if (dataLen >= BUF_BYTE_LEN) {
539         ret = ConvertBytesToHexString(signalingMsgBuf, BUF_HEX_LEN + OFFSET, data, BUF_BYTE_LEN);
540     } else {
541         ret = ConvertBytesToHexString(signalingMsgBuf, BUF_HEX_LEN + OFFSET, data, dataLen);
542     }
543     if (ret != SOFTBUS_OK) {
544         COMM_LOGE(COMM_UTILS, "intercept signaling msg failed");
545         return;
546     }
547 }
548 
MacInstead(char * data,uint32_t length,char delimiter)549 void MacInstead(char *data, uint32_t length, char delimiter)
550 {
551     if (length > MAX_MAC_LEN) {
552         COMM_LOGE(COMM_UTILS, "MacInstead len is invalid");
553         return;
554     }
555     int delimiterCnt = 0;
556     for (uint32_t i = 0; i < length; i++) {
557         if (delimiterCnt == MAC_DELIMITER_FOURTH) {
558             break;
559         }
560         if (data[i] == delimiter) {
561             delimiterCnt++;
562         }
563         if (delimiterCnt >= MAC_DELIMITER_SECOND && data[i] != delimiter) {
564             data[i] = '*';
565         }
566     }
567 }
568 
IpInstead(char * data,uint32_t length,char delimiter)569 void IpInstead(char *data, uint32_t length, char delimiter)
570 {
571     if (length > MAX_IP_LEN) {
572         COMM_LOGE(COMM_UTILS, "IpInstead len is invalid");
573         return;
574     }
575     int delimiterCnt = 0;
576     for (uint32_t i = 0; i < length; i++) {
577         if (delimiterCnt == IP_DELIMITER_THIRD) {
578             break;
579         }
580         if (data[i] == delimiter) {
581             delimiterCnt++;
582         }
583         if (delimiterCnt >= IP_DELIMITER_FIRST && data[i] != delimiter) {
584             data[i] = '*';
585         }
586     }
587 }
588 
IdInstead(char * data,uint32_t length)589 void IdInstead(char *data, uint32_t length)
590 {
591     if (length < 1 || length > MAX_ID_LEN) {
592         COMM_LOGE(COMM_UTILS, "IdInstead len is invalid");
593         return;
594     }
595     uint32_t halfLen = length / GET_ID_HALF_LEN;
596     for (uint32_t i = 0; i < length - 1; i++) {
597         if (i > halfLen) {
598             data[i] = '*';
599         }
600     }
601 }
602 
DataMasking(const char * data,uint32_t length,char delimiter,char * container)603 void DataMasking(const char *data, uint32_t length, char delimiter, char *container)
604 {
605     if (data == NULL) {
606         COMM_LOGE(COMM_UTILS, "invalid param");
607         return;
608     }
609     if (memcpy_s(container, length, data, length) != EOK) {
610         COMM_LOGE(COMM_UTILS, "container memcpy_s failed");
611         return;
612     }
613     switch (delimiter) {
614         case MAC_DELIMITER:
615             MacInstead(container, length, delimiter);
616             break;
617         case IP_DELIMITER:
618             IpInstead(container, length, delimiter);
619             break;
620         case ID_DELIMITER:
621             IdInstead(container, length);
622             break;
623         default:
624             break;
625     }
626 }
627 
GenerateStrHashAndConvertToHexString(const unsigned char * str,uint32_t len,unsigned char * hashStr,uint32_t hashStrLen)628 int32_t GenerateStrHashAndConvertToHexString(const unsigned char *str, uint32_t len,
629     unsigned char *hashStr, uint32_t hashStrLen)
630 {
631     int32_t ret;
632     unsigned char hashResult[SHA_256_HASH_LEN] = {0};
633     if (hashStrLen < HEXIFY_LEN(len / HEXIFY_UNIT_LEN)) {
634         COMM_LOGE(COMM_UTILS, "generate str hash invalid hashStrLen");
635         return SOFTBUS_INVALID_PARAM;
636     }
637     if (str == NULL) {
638         COMM_LOGE(COMM_UTILS, "generate str hash invalid param");
639         return SOFTBUS_INVALID_PARAM;
640     }
641     ret = SoftBusGenerateStrHash(str, strlen((char *)str), hashResult);
642     if (ret != SOFTBUS_OK) {
643         COMM_LOGE(COMM_UTILS, "generate str hash fail, ret=%{public}d", ret);
644         return ret;
645     }
646     ret = ConvertBytesToHexString((char *)hashStr, hashStrLen, (const unsigned char *)hashResult,
647         len / HEXIFY_UNIT_LEN);
648     if (ret != SOFTBUS_OK) {
649         COMM_LOGE(COMM_UTILS, "convert bytes to str hash fail, ret=%{public}d", ret);
650         return ret;
651     }
652     return SOFTBUS_OK;
653 }
654 
CheckParamIsNull(uint8_t * buf,int32_t * offSet)655 static int32_t CheckParamIsNull(uint8_t *buf, int32_t *offSet)
656 {
657     if (buf == NULL) {
658         COMM_LOGE(COMM_UTILS, "param buf is NULL");
659         return SOFTBUS_INVALID_PARAM;
660     }
661     if (offSet == NULL) {
662         COMM_LOGE(COMM_UTILS, "param offSet is NULL");
663         return SOFTBUS_INVALID_PARAM;
664     }
665     return SOFTBUS_OK;
666 }
667 
WriteInt32ToBuf(uint8_t * buf,uint32_t dataLen,int32_t * offSet,int32_t data)668 int32_t WriteInt32ToBuf(uint8_t *buf, uint32_t dataLen, int32_t *offSet, int32_t data)
669 {
670     int32_t ret = CheckParamIsNull(buf, offSet);
671     if (ret != SOFTBUS_OK) {
672         return ret;
673     }
674     if (dataLen < *offSet + sizeof(data)) {
675         COMM_LOGE(COMM_UTILS, "write data is long than dataLen!");
676         return SOFTBUS_TRANS_INVALID_DATA_LENGTH;
677     }
678     *((int32_t *)(buf + *offSet)) = data;
679     *offSet += sizeof(data);
680     return SOFTBUS_OK;
681 }
682 
WriteUint64ToBuf(uint8_t * buf,uint32_t bufLen,int32_t * offSet,uint64_t data)683 int32_t WriteUint64ToBuf(uint8_t *buf, uint32_t bufLen, int32_t *offSet, uint64_t data)
684 {
685     int32_t ret = CheckParamIsNull(buf, offSet);
686     if (ret != SOFTBUS_OK) {
687         return ret;
688     }
689     if (bufLen < *offSet + sizeof(data)) {
690         COMM_LOGE(COMM_UTILS, "write data is long than bufLen!");
691         return SOFTBUS_TRANS_INVALID_DATA_LENGTH;
692     }
693     *((uint64_t *)(buf + *offSet)) = data;
694     *offSet += sizeof(data);
695     return SOFTBUS_OK;
696 }
697 
WriteUint8ToBuf(uint8_t * buf,uint32_t dataLen,int32_t * offSet,uint8_t data)698 int32_t WriteUint8ToBuf(uint8_t *buf, uint32_t dataLen, int32_t *offSet, uint8_t data)
699 {
700     int32_t ret = CheckParamIsNull(buf, offSet);
701     if (ret != SOFTBUS_OK) {
702         return ret;
703     }
704     if (dataLen < *offSet + sizeof(data)) {
705         COMM_LOGE(COMM_UTILS, "write data is long than dataLen!");
706         return SOFTBUS_TRANS_INVALID_DATA_LENGTH;
707     }
708     *(buf + *offSet) = data;
709     *offSet += sizeof(data);
710     return SOFTBUS_OK;
711 }
712 
WriteStringToBuf(uint8_t * buf,uint32_t bufLen,int32_t * offSet,char * data,uint32_t dataLen)713 int32_t WriteStringToBuf(uint8_t *buf, uint32_t bufLen, int32_t *offSet, char *data, uint32_t dataLen)
714 {
715     if (data == NULL || dataLen == 0) {
716         COMM_LOGE(COMM_UTILS, "param data is NULL");
717         return SOFTBUS_INVALID_PARAM;
718     }
719 
720     int32_t ret = CheckParamIsNull(buf, offSet);
721     if (ret != SOFTBUS_OK) {
722         return ret;
723     }
724 
725     if (bufLen < *offSet + dataLen + sizeof(dataLen)) {
726         COMM_LOGE(COMM_UTILS, "write data is long than dataLen!");
727         return SOFTBUS_TRANS_INVALID_DATA_LENGTH;
728     }
729     *((uint32_t *)(buf + *offSet)) = dataLen;
730     *offSet += sizeof(dataLen);
731     if (memcpy_s(buf + *offSet, bufLen - *offSet, data, dataLen) != EOK) {
732         COMM_LOGE(COMM_UTILS, "data copy failed!");
733         return SOFTBUS_MEM_ERR;
734     }
735     *offSet += dataLen;
736     return SOFTBUS_OK;
737 }
738 
ReadInt32FromBuf(uint8_t * buf,uint32_t dataLen,int32_t * offSet,int32_t * data)739 int32_t ReadInt32FromBuf(uint8_t *buf, uint32_t dataLen, int32_t *offSet, int32_t *data)
740 {
741     int32_t ret = CheckParamIsNull(buf, offSet);
742     if (ret != SOFTBUS_OK) {
743         return ret;
744     }
745     if (data == NULL) {
746         COMM_LOGE(COMM_UTILS, "param data is NULL");
747         return SOFTBUS_INVALID_PARAM;
748     }
749     if (dataLen < *offSet + sizeof(*data)) {
750         COMM_LOGE(COMM_UTILS, "Read data is long than dataLen!");
751         return SOFTBUS_TRANS_INVALID_DATA_LENGTH;
752     }
753     *data = *((int32_t *)(buf + *offSet));
754     *offSet += sizeof(*data);
755     return SOFTBUS_OK;
756 }
757 
ReadUint64FromBuf(uint8_t * buf,uint32_t dataLen,int32_t * offSet,uint64_t * data)758 int32_t ReadUint64FromBuf(uint8_t *buf, uint32_t dataLen, int32_t *offSet, uint64_t *data)
759 {
760     int32_t ret = CheckParamIsNull(buf, offSet);
761     if (ret != SOFTBUS_OK) {
762         return ret;
763     }
764     if (data == NULL) {
765         COMM_LOGE(COMM_UTILS, "param data is NULL");
766         return SOFTBUS_INVALID_PARAM;
767     }
768     if (dataLen < *offSet + sizeof(*data)) {
769         COMM_LOGE(COMM_UTILS, "Read data is long than dataLen!");
770         return SOFTBUS_TRANS_INVALID_DATA_LENGTH;
771     }
772     *data = *((uint64_t *)(buf + *offSet));
773     *offSet += sizeof(*data);
774     return SOFTBUS_OK;
775 }
776 
ReadUint8FromBuf(uint8_t * buf,uint32_t dataLen,int32_t * offSet,uint8_t * data)777 int32_t ReadUint8FromBuf(uint8_t *buf, uint32_t dataLen, int32_t *offSet, uint8_t *data)
778 {
779     int32_t ret = CheckParamIsNull(buf, offSet);
780     if (ret != SOFTBUS_OK) {
781         return ret;
782     }
783     if (data == NULL) {
784         COMM_LOGE(COMM_UTILS, "param data is NULL");
785         return SOFTBUS_INVALID_PARAM;
786     }
787     if (dataLen < *offSet + sizeof(*data)) {
788         COMM_LOGE(COMM_UTILS, "Read data is long than dataLen!");
789         return SOFTBUS_TRANS_INVALID_DATA_LENGTH;
790     }
791     *data = *(buf + *offSet);
792     *offSet += sizeof(*data);
793     return SOFTBUS_OK;
794 }
795 
ReadStringLenFormBuf(uint8_t * buf,uint32_t bufLen,int32_t * offSet,uint32_t * len)796 int32_t ReadStringLenFormBuf(uint8_t *buf, uint32_t bufLen, int32_t *offSet, uint32_t *len)
797 {
798     int32_t ret = CheckParamIsNull(buf, offSet);
799     if (ret != SOFTBUS_OK) {
800         return ret;
801     }
802     if (len == NULL) {
803         COMM_LOGE(COMM_UTILS, "param len is NULL");
804         return SOFTBUS_INVALID_PARAM;
805     }
806     if (bufLen < *offSet + sizeof(uint32_t)) {
807         COMM_LOGE(COMM_UTILS, "Read string len is long than bufLen!");
808         return SOFTBUS_TRANS_INVALID_DATA_LENGTH;
809     }
810     *len = *((uint32_t *)(buf + *offSet));
811     return SOFTBUS_OK;
812 }
813 
ReadStringFromBuf(uint8_t * buf,uint32_t bufLen,int32_t * offSet,char * data,uint32_t dataLen)814 int32_t ReadStringFromBuf(uint8_t *buf, uint32_t bufLen, int32_t *offSet, char *data, uint32_t dataLen)
815 {
816     int32_t ret = CheckParamIsNull(buf, offSet);
817     if (ret != SOFTBUS_OK) {
818         return ret;
819     }
820     if (data == NULL) {
821         COMM_LOGE(COMM_UTILS, "param data is NULL");
822         return SOFTBUS_INVALID_PARAM;
823     }
824     if (bufLen < *offSet + sizeof(uint32_t)) {
825         COMM_LOGE(COMM_UTILS, "Read data is long than bufLen!");
826         return SOFTBUS_TRANS_INVALID_DATA_LENGTH;
827     }
828     uint32_t inDataLen = *((uint32_t *)(buf + *offSet));
829     *offSet += sizeof(uint32_t);
830     if (bufLen < *offSet + inDataLen) {
831         COMM_LOGE(COMM_UTILS, "Read data is long than bufLen!");
832         return SOFTBUS_TRANS_INVALID_DATA_LENGTH;
833     }
834     if (inDataLen > dataLen) {
835         COMM_LOGE(COMM_UTILS, "string data is long than datalen!");
836         return SOFTBUS_TRANS_INVALID_DATA_LENGTH;
837     }
838     if (memcpy_s(data, dataLen, buf + *offSet, inDataLen) != EOK) {
839         COMM_LOGE(COMM_UTILS, "data copy failed!");
840         return SOFTBUS_MEM_ERR;
841     }
842     *offSet += inDataLen;
843     return SOFTBUS_OK;
844 }
845 
EnableCapabilityBit(uint32_t * value,uint32_t offSet)846 void EnableCapabilityBit(uint32_t *value, uint32_t offSet)
847 {
848     if (value == NULL) {
849         COMM_LOGE(COMM_UTILS, "invalid param");
850         return;
851     }
852     *value |= (1 << offSet);
853 }
854 
DisableCapabilityBit(uint32_t * value,uint32_t offSet)855 void DisableCapabilityBit(uint32_t *value, uint32_t offSet)
856 {
857     if (value == NULL) {
858         COMM_LOGE(COMM_UTILS, "invalid param");
859         return;
860     }
861     *value &= ~(1 << offSet);
862 }
863 
GetCapabilityBit(uint32_t value,uint32_t offSet)864 bool GetCapabilityBit(uint32_t value, uint32_t offSet)
865 {
866     return (bool)((value >> offSet) & 0x1);
867 }
868 
SetLocale(char ** localeBefore)869 static int32_t SetLocale(char **localeBefore)
870 {
871     *localeBefore = setlocale(LC_CTYPE, NULL);
872     if (*localeBefore == NULL) {
873         COMM_LOGW(COMM_UTILS, "get locale failed");
874     }
875 
876     char *localeAfter = setlocale(LC_CTYPE, "C.UTF-8");
877     return (localeAfter != NULL) ? SOFTBUS_OK : SOFTBUS_DISCOVER_SET_LOCALE_FAILED;
878 }
879 
RestoreLocale(const char * localeBefore)880 static void RestoreLocale(const char *localeBefore)
881 {
882     if (setlocale(LC_CTYPE, localeBefore) == NULL) {
883         COMM_LOGW(COMM_UTILS, "restore locale failed");
884     }
885 }
886 
887 // Calculate the truncated length in wide characters, ensuring that the truncation is performed in wide character
CalculateMbsTruncateSize(const char * multiByteStr,uint32_t capacity,uint32_t * truncatedSize)888 int32_t CalculateMbsTruncateSize(const char *multiByteStr, uint32_t capacity, uint32_t *truncatedSize)
889 {
890     size_t multiByteStrLen = strlen(multiByteStr);
891     if (multiByteStrLen == 0) {
892         *truncatedSize = 0;
893         return SOFTBUS_OK;
894     }
895     if (multiByteStrLen > WIDE_STR_MAX_LEN) {
896         COMM_LOGE(COMM_UTILS, "multi byte str too long: %{public}zu", multiByteStrLen);
897         return SOFTBUS_INVALID_PARAM;
898     }
899 
900     char *localeBefore = NULL;
901     int32_t ret = SetLocale(&localeBefore);
902     if (ret != SOFTBUS_OK) {
903         COMM_LOGE(COMM_UTILS, "set locale failed");
904         return ret;
905     }
906 
907     // convert multi byte str to wide str
908     wchar_t wideStr[WIDE_STR_MAX_LEN] = {0};
909     size_t numConverted = mbstowcs(wideStr, multiByteStr, multiByteStrLen);
910     if (numConverted == 0 || numConverted > multiByteStrLen) {
911         COMM_LOGE(COMM_UTILS, "mbstowcs failed");
912         RestoreLocale(localeBefore);
913         return SOFTBUS_DISCOVER_CHAR_CONVERT_FAILED;
914     }
915 
916     // truncate wide str until <= capacity
917     uint32_t truncateTotal = 0;
918     int32_t truncateIndex = (int32_t)numConverted - 1;
919     char multiByteChar[WIDE_CHAR_MAX_LEN] = {0};
920     while (capacity < multiByteStrLen - truncateTotal && truncateIndex >= 0) {
921         int32_t truncateCharLen = wctomb(multiByteChar, wideStr[truncateIndex]);
922         if (truncateCharLen <= 0) {
923             COMM_LOGE(COMM_UTILS, "wctomb failed on w_char. truncateIndex=%{public}d", truncateIndex);
924             RestoreLocale(localeBefore);
925             return SOFTBUS_DISCOVER_CHAR_CONVERT_FAILED;
926         }
927         truncateTotal += (uint32_t)truncateCharLen;
928         truncateIndex--;
929     }
930 
931     *truncatedSize = (multiByteStrLen >= truncateTotal) ? (multiByteStrLen - truncateTotal) : 0;
932     RestoreLocale(localeBefore);
933     return SOFTBUS_OK;
934 }
935 
936 #define SOFTBUS_DUMP_BYTES_MAX_LEN (256)
SoftbusDumpBytes(const char * message,const uint8_t * data,uint32_t dataLen)937 void SoftbusDumpBytes(const char *message, const uint8_t *data, uint32_t dataLen)
938 {
939     COMM_CHECK_AND_RETURN_LOGE(message, COMM_UTILS, "message is null");
940     COMM_CHECK_AND_RETURN_LOGE(data, COMM_UTILS, "data is null");
941     COMM_CHECK_AND_RETURN_LOGE(dataLen != 0, COMM_UTILS, "data len is 0");
942     COMM_CHECK_AND_RETURN_LOGE(
943         dataLen <= SOFTBUS_DUMP_BYTES_MAX_LEN, COMM_UTILS, "data len=%{public}u is too large", dataLen);
944     uint16_t hexLen = HEXIFY_LEN(dataLen);
945     char *hex = SoftBusCalloc(hexLen);
946     if (hex == NULL) {
947         COMM_LOGE(COMM_UTILS, "malloc hex fail");
948         return;
949     }
950     int32_t ret = ConvertBytesToHexString(hex, hexLen, data, dataLen);
951     if (ret != SOFTBUS_OK) {
952         COMM_LOGE(COMM_UTILS, "convert to hex string error=%{public}d", ret);
953         SoftBusFree(hex);
954         return;
955     }
956     COMM_LOGI(COMM_UTILS, "%{public}s dump %{public}u bytes: %{public}s", message, dataLen, hex);
957     SoftBusFree(hex);
958 }
959 
AddNumberToSocketName(uint32_t num,const char * prefix,uint32_t preLen,char * socketName)960 int32_t AddNumberToSocketName(uint32_t num, const char *prefix, uint32_t preLen, char *socketName)
961 {
962     if (prefix == NULL || socketName == NULL || preLen > (SESSION_NAME_SIZE_MAX - INT_TO_STRING_MAX_LEN)) {
963         COMM_LOGE(COMM_UTILS, "invalid param!");
964         return SOFTBUS_INVALID_PARAM;
965     }
966     if (strcpy_s(socketName, preLen, prefix) != EOK) {
967         COMM_LOGE(COMM_UTILS, "copy socketName prefix failed!");
968         return SOFTBUS_STRCPY_ERR;
969     }
970     char numStr[INT_TO_STRING_MAX_LEN];
971     if (sprintf_s(numStr, INT_TO_STRING_MAX_LEN, "%u", num) < 0) {
972         COMM_LOGE(COMM_UTILS, "sprintf_s fail!");
973         return SOFTBUS_SPRINTF_ERR;
974     }
975     if (strcat_s(socketName, INT_TO_STRING_MAX_LEN, numStr) != EOK) {
976         COMM_LOGE(COMM_UTILS, "strcat_s fail!");
977         return SOFTBUS_SPRINTF_ERR;
978     }
979     return SOFTBUS_OK;
980 }