• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022-2023 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 "auth_common.h"
17 
18 #include <securec.h>
19 
20 #include "anonymizer.h"
21 #include "auth_log.h"
22 #include "bus_center_manager.h"
23 #include "message_handler.h"
24 #include "softbus_adapter_crypto.h"
25 #include "softbus_adapter_mem.h"
26 #include "softbus_adapter_timer.h"
27 #include "softbus_base_listener.h"
28 #include "softbus_def.h"
29 #include "softbus_feature_config.h"
30 
31 #define TIME_SEC_TO_MSEC  1000L
32 #define TIME_MSEC_TO_USEC 1000L
33 
34 #define SEQ_NETWORK_ID_BITS 32
35 #define SEQ_TIME_STAMP_BITS 8
36 #define SEQ_TIME_STAMP_MASK 0xFFL
37 #define SEQ_INTEGER_BITS    24
38 #define SEQ_INTEGER_MAX     0xFFFFFF
39 
40 #define AUTH_SUPPORT_AS_SERVER_MASK 0x01
41 
42 typedef struct {
43     EventType event;
44     RemoveCompareFunc cmpFunc;
45     void *param;
46 } EventRemoveInfo;
47 
48 typedef struct {
49     AuthLinkType type;
50     bool (*compareConnInfo)(const AuthConnInfo *info1, const AuthConnInfo *info2, bool cmpShortHash);
51 } CompareByType;
52 
53 static uint64_t g_uniqueId = 0;
54 static SoftBusMutex g_authLock;
55 static SoftBusHandler g_authHandler = { NULL, NULL, NULL };
56 
57 /* auth handler */
IsAuthHandlerInit(void)58 static bool IsAuthHandlerInit(void)
59 {
60     if (g_authHandler.looper == NULL || g_authHandler.looper->PostMessage == NULL ||
61         g_authHandler.looper->PostMessageDelay == NULL || g_authHandler.looper->RemoveMessageCustom == NULL) {
62         AUTH_LOGE(AUTH_INIT, "auth handler not init");
63         return false;
64     }
65     return true;
66 }
67 
DelAuthMessage(SoftBusMessage * msg)68 static void DelAuthMessage(SoftBusMessage *msg)
69 {
70     CHECK_NULL_PTR_RETURN_VOID(msg);
71     if (msg->obj != NULL) {
72         SoftBusFree(msg->obj);
73         msg->obj = NULL;
74     }
75     SoftBusFree(msg);
76 }
77 
NewAuthMessage(const uint8_t * obj,uint32_t size)78 static SoftBusMessage *NewAuthMessage(const uint8_t *obj, uint32_t size)
79 {
80     SoftBusMessage *msg = MallocMessage();
81     if (msg == NULL) {
82         AUTH_LOGE(AUTH_CONN, "malloc message fail");
83         return NULL;
84     }
85     msg->obj = NULL;
86     if (obj != NULL && size > 0) {
87         msg->obj = DupMemBuffer(obj, size);
88         if (msg->obj == NULL) {
89             AUTH_LOGE(AUTH_CONN, "dup data fail");
90             SoftBusFree(msg);
91             return NULL;
92         }
93     }
94     msg->handler = &g_authHandler;
95     msg->FreeMessage = DelAuthMessage;
96     return msg;
97 }
98 
HandleAuthMessage(SoftBusMessage * msg)99 static void HandleAuthMessage(SoftBusMessage *msg)
100 {
101     CHECK_NULL_PTR_RETURN_VOID(msg);
102     EventHandler handler = (EventHandler)(uintptr_t)msg->arg1;
103     if (handler == NULL) {
104         AUTH_LOGE(AUTH_CONN, "invalid event handler, event=%{public}d", msg->what);
105         return;
106     }
107     handler(msg->obj);
108 }
109 
PostAuthEvent(EventType event,EventHandler handler,const void * obj,uint32_t size,uint64_t delayMs)110 int32_t PostAuthEvent(EventType event, EventHandler handler, const void *obj, uint32_t size, uint64_t delayMs)
111 {
112     if (!IsAuthHandlerInit()) {
113         return SOFTBUS_NO_INIT;
114     }
115     SoftBusMessage *msg = NewAuthMessage(obj, size);
116     if (msg == NULL) {
117         AUTH_LOGE(AUTH_CONN, "malloc fail, event=%{public}d", event);
118         return SOFTBUS_MALLOC_ERR;
119     }
120     msg->what = (int32_t)event;
121     msg->arg1 = (uint64_t)(uintptr_t)handler;
122     if (delayMs == 0) {
123         g_authHandler.looper->PostMessage(g_authHandler.looper, msg);
124     } else {
125         g_authHandler.looper->PostMessageDelay(g_authHandler.looper, msg, delayMs);
126     }
127     return SOFTBUS_OK;
128 }
129 
CustomFunc(const SoftBusMessage * msg,void * param)130 static int32_t CustomFunc(const SoftBusMessage *msg, void *param)
131 {
132     CHECK_NULL_PTR_RETURN_VALUE(msg, SOFTBUS_INVALID_PARAM);
133     CHECK_NULL_PTR_RETURN_VALUE(param, SOFTBUS_INVALID_PARAM);
134     EventRemoveInfo *info = (EventRemoveInfo *)param;
135     if (msg->what != (int32_t)info->event) {
136         AUTH_LOGE(AUTH_CONN, "msg->what and event inequality");
137         return SOFTBUS_INVALID_PARAM;
138     }
139     if (info->cmpFunc == NULL) {
140         AUTH_LOGE(AUTH_CONN, "cmpFunc is null");
141         return SOFTBUS_INVALID_PARAM;
142     }
143     return info->cmpFunc(msg->obj, info->param);
144 }
145 
RemoveAuthEvent(EventType event,RemoveCompareFunc func,void * param)146 int32_t RemoveAuthEvent(EventType event, RemoveCompareFunc func, void *param)
147 {
148     if (!IsAuthHandlerInit()) {
149         return SOFTBUS_NO_INIT;
150     }
151     EventRemoveInfo info = {
152         .event = event,
153         .cmpFunc = func,
154         .param = param,
155     };
156     g_authHandler.looper->RemoveMessageCustom(g_authHandler.looper, &g_authHandler, CustomFunc, &info);
157     return SOFTBUS_OK;
158 }
159 
160 /* auth lock */
RequireAuthLock(void)161 bool RequireAuthLock(void)
162 {
163     if (SoftBusMutexLock(&g_authLock) != SOFTBUS_OK) {
164         AUTH_LOGE(AUTH_CONN, "auth lock fail");
165         return false;
166     }
167     return true;
168 }
169 
ReleaseAuthLock(void)170 void ReleaseAuthLock(void)
171 {
172     if (SoftBusMutexUnlock(&g_authLock) != SOFTBUS_OK) {
173         AUTH_LOGE(AUTH_CONN, "auth unlock fail");
174     }
175 }
176 
177 /* auth config */
GetConfigSupportAsServer(void)178 bool GetConfigSupportAsServer(void)
179 {
180     uint32_t ability = 0;
181     if (SoftbusGetConfig(SOFTBUS_INT_AUTH_ABILITY_COLLECTION, (uint8_t *)(&ability), sizeof(ability)) != SOFTBUS_OK) {
182         AUTH_LOGE(AUTH_CONN, "get auth ability from config file fail");
183     }
184     AUTH_LOGI(AUTH_CONN, "auth ability=%{public}u", ability);
185     return ((ability & AUTH_SUPPORT_AS_SERVER_MASK) != 0);
186 }
187 
188 /* auth capacity */
GetAuthCapacity(void)189 uint32_t GetAuthCapacity(void)
190 {
191     uint32_t authCapacity = 0;
192     int32_t ret = SoftbusGetConfig(SOFTBUS_INT_AUTH_CAPACITY, (uint8_t *)(&authCapacity), sizeof(authCapacity));
193     if (ret != SOFTBUS_OK) {
194         AUTH_LOGE(AUTH_CONN, "get auth capacity from config file fail, ret=%{public}d", ret);
195         return authCapacity;
196     }
197     AUTH_LOGI(AUTH_CONN, "auth capacity=%{public}u", authCapacity);
198     return authCapacity;
199 }
200 
201 /* auth common function */
DupMemBuffer(const uint8_t * buf,uint32_t size)202 uint8_t *DupMemBuffer(const uint8_t *buf, uint32_t size)
203 {
204     if (buf == NULL || size == 0) {
205         AUTH_LOGE(AUTH_CONN, "param err");
206         return NULL;
207     }
208     uint8_t *dup = (uint8_t *)SoftBusMalloc(size);
209     if (dup == NULL) {
210         AUTH_LOGE(AUTH_CONN, "malloc err");
211         return NULL;
212     }
213     if (memcpy_s(dup, size, buf, size) != EOK) {
214         AUTH_LOGE(AUTH_CONN, "memcpy err");
215         SoftBusFree(dup);
216         return NULL;
217     }
218     return dup;
219 }
220 
UpdateUniqueId(void)221 static void UpdateUniqueId(void)
222 {
223     char networkId[NETWORK_ID_BUF_LEN] = { 0 };
224     if (LnnGetLocalStrInfo(STRING_KEY_NETWORKID, networkId, sizeof(networkId)) != SOFTBUS_OK) {
225         AUTH_LOGE(AUTH_CONN, "get local networkId fail");
226         return;
227     }
228     uint8_t hashId[SHA_256_HASH_LEN] = { 0 };
229     if (SoftBusGenerateStrHash((uint8_t *)networkId, strlen(networkId), hashId) != SOFTBUS_OK) {
230         AUTH_LOGE(AUTH_CONN, "GenerateStrHash fail");
231         return;
232     }
233     for (uint32_t i = 0; i < SEQ_NETWORK_ID_BITS / BYTES_BIT_NUM; i++) {
234         g_uniqueId = (g_uniqueId << BYTES_BIT_NUM) | hashId[i];
235     }
236     uint64_t timeStamp = GetCurrentTimeMs();
237     g_uniqueId = (g_uniqueId << SEQ_TIME_STAMP_BITS) | (SEQ_TIME_STAMP_MASK & timeStamp);
238 }
239 
GenSeq(bool isServer)240 int64_t GenSeq(bool isServer)
241 {
242     static uint32_t integer = 0;
243     if (integer >= SEQ_INTEGER_MAX) {
244         integer = 0;
245     }
246     if (integer == 0) {
247         UpdateUniqueId();
248     }
249     integer += SEQ_INTERVAL;
250     uint64_t seq = isServer ? (integer + 1) : integer;
251     /* |----NetworkIdHash(32)----|-----timeStamp(8)----|----AtomicInteger(24)----| */
252     seq = (g_uniqueId << SEQ_INTEGER_BITS) | (seq & SEQ_INTEGER_MAX);
253     return (int64_t)seq;
254 }
255 
GetCurrentTimeMs(void)256 uint64_t GetCurrentTimeMs(void)
257 {
258     SoftBusSysTime now = { 0 };
259     if (SoftBusGetTime(&now) != SOFTBUS_OK) {
260         AUTH_LOGE(AUTH_CONN, "SoftBusGetTime fail");
261         return 0;
262     }
263     return (uint64_t)now.sec * TIME_SEC_TO_MSEC + (uint64_t)now.usec / TIME_MSEC_TO_USEC;
264 }
265 
GetAuthSideStr(bool isServer)266 const char *GetAuthSideStr(bool isServer)
267 {
268     return isServer ? "server" : "client";
269 }
270 
CompareBrConnInfo(const AuthConnInfo * info1,const AuthConnInfo * info2,bool cmpShortHash)271 static bool CompareBrConnInfo(const AuthConnInfo *info1, const AuthConnInfo *info2, bool cmpShortHash)
272 {
273     if (info2->type == AUTH_LINK_TYPE_BR &&
274         StrCmpIgnoreCase(info1->info.brInfo.brMac, info2->info.brInfo.brMac) == 0) {
275         return true;
276     }
277     return false;
278 }
279 
CompareWifiConnInfo(const AuthConnInfo * info1,const AuthConnInfo * info2,bool cmpShortHash)280 static bool CompareWifiConnInfo(const AuthConnInfo *info1, const AuthConnInfo *info2, bool cmpShortHash)
281 {
282     if (info2->type == AUTH_LINK_TYPE_WIFI && strcmp(info1->info.ipInfo.ip, info2->info.ipInfo.ip) == 0) {
283         return true;
284     }
285     return false;
286 }
287 
CompareSessionKeyConnInfo(const AuthConnInfo * info1,const AuthConnInfo * info2,bool cmpShortHash)288 static bool CompareSessionKeyConnInfo(const AuthConnInfo *info1, const AuthConnInfo *info2, bool cmpShortHash)
289 {
290     if (info2->type == AUTH_LINK_TYPE_SESSION_KEY && strcmp(info1->info.ipInfo.ip, info2->info.ipInfo.ip) == 0) {
291         return true;
292     }
293     return false;
294 }
295 
CompareBleConnInfo(const AuthConnInfo * info1,const AuthConnInfo * info2,bool cmpShortHash)296 static bool CompareBleConnInfo(const AuthConnInfo *info1, const AuthConnInfo *info2, bool cmpShortHash)
297 {
298     bool isLinkble = (info2->type == AUTH_LINK_TYPE_BLE &&
299                         (memcmp(info1->info.bleInfo.deviceIdHash, info2->info.bleInfo.deviceIdHash,
300                         (cmpShortHash ? SHORT_HASH_LEN : UDID_HASH_LEN)) == 0 ||
301                         StrCmpIgnoreCase(info1->info.bleInfo.bleMac, info2->info.bleInfo.bleMac) == 0));
302     return isLinkble;
303 }
304 
CompareP2pConnInfo(const AuthConnInfo * info1,const AuthConnInfo * info2,bool cmpShortHash)305 static bool CompareP2pConnInfo(const AuthConnInfo *info1, const AuthConnInfo *info2, bool cmpShortHash)
306 {
307     if (info2->type == AUTH_LINK_TYPE_P2P && info1->info.ipInfo.port == info2->info.ipInfo.port &&
308         strcmp(info1->info.ipInfo.ip, info2->info.ipInfo.ip) == 0) {
309         return true;
310     }
311     return false;
312 }
313 
CompareEnhancedP2pConnInfo(const AuthConnInfo * info1,const AuthConnInfo * info2,bool cmpShortHash)314 static bool CompareEnhancedP2pConnInfo(const AuthConnInfo *info1, const AuthConnInfo *info2, bool cmpShortHash)
315 {
316     if (info2->type == AUTH_LINK_TYPE_ENHANCED_P2P && info1->info.ipInfo.port == info2->info.ipInfo.port &&
317         strcmp(info1->info.ipInfo.ip, info2->info.ipInfo.ip) == 0) {
318         return true;
319     }
320     return false;
321 }
322 
CompareSessionConnInfo(const AuthConnInfo * info1,const AuthConnInfo * info2,bool cmpShortHash)323 static bool CompareSessionConnInfo(const AuthConnInfo *info1, const AuthConnInfo *info2, bool cmpShortHash)
324 {
325     if (info2->type == AUTH_LINK_TYPE_SESSION &&
326         info1->info.sessionInfo.connId == info2->info.sessionInfo.connId &&
327         strcmp(info1->info.sessionInfo.udid, info2->info.sessionInfo.udid) == 0) {
328         return true;
329     }
330     return false;
331 }
332 
333 static CompareByType g_compareByType[] = {
334     {AUTH_LINK_TYPE_WIFI,         CompareWifiConnInfo},
335     {AUTH_LINK_TYPE_BR,           CompareBrConnInfo},
336     {AUTH_LINK_TYPE_BLE,          CompareBleConnInfo},
337     {AUTH_LINK_TYPE_P2P,          CompareP2pConnInfo},
338     {AUTH_LINK_TYPE_ENHANCED_P2P, CompareEnhancedP2pConnInfo},
339     {AUTH_LINK_TYPE_SESSION,      CompareSessionConnInfo},
340     {AUTH_LINK_TYPE_SESSION_KEY,  CompareSessionKeyConnInfo},
341 };
342 
CompareConnInfo(const AuthConnInfo * info1,const AuthConnInfo * info2,bool cmpShortHash)343 bool CompareConnInfo(const AuthConnInfo *info1, const AuthConnInfo *info2, bool cmpShortHash)
344 {
345     CHECK_NULL_PTR_RETURN_VALUE(info1, false);
346     CHECK_NULL_PTR_RETURN_VALUE(info2, false);
347     for (uint32_t i = 0; i < sizeof(g_compareByType) / sizeof(CompareByType); i++) {
348         if (info1->type == g_compareByType[i].type) {
349             if (g_compareByType[i].compareConnInfo != NULL) {
350                 return g_compareByType[i].compareConnInfo(info1, info2, cmpShortHash);
351             }
352         }
353     }
354     AUTH_LOGE(AUTH_CONN, "link type not support, info1-type: %{public}d.", info1->type);
355     return false;
356 }
357 
SetP2pSocketOption(const AuthConnInfo * connInfo,ConnectOption * option)358 static int32_t SetP2pSocketOption(const AuthConnInfo *connInfo, ConnectOption *option)
359 {
360     CHECK_NULL_PTR_RETURN_VALUE(connInfo, SOFTBUS_INVALID_PARAM);
361     CHECK_NULL_PTR_RETURN_VALUE(option, SOFTBUS_INVALID_PARAM);
362     option->type = CONNECT_TCP;
363     if (strcpy_s(option->socketOption.addr, sizeof(option->socketOption.addr), connInfo->info.ipInfo.ip) != EOK) {
364         AUTH_LOGE(AUTH_CONN, "copy ip fail");
365         return SOFTBUS_MEM_ERR;
366     }
367     option->socketOption.port = connInfo->info.ipInfo.port;
368     option->socketOption.protocol = LNN_PROTOCOL_IP;
369     option->socketOption.keepAlive = 1;
370     if (connInfo->type == AUTH_LINK_TYPE_P2P) {
371         option->socketOption.moduleId = AUTH_P2P;
372     } else {
373         option->socketOption.moduleId = connInfo->info.ipInfo.moduleId;
374     }
375     return SOFTBUS_OK;
376 }
377 
ConvertToConnectOption(const AuthConnInfo * connInfo,ConnectOption * option)378 int32_t ConvertToConnectOption(const AuthConnInfo *connInfo, ConnectOption *option)
379 {
380     CHECK_NULL_PTR_RETURN_VALUE(connInfo, SOFTBUS_INVALID_PARAM);
381     CHECK_NULL_PTR_RETURN_VALUE(option, SOFTBUS_INVALID_PARAM);
382     switch (connInfo->type) {
383         case AUTH_LINK_TYPE_BR:
384             option->type = CONNECT_BR;
385             if (strcpy_s(option->brOption.brMac, BT_MAC_LEN, connInfo->info.brInfo.brMac) != EOK) {
386                 AUTH_LOGE(AUTH_CONN, "copy brMac fail");
387                 return SOFTBUS_MEM_ERR;
388             }
389             option->brOption.connectionId = connInfo->info.brInfo.connectionId;
390             break;
391         case AUTH_LINK_TYPE_BLE:
392             option->type = CONNECT_BLE;
393             if (strcpy_s(option->bleOption.bleMac, BT_MAC_LEN, connInfo->info.bleInfo.bleMac) != EOK ||
394                 memcpy_s(option->bleOption.deviceIdHash, UDID_HASH_LEN, connInfo->info.bleInfo.deviceIdHash,
395                     UDID_HASH_LEN) != EOK) {
396                 AUTH_LOGE(AUTH_CONN, "copy bleMac/deviceIdHash fail");
397                 return SOFTBUS_MEM_ERR;
398             }
399             option->bleOption.fastestConnectEnable = true;
400             option->bleOption.psm = connInfo->info.bleInfo.psm;
401             option->bleOption.protocol = connInfo->info.bleInfo.protocol;
402             break;
403         case AUTH_LINK_TYPE_P2P:
404         case AUTH_LINK_TYPE_ENHANCED_P2P:
405             if (SetP2pSocketOption(connInfo, option) != SOFTBUS_OK) {
406                 return SOFTBUS_MEM_ERR;
407             }
408             break;
409         default:
410             AUTH_LOGE(AUTH_CONN, "unexpected connType=%{public}d", connInfo->type);
411             return SOFTBUS_AUTH_UNEXPECTED_CONN_TYPE;
412     }
413     return SOFTBUS_OK;
414 }
415 
IsEnhanceP2pModuleId(ListenerModule moduleId)416 static bool IsEnhanceP2pModuleId(ListenerModule moduleId)
417 {
418     if (moduleId >= AUTH_ENHANCED_P2P_START && moduleId <= AUTH_ENHANCED_P2P_END) {
419         return true;
420     }
421     return false;
422 }
423 
ConvertToAuthConnInfo(const ConnectionInfo * info,AuthConnInfo * connInfo)424 int32_t ConvertToAuthConnInfo(const ConnectionInfo *info, AuthConnInfo *connInfo)
425 {
426     CHECK_NULL_PTR_RETURN_VALUE(info, SOFTBUS_INVALID_PARAM);
427     CHECK_NULL_PTR_RETURN_VALUE(connInfo, SOFTBUS_INVALID_PARAM);
428     switch (info->type) {
429         case CONNECT_TCP:
430             if (info->socketInfo.protocol != LNN_PROTOCOL_IP) {
431                 AUTH_LOGW(AUTH_CONN, "only support LNN_PROTOCOL_IP");
432                 return SOFTBUS_AUTH_INVALID_PROTOCOL;
433             }
434             if (IsEnhanceP2pModuleId(info->socketInfo.moduleId)) {
435                 connInfo->type = AUTH_LINK_TYPE_ENHANCED_P2P;
436             } else {
437                 connInfo->type = AUTH_LINK_TYPE_P2P;
438             }
439             connInfo->info.ipInfo.moduleId = info->socketInfo.moduleId;
440             connInfo->info.ipInfo.port = info->socketInfo.port;
441             if (strcpy_s(connInfo->info.ipInfo.ip, IP_LEN, info->socketInfo.addr) != EOK) {
442                 AUTH_LOGE(AUTH_CONN, "copy ip fail");
443                 return SOFTBUS_MEM_ERR;
444             }
445             break;
446         case CONNECT_BR:
447             connInfo->type = AUTH_LINK_TYPE_BR;
448             if (strcpy_s(connInfo->info.brInfo.brMac, BT_MAC_LEN, info->brInfo.brMac) != EOK) {
449                 AUTH_LOGE(AUTH_CONN, "copy brMac fail");
450                 return SOFTBUS_MEM_ERR;
451             }
452             break;
453         case CONNECT_BLE:
454             connInfo->type = AUTH_LINK_TYPE_BLE;
455             if (strcpy_s(connInfo->info.bleInfo.bleMac, BT_MAC_LEN, info->bleInfo.bleMac) != EOK ||
456                 memcpy_s(connInfo->info.bleInfo.deviceIdHash, UDID_HASH_LEN, info->bleInfo.deviceIdHash,
457                     UDID_HASH_LEN) != EOK) {
458                 AUTH_LOGE(AUTH_CONN, "copy bleMac/deviceIdHash fail");
459                 return SOFTBUS_MEM_ERR;
460             }
461             connInfo->info.bleInfo.protocol = info->bleInfo.protocol;
462             connInfo->info.bleInfo.psm = info->bleInfo.psm;
463             break;
464         default:
465             AUTH_LOGE(AUTH_CONN, "unexpected connType=%{public}d", info->type);
466             return SOFTBUS_AUTH_UNEXPECTED_CONN_TYPE;
467     }
468     return SOFTBUS_OK;
469 }
470 
ConvertToDiscoveryType(AuthLinkType type)471 DiscoveryType ConvertToDiscoveryType(AuthLinkType type)
472 {
473     switch (type) {
474         case AUTH_LINK_TYPE_WIFI:
475             return DISCOVERY_TYPE_WIFI;
476         case AUTH_LINK_TYPE_BLE:
477             return DISCOVERY_TYPE_BLE;
478         case AUTH_LINK_TYPE_BR:
479             return DISCOVERY_TYPE_BR;
480         case AUTH_LINK_TYPE_P2P:
481             return DISCOVERY_TYPE_P2P;
482         case AUTH_LINK_TYPE_SESSION_KEY:
483             return DISCOVERY_TYPE_SESSION_KEY;
484         default:
485             break;
486     }
487     AUTH_LOGE(AUTH_CONN, "unexpected AuthLinkType=%{public}d", type);
488     return DISCOVERY_TYPE_UNKNOWN;
489 }
490 
ConvertToAuthLinkType(DiscoveryType type)491 AuthLinkType ConvertToAuthLinkType(DiscoveryType type)
492 {
493     switch (type) {
494         case DISCOVERY_TYPE_WIFI:
495             return AUTH_LINK_TYPE_WIFI;
496         case DISCOVERY_TYPE_BLE:
497             return AUTH_LINK_TYPE_BLE;
498         case DISCOVERY_TYPE_BR:
499             return AUTH_LINK_TYPE_BR;
500         case DISCOVERY_TYPE_P2P:
501             return AUTH_LINK_TYPE_P2P;
502         case DISCOVERY_TYPE_SESSION_KEY:
503             return AUTH_LINK_TYPE_SESSION_KEY;
504         default:
505             AUTH_LOGE(AUTH_CONN, "unexpected discType=%{public}d", type);
506             break;
507     }
508     return AUTH_LINK_TYPE_MAX;
509 }
510 
AuthCommonInit(void)511 int32_t AuthCommonInit(void)
512 {
513     g_authHandler.name = "AuthHandler";
514     g_authHandler.HandleMessage = HandleAuthMessage;
515     g_authHandler.looper = GetLooper(LOOP_TYPE_DEFAULT);
516 
517     if (SoftBusMutexInit(&g_authLock, NULL) != SOFTBUS_OK) {
518         AUTH_LOGE(AUTH_INIT, "auth mutex init fail");
519         return SOFTBUS_LOCK_ERR;
520     }
521     return SOFTBUS_OK;
522 }
523 
AuthCommonDeinit(void)524 void AuthCommonDeinit(void)
525 {
526     g_authHandler.looper = NULL;
527     g_authHandler.HandleMessage = NULL;
528 
529     if (SoftBusMutexDestroy(&g_authLock) != SOFTBUS_OK) {
530         AUTH_LOGE(AUTH_INIT, "auth mutex destroy fail");
531     }
532 }
533 
GetPeerUdidByNetworkId(const char * networkId,char * udid,uint32_t len)534 int32_t GetPeerUdidByNetworkId(const char *networkId, char *udid, uint32_t len)
535 {
536     if (networkId == NULL || udid == NULL || len < UDID_BUF_LEN) {
537         AUTH_LOGW(AUTH_CONN, "param err");
538         return SOFTBUS_INVALID_PARAM;
539     }
540     NodeInfo cacheInfo;
541     (void)memset_s(&cacheInfo, sizeof(NodeInfo), 0, sizeof(NodeInfo));
542     if (LnnRetrieveDeviceInfoByNetworkId(networkId, &cacheInfo) == SOFTBUS_OK &&
543         cacheInfo.deviceInfo.deviceUdid[0] != '\0') {
544         if (strcpy_s(udid, len, cacheInfo.deviceInfo.deviceUdid) != EOK) {
545             AUTH_LOGE(AUTH_CONN, "copy deviceUdid failed");
546             return SOFTBUS_STRCPY_ERR;
547         }
548         return SOFTBUS_OK;
549     }
550     AUTH_LOGE(AUTH_CONN, "info or deviceUdid is null");
551     return SOFTBUS_NOT_FIND;
552 }
553 
GetIsExchangeUdidByNetworkId(const char * networkId,bool * isExchangeUdid)554 int32_t GetIsExchangeUdidByNetworkId(const char *networkId, bool *isExchangeUdid)
555 {
556     if (networkId == NULL || isExchangeUdid == NULL) {
557         AUTH_LOGW(AUTH_CONN, "param err");
558         return SOFTBUS_INVALID_PARAM;
559     }
560     NodeInfo cacheInfo;
561     (void)memset_s(&cacheInfo, sizeof(NodeInfo), 0, sizeof(NodeInfo));
562     if (LnnRetrieveDeviceInfoByNetworkId(networkId, &cacheInfo) == SOFTBUS_OK) {
563         *isExchangeUdid = cacheInfo.isAuthExchangeUdid;
564         return SOFTBUS_OK;
565     }
566     AUTH_LOGE(AUTH_CONN, "deviceInfo not found");
567     return SOFTBUS_NOT_FIND;
568 }
569 
CheckAuthConnInfoType(const AuthConnInfo * connInfo)570 bool CheckAuthConnInfoType(const AuthConnInfo *connInfo)
571 {
572     AUTH_CHECK_AND_RETURN_RET_LOGE(connInfo != NULL, false, AUTH_FSM, "connInfo is null");
573     if (connInfo->type >= AUTH_LINK_TYPE_WIFI && connInfo->type < AUTH_LINK_TYPE_MAX) {
574         return true;
575     }
576     return false;
577 }
578 
PrintAuthConnInfo(const AuthConnInfo * connInfo)579 void PrintAuthConnInfo(const AuthConnInfo *connInfo)
580 {
581     if (connInfo == NULL) {
582         return;
583     }
584     char *anonyUdidHash = NULL;
585     char *anonyMac = NULL;
586     char *anonyIp = NULL;
587     char udidHash[UDID_BUF_LEN] = { 0 };
588     switch (connInfo->type) {
589         case AUTH_LINK_TYPE_WIFI:
590             Anonymize(connInfo->info.ipInfo.ip, &anonyIp);
591             AUTH_LOGD(AUTH_CONN, "print AuthConninfo ip=*.*.*%{public}s", AnonymizeWrapper(anonyIp));
592             AnonymizeFree(anonyIp);
593             break;
594         case AUTH_LINK_TYPE_BR:
595             Anonymize(connInfo->info.brInfo.brMac, &anonyMac);
596             AUTH_LOGD(AUTH_CONN, "print AuthConninfo brMac=**:**:**:**:%{public}s", AnonymizeWrapper(anonyMac));
597             AnonymizeFree(anonyMac);
598             break;
599         case AUTH_LINK_TYPE_BLE:
600             if (ConvertBytesToHexString(udidHash, UDID_BUF_LEN,
601                 (const unsigned char *)connInfo->info.bleInfo.deviceIdHash, UDID_HASH_LEN) != SOFTBUS_OK) {
602                 AUTH_LOGE(AUTH_CONN, "gen udid hash hex str err");
603                 return;
604             }
605             Anonymize(udidHash, &anonyUdidHash);
606             Anonymize(connInfo->info.bleInfo.bleMac, &anonyMac);
607             AUTH_LOGD(AUTH_CONN, "print AuthConninfo bleMac=**:**:**:**:%{public}s, udidhash=%{public}s",
608                 AnonymizeWrapper(anonyMac), AnonymizeWrapper(anonyUdidHash));
609             AnonymizeFree(anonyMac);
610             AnonymizeFree(anonyUdidHash);
611             break;
612         default:
613             break;
614     }
615 }