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 }