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 }