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 }