• 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 
59 #define ONE_BYTE_SIZE 8
60 
61 #ifdef SOFTBUS_STANDARD_OS
62 static int32_t *g_timerHandle = NULL;
63 #else
64 static void *g_timerId = NULL;
65 #endif
66 static TimerFunCallback g_timerFunList[SOFTBUS_MAX_TIMER_FUN_NUM] = {0};
67 static bool g_signalingMsgSwitch = false;
68 
CreateSoftBusList(void)69 SoftBusList *CreateSoftBusList(void)
70 {
71     SoftBusList *list = (SoftBusList *)SoftBusMalloc(sizeof(SoftBusList));
72     if (list == NULL) {
73         COMM_LOGE(COMM_UTILS, "malloc failed");
74         return NULL;
75     }
76     (void)memset_s(list, sizeof(SoftBusList), 0, sizeof(SoftBusList));
77 
78     SoftBusMutexAttr mutexAttr;
79     mutexAttr.type = SOFTBUS_MUTEX_RECURSIVE;
80     if (SoftBusMutexInit(&list->lock, &mutexAttr) != SOFTBUS_OK) {
81         COMM_LOGE(COMM_UTILS, "init lock failed");
82         SoftBusFree(list);
83         return NULL;
84     }
85     ListInit(&list->list);
86     return list;
87 }
88 
DestroySoftBusList(SoftBusList * list)89 void DestroySoftBusList(SoftBusList *list)
90 {
91     if (list == NULL) {
92         COMM_LOGE(COMM_UTILS, "list is null");
93         return;
94     }
95     ListDelInit(&list->list);
96     SoftBusMutexDestroy(&list->lock);
97     SoftBusFree(list);
98     return;
99 }
100 
RegisterTimeoutCallback(int32_t timerFunId,TimerFunCallback callback)101 int32_t RegisterTimeoutCallback(int32_t timerFunId, TimerFunCallback callback)
102 {
103     if (callback == NULL || timerFunId >= SOFTBUS_MAX_TIMER_FUN_NUM ||
104         timerFunId < SOFTBUS_CONN_TIMER_FUN) {
105         COMM_LOGE(COMM_UTILS, "invalid param");
106         return SOFTBUS_ERR;
107     }
108     if (g_timerFunList[timerFunId] != NULL) {
109         return SOFTBUS_OK;
110     }
111     g_timerFunList[timerFunId] = callback;
112     return SOFTBUS_OK;
113 }
114 
HandleTimeoutFun(void)115 static void HandleTimeoutFun(void)
116 {
117     int32_t i;
118     for (i = 0; i < SOFTBUS_MAX_TIMER_FUN_NUM; i++) {
119         if (g_timerFunList[i] != NULL) {
120             g_timerFunList[i]();
121         }
122     }
123 }
124 
SoftBusTimerInit(void)125 int32_t SoftBusTimerInit(void)
126 {
127 #ifdef SOFTBUS_STANDARD_OS
128     if (g_timerHandle != NULL) {
129         return SOFTBUS_OK;
130     }
131     SetTimerFunc(HandleTimeoutFun);
132     g_timerHandle = (int32_t *)SoftBusCalloc(sizeof(int32_t));
133     if (g_timerHandle == NULL) {
134         COMM_LOGE(COMM_UTILS, "timerHandle calloc fail");
135         return SOFTBUS_MALLOC_ERR;
136     }
137     int32_t ret = SoftBusStartTimerWithFfrt(g_timerHandle, TIMER_TIMEOUT, true);
138     if (ret != SOFTBUS_OK) {
139         SoftBusFree(g_timerHandle);
140         g_timerHandle = NULL;
141         COMM_LOGE(COMM_UTILS, "softbus timer init fail, ret=%{public}d", ret);
142     }
143     return ret;
144 #else
145     if (g_timerId != NULL) {
146         return SOFTBUS_OK;
147     }
148     SetTimerFunc(HandleTimeoutFun);
149     g_timerId = SoftBusCreateTimer(&g_timerId, TIMER_TYPE_PERIOD);
150     if (SoftBusStartTimer(g_timerId, TIMER_TIMEOUT) != SOFTBUS_OK) {
151         COMM_LOGE(COMM_UTILS, "start timer failed.");
152         (void)SoftBusDeleteTimer(g_timerId);
153         g_timerId = NULL;
154         return SOFTBUS_ERR;
155     }
156     return SOFTBUS_OK;
157 #endif
158 }
159 
SoftBusTimerDeInit(void)160 void SoftBusTimerDeInit(void)
161 {
162 #ifdef SOFTBUS_STANDARD_OS
163     if (g_timerHandle != NULL) {
164         SoftBusStopTimerWithFfrt(*g_timerHandle);
165         SoftBusFree(g_timerHandle);
166         g_timerHandle = NULL;
167     }
168     return;
169 #else
170     if (g_timerId != NULL) {
171         (void)SoftBusDeleteTimer(g_timerId);
172         g_timerId = NULL;
173     }
174 #endif
175 }
176 
ConvertBytesToUpperCaseHexString(char * outBuf,uint32_t outBufLen,const unsigned char * inBuf,uint32_t inLen)177 int32_t ConvertBytesToUpperCaseHexString(char *outBuf, uint32_t outBufLen, const unsigned char * inBuf,
178     uint32_t inLen)
179 {
180     if ((outBuf == NULL) || (inBuf == NULL) || (outBufLen < HEXIFY_LEN(inLen))) {
181         COMM_LOGE(COMM_UTILS, "invalid param, inlen=%{public}u, outBufLen=%{public}u", inLen, outBufLen);
182         return SOFTBUS_ERR;
183     }
184 
185     while (inLen > 0) {
186         unsigned char h = *inBuf / HEX_MAX_NUM;
187         unsigned char l = *inBuf % HEX_MAX_NUM;
188         if (h < DEC_MAX_NUM) {
189             *outBuf++ = '0' + h;
190         } else {
191             *outBuf++ = 'A' + h - DEC_MAX_NUM;
192         }
193         if (l < DEC_MAX_NUM) {
194             *outBuf++ = '0' + l;
195         } else {
196             *outBuf++ = 'A' + l - DEC_MAX_NUM;
197         }
198         ++inBuf;
199         inLen--;
200     }
201     return SOFTBUS_OK;
202 }
203 
ConvertHexStringToBytes(unsigned char * outBuf,uint32_t outBufLen,const char * inBuf,uint32_t inLen)204 int32_t ConvertHexStringToBytes(unsigned char *outBuf, uint32_t outBufLen, const char *inBuf,
205     uint32_t inLen)
206 {
207     if ((outBuf == NULL) || (inBuf == NULL) || (inLen % HEXIFY_UNIT_LEN != 0)) {
208         COMM_LOGE(COMM_UTILS, "invalid param");
209         return SOFTBUS_INVALID_PARAM;
210     }
211 
212     uint32_t outLen = UN_HEXIFY_LEN(inLen);
213     if (outLen > outBufLen) {
214         COMM_LOGE(COMM_UTILS, "outLen > outBufLen");
215         return SOFTBUS_ERR;
216     }
217     uint32_t i = 0;
218     while (i < outLen) {
219         unsigned char c = *inBuf++;
220         if ((c >= '0') && (c <= '9')) {
221             c -= '0';
222         } else if ((c >= 'a') && (c <= 'f')) {
223             c -= 'a' - DEC_MAX_NUM;
224         } else if ((c >= 'A') && (c <= 'F')) {
225             c -= 'A' - DEC_MAX_NUM;
226         } else {
227             COMM_LOGE(COMM_UTILS, "HexToString Error! inBuf=%{public}c", c);
228             return SOFTBUS_ERR;
229         }
230         unsigned char c2 = *inBuf++;
231         if ((c2 >= '0') && (c2 <= '9')) {
232             c2 -= '0';
233         } else if ((c2 >= 'a') && (c2 <= 'f')) {
234             c2 -= 'a' - DEC_MAX_NUM;
235         } else if ((c2 >= 'A') && (c2 <= 'F')) {
236             c2 -= 'A' - DEC_MAX_NUM;
237         } else {
238             COMM_LOGE(COMM_UTILS, "HexToString Error! inBuf2=%{public}c", c2);
239             return SOFTBUS_ERR;
240         }
241         *outBuf++ = (c << HEX_MAX_BIT_NUM) | c2;
242         i++;
243     }
244     return SOFTBUS_OK;
245 }
246 
ConvertBytesToHexString(char * outBuf,uint32_t outBufLen,const unsigned char * inBuf,uint32_t inLen)247 int32_t ConvertBytesToHexString(char *outBuf, uint32_t outBufLen, const unsigned char *inBuf,
248     uint32_t inLen)
249 {
250     if ((outBuf == NULL) || (inBuf == NULL) || (outBufLen < HEXIFY_LEN(inLen))) {
251         COMM_LOGD(COMM_UTILS, "outBufLen=%{public}d, inLen=%{public}d", outBufLen, inLen);
252         return SOFTBUS_ERR;
253     }
254 
255     while (inLen > 0) {
256         unsigned char h = *inBuf / HEX_MAX_NUM;
257         unsigned char l = *inBuf % HEX_MAX_NUM;
258         if (h < DEC_MAX_NUM) {
259             *outBuf++ = '0' + h;
260         } else {
261             *outBuf++ = 'a' + h - DEC_MAX_NUM;
262         }
263         if (l < DEC_MAX_NUM) {
264             *outBuf++ = '0' + l;
265         } else {
266             *outBuf++ = 'a' + l - DEC_MAX_NUM;
267         }
268         ++inBuf;
269         inLen--;
270     }
271     return SOFTBUS_OK;
272 }
273 
GenerateRandomStr(char * str,uint32_t len)274 int32_t GenerateRandomStr(char *str, uint32_t len)
275 {
276     if ((str == NULL) ||  (len < HEXIFY_UNIT_LEN)) {
277         return SOFTBUS_INVALID_PARAM;
278     }
279 
280     uint32_t hexLen = len / HEXIFY_UNIT_LEN;
281     unsigned char *hexAuthId = (unsigned char *)SoftBusMalloc(hexLen);
282     if (hexAuthId == NULL) {
283         return SOFTBUS_MEM_ERR;
284     }
285     (void)memset_s(hexAuthId, hexLen, 0, hexLen);
286     if (SoftBusGenerateRandomArray(hexAuthId, hexLen) != SOFTBUS_OK) {
287         COMM_LOGE(COMM_UTILS, "Generate random array fail");
288         SoftBusFree(hexAuthId);
289         return SOFTBUS_ERR;
290     }
291     if (ConvertBytesToHexString(str, len, hexAuthId, hexLen) != SOFTBUS_OK) {
292         COMM_LOGE(COMM_UTILS, "Convert bytes to hexstring fail");
293         SoftBusFree(hexAuthId);
294         return SOFTBUS_ERR;
295     }
296     SoftBusFree(hexAuthId);
297     return SOFTBUS_OK;
298 }
299 
IsValidString(const char * input,uint32_t maxLen)300 bool IsValidString(const char *input, uint32_t maxLen)
301 {
302     if (input == NULL) {
303         COMM_LOGE(COMM_UTILS, "input is null");
304         return false;
305     }
306     uint32_t len = strlen(input);
307     if (len == 0 || len > maxLen) {
308         return false;
309     }
310     return true;
311 }
312 
ConvertBtMacToBinary(const char * strMac,uint32_t strMacLen,uint8_t * binMac,uint32_t binMacLen)313 int32_t ConvertBtMacToBinary(const char *strMac, uint32_t strMacLen, uint8_t *binMac,
314     uint32_t binMacLen)
315 {
316     const char *invalidAddr = "00:00:00:00:00:00";
317     if (strMac == NULL || strMacLen < BT_MAC_LEN || binMac == NULL || binMacLen < BT_ADDR_LEN ||
318         strncmp(strMac, invalidAddr, BT_MAC_LEN) == 0) {
319         COMM_LOGE(COMM_UTILS, "invalid param");
320         return SOFTBUS_INVALID_PARAM;
321     }
322     char *tmpMac = (char *)SoftBusMalloc(strMacLen * sizeof(char));
323     if (tmpMac == NULL) {
324         COMM_LOGE(COMM_UTILS, "tmpMac is null");
325         return SOFTBUS_MALLOC_ERR;
326     }
327     if (memcpy_s(tmpMac, strMacLen, strMac, strMacLen) != EOK) {
328         COMM_LOGE(COMM_UTILS, "memcpy tmpMac fail");
329         SoftBusFree(tmpMac);
330         return SOFTBUS_MEM_ERR;
331     }
332     char *nextTokenPtr = NULL;
333     char *token = strtok_r((char *)tmpMac, BT_ADDR_DELIMITER, &nextTokenPtr);
334     char *endptr = NULL;
335     for (int i = 0; i < BT_ADDR_LEN; i++) {
336         if (token == NULL) {
337             SoftBusFree(tmpMac);
338             return SOFTBUS_ERR;
339         }
340         binMac[i] = strtoul(token, &endptr, BT_ADDR_BASE);
341         token = strtok_r(NULL, BT_ADDR_DELIMITER, &nextTokenPtr);
342     }
343     SoftBusFree(tmpMac);
344     return SOFTBUS_OK;
345 }
346 
ConvertBtMacToStrNoColon(char * strMac,uint32_t strMacLen,const uint8_t * binMac,uint32_t binMacLen)347 int32_t ConvertBtMacToStrNoColon(char *strMac, uint32_t strMacLen, const uint8_t *binMac,
348     uint32_t binMacLen)
349 {
350     int32_t ret;
351 
352     if (strMac == NULL || strMacLen < BT_MAC_NO_COLON_LEN || binMac == NULL || binMacLen < BT_ADDR_LEN) {
353         COMM_LOGE(COMM_UTILS, "invalid param");
354         return SOFTBUS_INVALID_PARAM;
355     }
356     ret = snprintf_s(strMac, strMacLen, strMacLen - 1, "%02x%02x%02x%02x%02x%02x",
357         binMac[MAC_BIT_ZERO], binMac[MAC_BIT_ONE], binMac[MAC_BIT_TWO],
358         binMac[MAC_BIT_THREE], binMac[MAC_BIT_FOUR], binMac[MAC_BIT_FIVE]);
359     if (ret < 0) {
360         COMM_LOGE(COMM_UTILS, "snprintf_s fail");
361         return SOFTBUS_ERR;
362     }
363     return SOFTBUS_OK;
364 }
365 
ConvertBtMacToStr(char * strMac,uint32_t strMacLen,const uint8_t * binMac,uint32_t binMacLen)366 int32_t ConvertBtMacToStr(char *strMac, uint32_t strMacLen, const uint8_t *binMac,
367     uint32_t binMacLen)
368 {
369     int32_t ret;
370 
371     if (strMac == NULL || strMacLen < BT_MAC_LEN || binMac == NULL || binMacLen < BT_ADDR_LEN) {
372         COMM_LOGE(COMM_UTILS, "invalid param");
373         return SOFTBUS_INVALID_PARAM;
374     }
375     ret = snprintf_s(strMac, strMacLen, strMacLen - 1, "%02x:%02x:%02x:%02x:%02x:%02x",
376         binMac[MAC_BIT_ZERO], binMac[MAC_BIT_ONE], binMac[MAC_BIT_TWO],
377         binMac[MAC_BIT_THREE], binMac[MAC_BIT_FOUR], binMac[MAC_BIT_FIVE]);
378     if (ret < 0) {
379         COMM_LOGE(COMM_UTILS, "snprintf_s fail");
380         return SOFTBUS_ERR;
381     }
382     return SOFTBUS_OK;
383 }
384 
ConvertReverseBtMacToStr(char * strMac,uint32_t strMacLen,const uint8_t * binMac,uint32_t binMacLen)385 int32_t ConvertReverseBtMacToStr(char *strMac, uint32_t strMacLen, const uint8_t *binMac, uint32_t binMacLen)
386 {
387     int32_t ret;
388     if (strMac == NULL || strMacLen < BT_MAC_LEN || binMac == NULL || binMacLen < BT_ADDR_LEN) {
389         return SOFTBUS_INVALID_PARAM;
390     }
391     ret = snprintf_s(strMac, strMacLen, strMacLen - 1, "%02x:%02x:%02x:%02x:%02x:%02x",
392         binMac[MAC_BIT_FIVE], binMac[MAC_BIT_FOUR], binMac[MAC_BIT_THREE],
393         binMac[MAC_BIT_TWO], binMac[MAC_BIT_ONE], binMac[MAC_BIT_ZERO]);
394     if (ret < 0) {
395         return SOFTBUS_ERR;
396     }
397     return SOFTBUS_OK;
398 }
399 
ConvertBtMacToU64(const char * strMac,uint32_t strMacLen,uint64_t * u64Mac)400 int32_t ConvertBtMacToU64(const char *strMac, uint32_t strMacLen, uint64_t *u64Mac)
401 {
402     if (strMac == NULL || strMacLen < BT_MAC_LEN || u64Mac == NULL) {
403         COMM_LOGE(COMM_UTILS, "invalid param");
404         return SOFTBUS_INVALID_PARAM;
405     }
406     uint8_t binaryAddr[BT_ADDR_LEN] = { 0 };
407     int32_t status = ConvertBtMacToBinary(strMac, BT_MAC_LEN, binaryAddr, BT_ADDR_LEN);
408     if (status != SOFTBUS_OK) {
409         COMM_LOGE(COMM_UTILS, "Convert btMac to binary fail");
410         return SOFTBUS_ERR;
411     }
412     uint64_t u64Value = 0;
413     for (int i = 0; i < BT_ADDR_LEN; i++) {
414         u64Value = (u64Value << ONE_BYTE_SIZE) | binaryAddr[i];
415     }
416     *u64Mac = u64Value;
417     return SOFTBUS_OK;
418 }
419 
ConvertU64MacToStr(uint64_t u64Mac,char * strMac,uint32_t strMacLen)420 int32_t ConvertU64MacToStr(uint64_t u64Mac, char *strMac, uint32_t strMacLen)
421 {
422     if (strMac == NULL || strMacLen < BT_MAC_LEN || u64Mac == 0) {
423         return SOFTBUS_INVALID_PARAM;
424     }
425     uint8_t binaryAddr[BT_ADDR_LEN] = { 0 };
426     for (int i = BT_ADDR_LEN - 1; i >= 0; i--) {
427         binaryAddr[i] = u64Mac & 0xFF;
428         u64Mac = u64Mac >> ONE_BYTE_SIZE;
429     }
430     return ConvertBtMacToStr(strMac, strMacLen, binaryAddr, BT_ADDR_LEN);
431 }
ToUpperCase(char ch)432 static char ToUpperCase(char ch)
433 {
434     if (ch >= 'a' && ch <= 'z') {
435         return ch - 'a' + 'A';
436     }
437     return ch;
438 }
439 
ToLowerCase(char ch)440 static char ToLowerCase(char ch)
441 {
442     if (ch >= 'A' && ch <= 'Z') {
443         return ch - 'A' + 'a';
444     }
445     return ch;
446 }
447 
StringToUpperCase(const char * str,char * buf,int32_t size)448 int32_t StringToUpperCase(const char *str, char *buf, int32_t size)
449 {
450     if (str == NULL || buf == NULL) {
451         return SOFTBUS_ERR;
452     }
453     memset_s(buf, size, 0, size);
454     int32_t i;
455     for (i = 0; str[i] != '\0'; i++) {
456         buf[i] = ToUpperCase(str[i]);
457     }
458     return SOFTBUS_OK;
459 }
460 
StringToLowerCase(const char * str,char * buf,int32_t size)461 int32_t StringToLowerCase(const char *str, char *buf, int32_t size)
462 {
463     if (str == NULL || buf == NULL) {
464         return SOFTBUS_ERR;
465     }
466     memset_s(buf, size, 0, size);
467     int32_t i;
468     for (i = 0; str[i] != '\0'; i++) {
469         buf[i] = ToLowerCase(str[i]);
470     }
471     return SOFTBUS_OK;
472 }
473 
Int64ToString(int64_t src,char * buf,uint32_t bufLen)474 bool Int64ToString(int64_t src, char *buf, uint32_t bufLen)
475 {
476     if (buf == NULL) {
477         return false;
478     }
479     if (sprintf_s(buf, bufLen, "%" PRId64"", src) < 0) {
480         COMM_LOGE(COMM_UTILS, "convert int64 to str fail");
481         return false;
482     }
483     return true;
484 }
485 
StrCmpIgnoreCase(const char * str1,const char * str2)486 int32_t StrCmpIgnoreCase(const char *str1, const char *str2)
487 {
488     if (str1 == NULL || str2 == NULL) {
489         COMM_LOGD(COMM_UTILS, "invalid param");
490         return SOFTBUS_ERR;
491     }
492     int32_t i;
493     for (i = 0; str1[i] != '\0' && str2[i] != '\0'; i++) {
494         if (ToUpperCase(str1[i]) != ToUpperCase(str2[i])) {
495             return SOFTBUS_ERR;
496         }
497     }
498     if (str1[i] != '\0' || str2[i] != '\0') {
499         return SOFTBUS_ERR;
500     }
501     return SOFTBUS_OK;
502 }
503 
SetSignalingMsgSwitchOn(void)504 void SetSignalingMsgSwitchOn(void)
505 {
506     g_signalingMsgSwitch = true;
507 }
508 
SetSignalingMsgSwitchOff(void)509 void SetSignalingMsgSwitchOff(void)
510 {
511     g_signalingMsgSwitch = false;
512 }
513 
GetSignalingMsgSwitch(void)514 bool GetSignalingMsgSwitch(void)
515 {
516     return g_signalingMsgSwitch;
517 }
518 
SignalingMsgPrint(const char * distinguish,unsigned char * data,unsigned char dataLen,uint32_t module)519 void SignalingMsgPrint(const char *distinguish, unsigned char *data, unsigned char dataLen, uint32_t module)
520 {
521     int ret = 0;
522     char signalingMsgBuf[BUF_HEX_LEN] = {0};
523 
524     if (!GetSignalingMsgSwitch()) {
525         return;
526     }
527     if (dataLen >= BUF_BYTE_LEN) {
528         ret = ConvertBytesToHexString(signalingMsgBuf, BUF_HEX_LEN + OFFSET, data, BUF_BYTE_LEN);
529     } else {
530         ret = ConvertBytesToHexString(signalingMsgBuf, BUF_HEX_LEN + OFFSET, data, dataLen);
531     }
532     if (ret != SOFTBUS_OK) {
533         COMM_LOGE(COMM_UTILS, "intercept signaling msg failed");
534         return;
535     }
536 }
537 
MacInstead(char * data,uint32_t length,char delimiter)538 void MacInstead(char *data, uint32_t length, char delimiter)
539 {
540     if (length > MAX_MAC_LEN) {
541         COMM_LOGE(COMM_UTILS, "MacInstead len is invalid");
542         return;
543     }
544     int delimiterCnt = 0;
545     for (uint32_t i = 0; i < length; i++) {
546         if (delimiterCnt == MAC_DELIMITER_FOURTH) {
547             break;
548         }
549         if (data[i] == delimiter) {
550             delimiterCnt++;
551         }
552         if (delimiterCnt >= MAC_DELIMITER_SECOND && data[i] != delimiter) {
553             data[i] = '*';
554         }
555     }
556 }
557 
IpInstead(char * data,uint32_t length,char delimiter)558 void IpInstead(char *data, uint32_t length, char delimiter)
559 {
560     if (length > MAX_IP_LEN) {
561         COMM_LOGE(COMM_UTILS, "IpInstead len is invalid");
562         return;
563     }
564     int delimiterCnt = 0;
565     for (uint32_t i = 0; i < length; i++) {
566         if (delimiterCnt == IP_DELIMITER_THIRD) {
567             break;
568         }
569         if (data[i] == delimiter) {
570             delimiterCnt++;
571         }
572         if (delimiterCnt >= IP_DELIMITER_FIRST && data[i] != delimiter) {
573             data[i] = '*';
574         }
575     }
576 }
577 
IdInstead(char * data,uint32_t length)578 void IdInstead(char *data, uint32_t length)
579 {
580     if (length < 1 || length > MAX_ID_LEN) {
581         COMM_LOGE(COMM_UTILS, "IdInstead len is invalid");
582         return;
583     }
584     uint32_t halfLen = length / GET_ID_HALF_LEN;
585     for (uint32_t i = 0; i < length - 1; i++) {
586         if (i > halfLen) {
587             data[i] = '*';
588         }
589     }
590 }
591 
DataMasking(const char * data,uint32_t length,char delimiter,char * container)592 void DataMasking(const char *data, uint32_t length, char delimiter, char *container)
593 {
594     if (data == NULL) {
595         COMM_LOGE(COMM_UTILS, "invalid param");
596         return;
597     }
598     if (memcpy_s(container, length, data, length) != EOK) {
599         COMM_LOGE(COMM_UTILS, "container memcpy_s failed");
600         return;
601     }
602     switch (delimiter) {
603         case MAC_DELIMITER:
604             MacInstead(container, length, delimiter);
605             break;
606         case IP_DELIMITER:
607             IpInstead(container, length, delimiter);
608             break;
609         case ID_DELIMITER:
610             IdInstead(container, length);
611             break;
612         default:
613             break;
614     }
615 }
616 
GenerateStrHashAndConvertToHexString(const unsigned char * str,uint32_t len,unsigned char * hashStr,uint32_t hashStrLen)617 int32_t GenerateStrHashAndConvertToHexString(const unsigned char *str, uint32_t len,
618     unsigned char *hashStr, uint32_t hashStrLen)
619 {
620     int32_t ret;
621     unsigned char hashResult[SHA_256_HASH_LEN] = {0};
622     if (hashStrLen < HEXIFY_LEN(len / HEXIFY_UNIT_LEN)) {
623         COMM_LOGE(COMM_UTILS, "generate str hash invalid hashStrLen");
624         return SOFTBUS_INVALID_PARAM;
625     }
626     if (str == NULL) {
627         COMM_LOGE(COMM_UTILS, "generate str hash invalid param");
628         return SOFTBUS_INVALID_PARAM;
629     }
630     ret = SoftBusGenerateStrHash(str, strlen((char *)str), hashResult);
631     if (ret != SOFTBUS_OK) {
632         COMM_LOGE(COMM_UTILS, "generate str hash fail, ret=%{public}d", ret);
633         return ret;
634     }
635     ret = ConvertBytesToHexString((char *)hashStr, hashStrLen, (const unsigned char *)hashResult,
636         len / HEXIFY_UNIT_LEN);
637     if (ret != SOFTBUS_OK) {
638         COMM_LOGE(COMM_UTILS, "convert bytes to str hash fail, ret=%{public}d", ret);
639         return ret;
640     }
641     return SOFTBUS_OK;
642 }
643 
checkParamIsNull(uint8_t * buf,int32_t * offSet)644 static int32_t checkParamIsNull(uint8_t *buf, int32_t *offSet)
645 {
646     if (buf == NULL) {
647         COMM_LOGE(COMM_UTILS, "param buf is NULL");
648         return SOFTBUS_INVALID_PARAM;
649     }
650     if (offSet == NULL) {
651         COMM_LOGE(COMM_UTILS, "param offSet is NULL");
652         return SOFTBUS_INVALID_PARAM;
653     }
654     return SOFTBUS_OK;
655 }
656 
WriteInt32ToBuf(uint8_t * buf,uint32_t dataLen,int32_t * offSet,int32_t data)657 int32_t WriteInt32ToBuf(uint8_t *buf, uint32_t dataLen, int32_t *offSet, int32_t data)
658 {
659     int32_t ret = checkParamIsNull(buf, offSet);
660     if (ret != SOFTBUS_OK) {
661         return ret;
662     }
663     if (dataLen < *offSet + sizeof(data)) {
664         COMM_LOGE(COMM_UTILS, "write data is long than dataLen!");
665         return SOFTBUS_TRANS_INVALID_DATA_LENGTH;
666     }
667     *((int32_t *)(buf + *offSet)) = data;
668     *offSet += sizeof(data);
669     return SOFTBUS_OK;
670 }
671 
WriteUint8ToBuf(uint8_t * buf,uint32_t dataLen,int32_t * offSet,uint8_t data)672 int32_t WriteUint8ToBuf(uint8_t *buf, uint32_t dataLen, int32_t *offSet, uint8_t data)
673 {
674     int32_t ret = checkParamIsNull(buf, offSet);
675     if (ret != SOFTBUS_OK) {
676         return ret;
677     }
678     if (dataLen < *offSet + sizeof(data)) {
679         COMM_LOGE(COMM_UTILS, "write data is long than dataLen!");
680         return SOFTBUS_TRANS_INVALID_DATA_LENGTH;
681     }
682     *(buf + *offSet) = data;
683     *offSet += sizeof(data);
684     return SOFTBUS_OK;
685 }
686 
687 
ReadInt32FromBuf(uint8_t * buf,uint32_t dataLen,int32_t * offSet,int32_t * data)688 int32_t ReadInt32FromBuf(uint8_t *buf, uint32_t dataLen, int32_t *offSet, int32_t *data)
689 {
690     int32_t ret = checkParamIsNull(buf, offSet);
691     if (ret != SOFTBUS_OK) {
692         return ret;
693     }
694     if (data == NULL) {
695         COMM_LOGE(COMM_UTILS, "param data is NULL");
696         return SOFTBUS_INVALID_PARAM;
697     }
698     if (dataLen < *offSet + sizeof(*data)) {
699         COMM_LOGE(COMM_UTILS, "Read data is long than dataLen!");
700         return SOFTBUS_TRANS_INVALID_DATA_LENGTH;
701     }
702     *data = *((int32_t *)(buf + *offSet));
703     *offSet += sizeof(*data);
704     return SOFTBUS_OK;
705 }
706 
ReadUint8FromBuf(uint8_t * buf,uint32_t dataLen,int32_t * offSet,uint8_t * data)707 int32_t ReadUint8FromBuf(uint8_t *buf, uint32_t dataLen, int32_t *offSet, uint8_t *data)
708 {
709     int32_t ret = checkParamIsNull(buf, offSet);
710     if (ret != SOFTBUS_OK) {
711         return ret;
712     }
713     if (data == NULL) {
714         COMM_LOGE(COMM_UTILS, "param data is NULL");
715         return SOFTBUS_INVALID_PARAM;
716     }
717     if (dataLen < *offSet + sizeof(*data)) {
718         COMM_LOGE(COMM_UTILS, "Read data is long than dataLen!");
719         return SOFTBUS_TRANS_INVALID_DATA_LENGTH;
720     }
721     *data = *(buf + *offSet);
722     *offSet += sizeof(*data);
723     return SOFTBUS_OK;
724 }
725 
EnableCapabilityBit(uint32_t * value,uint32_t offSet)726 void EnableCapabilityBit(uint32_t *value, uint32_t offSet)
727 {
728     if (value == NULL) {
729         COMM_LOGE(COMM_UTILS, "invalid param");
730         return;
731     }
732     *value |= (1 << offSet);
733 }
734 
GetCapabilityBit(uint32_t * value,uint32_t offSet)735 bool GetCapabilityBit(uint32_t *value, uint32_t offSet)
736 {
737     if (value == NULL) {
738         COMM_LOGE(COMM_UTILS, "invalid param");
739         return false;
740     }
741     return (bool)((*value >> offSet) & 0x1);
742 }
743 
SetLocale(char ** localeBefore)744 static int32_t SetLocale(char **localeBefore)
745 {
746     *localeBefore = setlocale(LC_CTYPE, NULL);
747     if (*localeBefore == NULL) {
748         COMM_LOGW(COMM_UTILS, "get locale failed");
749     }
750 
751     char *localeAfter = setlocale(LC_CTYPE, "C.UTF-8");
752     return (localeAfter != NULL) ? SOFTBUS_OK : SOFTBUS_DISCOVER_SET_LOCALE_FAILED;
753 }
754 
RestoreLocale(const char * localeBefore)755 static void RestoreLocale(const char *localeBefore)
756 {
757     if (setlocale(LC_CTYPE, localeBefore) == NULL) {
758         COMM_LOGW(COMM_UTILS, "restore locale failed");
759     }
760 }
761 
762 // 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)763 int32_t CalculateMbsTruncateSize(const char *multiByteStr, uint32_t capacity, uint32_t *truncatedSize)
764 {
765     size_t multiByteStrLen = strlen(multiByteStr);
766     if (multiByteStrLen == 0) {
767         *truncatedSize = 0;
768         return SOFTBUS_OK;
769     }
770     if (multiByteStrLen > WIDE_STR_MAX_LEN) {
771         COMM_LOGE(COMM_UTILS, "multi byte str too long: %{public}zu", multiByteStrLen);
772         return SOFTBUS_INVALID_PARAM;
773     }
774 
775     char *localeBefore = NULL;
776     int32_t ret = SetLocale(&localeBefore);
777     if (ret != SOFTBUS_OK) {
778         COMM_LOGE(COMM_UTILS, "set locale failed");
779         return ret;
780     }
781 
782     // convert multi byte str to wide str
783     wchar_t wideStr[WIDE_STR_MAX_LEN] = {0};
784     size_t numConverted = mbstowcs(wideStr, multiByteStr, multiByteStrLen);
785     if (numConverted == 0 || numConverted > multiByteStrLen) {
786         COMM_LOGE(COMM_UTILS, "mbstowcs failed");
787         RestoreLocale(localeBefore);
788         return SOFTBUS_DISCOVER_CHAR_CONVERT_FAILED;
789     }
790 
791     // truncate wide str until <= capacity
792     uint32_t truncateTotal = 0;
793     int32_t truncateIndex = (int32_t)numConverted - 1;
794     char multiByteChar[WIDE_CHAR_MAX_LEN] = {0};
795     while (capacity < multiByteStrLen - truncateTotal && truncateIndex >= 0) {
796         int32_t truncateCharLen = wctomb(multiByteChar, wideStr[truncateIndex]);
797         if (truncateCharLen <= 0) {
798             COMM_LOGE(COMM_UTILS, "wctomb failed on w_char. truncateIndex=%{public}d", truncateIndex);
799             RestoreLocale(localeBefore);
800             return SOFTBUS_DISCOVER_CHAR_CONVERT_FAILED;
801         }
802         truncateTotal += (uint32_t)truncateCharLen;
803         truncateIndex--;
804     }
805 
806     *truncatedSize = (multiByteStrLen >= truncateTotal) ? (multiByteStrLen - truncateTotal) : 0;
807     RestoreLocale(localeBefore);
808     return SOFTBUS_OK;
809 }