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 }