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