• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022 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_manager.h"
17 
18 #include <securec.h>
19 
20 #include "auth_common.h"
21 #include "auth_connection.h"
22 #include "auth_hichain.h"
23 #include "auth_request.h"
24 #include "auth_session_fsm.h"
25 #include "auth_session_message.h"
26 #include "bus_center_manager.h"
27 #include "lnn_decision_db.h"
28 #include "softbus_adapter_mem.h"
29 
30 #define MAX_AUTH_VALID_PERIOD (30 * 60 * 1000L) /* 30 mins */
31 #define SCHEDULE_UPDATE_SESSION_KEY_PERIOD ((5 * 60 + 30) * 60 * 1000L) /* 5 hour 30 mins */
32 
33 static ListNode g_authClientList = { &g_authClientList, &g_authClientList };
34 static ListNode g_authServerList = { &g_authServerList, &g_authServerList };
35 
36 static AuthVerifyListener g_verifyListener = {0};
37 static GroupChangeListener g_groupChangeListener = {0};
38 static AuthTransCallback g_transCallback = {0};
39 /* Auth Manager */
NewAuthManager(int64_t authSeq,const AuthSessionInfo * info)40 static AuthManager *NewAuthManager(int64_t authSeq, const AuthSessionInfo *info)
41 {
42     AuthManager *auth = (AuthManager *)SoftBusMalloc(sizeof(AuthManager));
43     if (auth == NULL) {
44         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_WARN, "malloc AuthManager fail.");
45         return NULL;
46     }
47     auth->authId = authSeq;
48     auth->isServer = info->isServer;
49     auth->connId = info->connId;
50     auth->connInfo = info->connInfo;
51     if (strcpy_s(auth->udid, sizeof(auth->udid), info->udid) != EOK ||
52         strcpy_s(auth->uuid, sizeof(auth->uuid), info->uuid) != EOK) {
53         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_WARN, "copy uuid/udid fail.");
54         SoftBusFree(auth);
55         return NULL;
56     }
57     auth->version = info->version;
58     auth->hasAuthPassed = false;
59     InitSessionKeyList(&auth->sessionKeyList);
60     if (auth->isServer) {
61         ListTailInsert(&g_authServerList, &auth->node);
62     } else {
63         ListTailInsert(&g_authClientList, &auth->node);
64     }
65     SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_INFO,
66         "create auth manager, side=%s, authId=%" PRId64 ".", GetAuthSideStr(auth->isServer), auth->authId);
67     return auth;
68 }
69 
DupAuthManager(const AuthManager * auth)70 static AuthManager *DupAuthManager(const AuthManager *auth)
71 {
72     AuthManager *newAuth = (AuthManager *)DupMemBuffer((const uint8_t *)auth, sizeof(AuthManager));
73     if (newAuth == NULL) {
74         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR,
75             "auth manager[%"PRId64"] dup fail", auth->authId);
76         return NULL;
77     }
78     ListInit(&newAuth->node);
79     ListInit(&newAuth->sessionKeyList);
80     if (DupSessionKeyList(&auth->sessionKeyList, &newAuth->sessionKeyList)) {
81         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR,
82             "auth manager[%"PRId64"] dup session key fail", auth->authId);
83         SoftBusFree(newAuth);
84         return NULL;
85     }
86     return newAuth;
87 }
88 
DelAuthManager(AuthManager * auth,bool removeAuthFromList)89 void DelAuthManager(AuthManager *auth, bool removeAuthFromList)
90 {
91     CHECK_NULL_PTR_RETURN_VOID(auth);
92     if (removeAuthFromList) {
93         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_INFO,
94             "delete auth manager, side=%s, authId=%" PRId64 ".", GetAuthSideStr(auth->isServer), auth->authId);
95         ListDelete(&auth->node);
96     }
97     DestroySessionKeyList(&auth->sessionKeyList);
98     SoftBusFree(auth);
99 }
100 
FindAuthManagerByConnInfo(const AuthConnInfo * connInfo,bool isServer)101 static AuthManager *FindAuthManagerByConnInfo(const AuthConnInfo *connInfo, bool isServer)
102 {
103     AuthManager *item = NULL;
104     ListNode *list = isServer ? &g_authServerList : &g_authClientList;
105     LIST_FOR_EACH_ENTRY(item, list, AuthManager, node) {
106         if (CompareConnInfo(&item->connInfo, connInfo)) {
107             return item;
108         }
109     }
110     return NULL;
111 }
112 
FindAuthManagerByUuid(const char * uuid,AuthLinkType type,bool isServer)113 static AuthManager *FindAuthManagerByUuid(const char *uuid, AuthLinkType type, bool isServer)
114 {
115     AuthManager *item = NULL;
116     ListNode *list = isServer ? &g_authServerList : &g_authClientList;
117     LIST_FOR_EACH_ENTRY(item, list, AuthManager, node) {
118         if (item->connInfo.type == type && (strcmp(item->uuid, uuid) == 0)) {
119             return item;
120         }
121     }
122     return NULL;
123 }
124 
FindAuthManagerByP2pMac(const char * p2pMac,AuthLinkType type,bool isServer)125 static AuthManager *FindAuthManagerByP2pMac(const char *p2pMac, AuthLinkType type, bool isServer)
126 {
127     AuthManager *item = NULL;
128     ListNode *list = isServer ? &g_authServerList : &g_authClientList;
129     LIST_FOR_EACH_ENTRY(item, list, AuthManager, node) {
130         if (item->connInfo.type == type &&
131             (StrCmpIgnoreCase(item->p2pMac, p2pMac) == 0)) {
132             return item;
133         }
134     }
135     return NULL;
136 }
137 
FindAuthManagerByAuthId(int64_t authId)138 static AuthManager *FindAuthManagerByAuthId(int64_t authId)
139 {
140     AuthManager *item = NULL;
141     LIST_FOR_EACH_ENTRY(item, &g_authClientList, AuthManager, node) {
142         if (item->authId == authId) {
143             return item;
144         }
145     }
146     LIST_FOR_EACH_ENTRY(item, &g_authServerList, AuthManager, node) {
147         if (item->authId == authId) {
148             return item;
149         }
150     }
151     return NULL;
152 }
153 
FindAuthManagerByConnId(uint64_t connId,bool isServer)154 static AuthManager *FindAuthManagerByConnId(uint64_t connId, bool isServer)
155 {
156     AuthManager *item = NULL;
157     ListNode *list = isServer ? &g_authServerList : &g_authClientList;
158     LIST_FOR_EACH_ENTRY(item, list, AuthManager, node) {
159         if (item->connId == connId) {
160             return item;
161         }
162     }
163     return NULL;
164 }
165 
DestroyAuthManagerList(void)166 static void DestroyAuthManagerList(void)
167 {
168     if (!RequireAuthLock()) {
169         return;
170     }
171     AuthManager *item = NULL;
172     AuthManager *next = NULL;
173     LIST_FOR_EACH_ENTRY_SAFE(item, next, &g_authClientList, AuthManager, node) {
174         DelAuthManager(item, true);
175     }
176     LIST_FOR_EACH_ENTRY_SAFE(item, next, &g_authServerList, AuthManager, node) {
177         DelAuthManager(item, true);
178     }
179     ReleaseAuthLock();
180 }
181 
SetAuthConnId(AuthManager * auth,const AuthManager * inAuth)182 static int32_t SetAuthConnId(AuthManager *auth, const AuthManager *inAuth)
183 {
184     auth->connId = inAuth->connId;
185     return SOFTBUS_OK;
186 }
187 
SetAuthP2pMac(AuthManager * auth,const AuthManager * inAuth)188 static int32_t SetAuthP2pMac(AuthManager *auth, const AuthManager *inAuth)
189 {
190     if (strcpy_s(auth->p2pMac, sizeof(auth->p2pMac), inAuth->p2pMac) != EOK) {
191         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR,
192             "copy auth p2p mac fail, authId=%" PRId64, auth->authId);
193         return SOFTBUS_MEM_ERR;
194     }
195     return SOFTBUS_OK;
196 }
197 
UpdateAuthManagerByAuthId(int64_t authId,int32_t (* updateFunc)(AuthManager *,const AuthManager *),const AuthManager * inAuth)198 static int32_t UpdateAuthManagerByAuthId(int64_t authId,
199     int32_t (*updateFunc)(AuthManager *, const AuthManager *), const AuthManager *inAuth)
200 {
201     if (!RequireAuthLock()) {
202         return SOFTBUS_LOCK_ERR;
203     }
204     AuthManager *auth = FindAuthManagerByAuthId(authId);
205     if (auth == NULL) {
206         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR,
207             "auth manager not found, authId=%" PRId64, authId);
208         ReleaseAuthLock();
209         return SOFTBUS_AUTH_NOT_FOUND;
210     }
211     if (updateFunc(auth, inAuth) != SOFTBUS_OK) {
212         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR,
213             "update auth manager fail, authId=%" PRId64, authId);
214         ReleaseAuthLock();
215         return SOFTBUS_ERR;
216     }
217     ReleaseAuthLock();
218     return SOFTBUS_OK;
219 }
220 
RemoveAuthManagerByAuthId(int64_t authId)221 static void RemoveAuthManagerByAuthId(int64_t authId)
222 {
223     if (!RequireAuthLock()) {
224         return;
225     }
226     AuthManager *auth = FindAuthManagerByAuthId(authId);
227     if (auth == NULL) {
228         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_INFO,
229             "auth manager already removed, authId=%" PRId64, authId);
230         ReleaseAuthLock();
231         return;
232     }
233     DelAuthManager(auth, true);
234     ReleaseAuthLock();
235 }
236 
RemoveAuthManagerByConnInfo(const AuthConnInfo * connInfo,bool isServer)237 static void RemoveAuthManagerByConnInfo(const AuthConnInfo *connInfo, bool isServer)
238 {
239     if (!RequireAuthLock()) {
240         return;
241     }
242     AuthManager *auth = FindAuthManagerByConnInfo(connInfo, isServer);
243     if (auth == NULL) {
244         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_INFO,
245             "auth manager already removed, connType=%d, side=%s", connInfo->type, GetAuthSideStr(isServer));
246         ReleaseAuthLock();
247         return;
248     }
249     DelAuthManager(auth, true);
250     ReleaseAuthLock();
251 }
252 
RemoveNotPassedAuthManagerByUdid(const char * udid)253 static void RemoveNotPassedAuthManagerByUdid(const char *udid)
254 {
255     if (!RequireAuthLock()) {
256         return;
257     }
258     AuthManager *item = NULL;
259     AuthManager *next = NULL;
260     LIST_FOR_EACH_ENTRY_SAFE(item, next, &g_authClientList, AuthManager, node) {
261         if (item->hasAuthPassed || strcmp(item->udid, udid) != 0) {
262             continue;
263         }
264         DelAuthManager(item, true);
265     }
266     LIST_FOR_EACH_ENTRY_SAFE(item, next, &g_authServerList, AuthManager, node) {
267         if (item->hasAuthPassed || strcmp(item->udid, udid) != 0) {
268             continue;
269         }
270         DelAuthManager(item, true);
271     }
272     ReleaseAuthLock();
273 }
274 
GetAuthConnInfoByUuid(const char * uuid,AuthLinkType type,AuthConnInfo * connInfo)275 static int32_t GetAuthConnInfoByUuid(const char *uuid, AuthLinkType type, AuthConnInfo *connInfo)
276 {
277     if (!RequireAuthLock()) {
278         return SOFTBUS_LOCK_ERR;
279     }
280     AuthManager *auth = FindAuthManagerByUuid(uuid, type, false);
281     if (auth == NULL) {
282         auth = FindAuthManagerByUuid(uuid, type, true);
283     }
284     if (auth == NULL) {
285         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_INFO, "auth not found by uuid, connType=%d.", type);
286         ReleaseAuthLock();
287         return SOFTBUS_ERR;
288     }
289     *connInfo = auth->connInfo;
290     ReleaseAuthLock();
291     return SOFTBUS_OK;
292 }
293 
294 /* Note: must call DelAuthManager(auth, false) to free. */
GetAuthManagerByAuthId(int64_t authId)295 AuthManager *GetAuthManagerByAuthId(int64_t authId)
296 {
297     if (!RequireAuthLock()) {
298         return NULL;
299     }
300     AuthManager *item = FindAuthManagerByAuthId(authId);
301     if (item == NULL) {
302         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_INFO,
303             "auth manager[%"PRId64"] not found", authId);
304         ReleaseAuthLock();
305         return NULL;
306     }
307     AuthManager *newAuth = DupAuthManager(item);
308     ReleaseAuthLock();
309     return newAuth;
310 }
311 
GetAuthManagerByConnInfo(const AuthConnInfo * connInfo,bool isServer)312 static AuthManager *GetAuthManagerByConnInfo(const AuthConnInfo *connInfo, bool isServer)
313 {
314     if (!RequireAuthLock()) {
315         return NULL;
316     }
317     AuthManager *item = FindAuthManagerByConnInfo(connInfo, isServer);
318     if (item == NULL) {
319         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_INFO,
320             "auth manager not found, connType=%d, side=%s", connInfo->type, GetAuthSideStr(isServer));
321         ReleaseAuthLock();
322         return NULL;
323     }
324     AuthManager *newAuth = DupAuthManager(item);
325     ReleaseAuthLock();
326     return newAuth;
327 }
328 
GetAuthIdByConnId(uint64_t connId,bool isServer)329 static int64_t GetAuthIdByConnId(uint64_t connId, bool isServer)
330 {
331     int64_t authId;
332     if (!RequireAuthLock()) {
333         return AUTH_INVALID_ID;
334     }
335     AuthManager *auth = FindAuthManagerByConnId(connId, isServer);
336     if (auth == NULL) {
337         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_WARN,
338             "auth manager[%s] not found, " CONN_INFO, GetAuthSideStr(isServer), CONN_DATA(connId));
339         ReleaseAuthLock();
340         return AUTH_INVALID_ID;
341     }
342     authId = auth->authId;
343     ReleaseAuthLock();
344     return authId;
345 }
346 
GetAuthIdByConnInfo(const AuthConnInfo * connInfo,bool isServer)347 static int64_t GetAuthIdByConnInfo(const AuthConnInfo *connInfo, bool isServer)
348 {
349     int64_t authId;
350     if (!RequireAuthLock()) {
351         return AUTH_INVALID_ID;
352     }
353     AuthManager *auth = FindAuthManagerByConnInfo(connInfo, isServer);
354     if (auth == NULL) {
355         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR,
356             "auth manager not found, connType=%d, side=%s", connInfo->type, GetAuthSideStr(isServer));
357         ReleaseAuthLock();
358         return AUTH_INVALID_ID;
359     }
360     authId = auth->authId;
361     ReleaseAuthLock();
362     return authId;
363 }
364 
GetActiveAuthIdByConnInfo(const AuthConnInfo * connInfo)365 static int64_t GetActiveAuthIdByConnInfo(const AuthConnInfo *connInfo)
366 {
367     if (!RequireAuthLock()) {
368         return AUTH_INVALID_ID;
369     }
370     uint32_t num = 0;
371     AuthManager *auth[2] = {NULL, NULL}; /* 2: client + server */
372     auth[num++] = FindAuthManagerByConnInfo(connInfo, false);
373     auth[num++] = FindAuthManagerByConnInfo(connInfo, true);
374     /* Check auth valid period */
375     uint64_t currentTime = GetCurrentTimeMs();
376     for (uint32_t i = 0; i < num; i++) {
377         if (auth[i] != NULL && (currentTime - auth[i]->lastActiveTime >= MAX_AUTH_VALID_PERIOD)) {
378             auth[i] = NULL;
379         }
380     }
381     /* Get lastest authId */
382     int64_t authId = AUTH_INVALID_ID;
383     uint64_t maxVerifyTime = 0;
384     for (uint32_t i = 0; i < sizeof(auth) / sizeof(auth[0]); i++) {
385         if (auth[i] == NULL) {
386             continue;
387         }
388         if (auth[i] != NULL && auth[i]->lastVerifyTime > maxVerifyTime) {
389             authId = auth[i]->authId;
390         }
391     }
392     SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_INFO,
393         "get active auth manager[%"PRId64"]", authId);
394     ReleaseAuthLock();
395     return authId;
396 }
397 
AuthManagerSetSessionKey(int64_t authSeq,const AuthSessionInfo * info,const SessionKey * sessionKey)398 int32_t AuthManagerSetSessionKey(int64_t authSeq, const AuthSessionInfo *info, const SessionKey *sessionKey)
399 {
400     CHECK_NULL_PTR_RETURN_VALUE(info, SOFTBUS_INVALID_PARAM);
401     CHECK_NULL_PTR_RETURN_VALUE(sessionKey, SOFTBUS_INVALID_PARAM);
402     SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_INFO, "SetSessionKey: authSeq=%" PRId64 ", side=%s, requestId=%u.",
403         authSeq, GetAuthSideStr(info->isServer), info->requestId);
404     if (!RequireAuthLock()) {
405         return SOFTBUS_LOCK_ERR;
406     }
407     bool isNewCreated = false;
408     AuthManager *auth = FindAuthManagerByConnInfo(&info->connInfo, info->isServer);
409     if (auth == NULL) {
410         auth = NewAuthManager(authSeq, info);
411         if (auth == NULL) {
412             SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "NewAuthManager fail.");
413             ReleaseAuthLock();
414             return SOFTBUS_MALLOC_ERR;
415         }
416         isNewCreated = true;
417     }
418     auth->connId = info->connId;
419     auth->lastVerifyTime = GetCurrentTimeMs();
420     auth->lastActiveTime = GetCurrentTimeMs();
421     if (AddSessionKey(&auth->sessionKeyList, TO_INT32(authSeq), sessionKey) != SOFTBUS_OK) {
422         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "AddSessionKey fail.");
423         if (isNewCreated) {
424             DelAuthManager(auth, true);
425         }
426         ReleaseAuthLock();
427         return SOFTBUS_ERR;
428     }
429     if (auth->connInfo.type == AUTH_LINK_TYPE_WIFI && !auth->isServer) {
430         ScheduleUpdateSessionKey(auth->authId, SCHEDULE_UPDATE_SESSION_KEY_PERIOD);
431     }
432     SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_DBG,
433         "auth manager[%"PRId64"] add session key succ, index=%d.", auth->authId, TO_INT32(authSeq));
434     ReleaseAuthLock();
435     return SOFTBUS_OK;
436 }
437 
AuthManagerGetSessionKey(int64_t authSeq,const AuthSessionInfo * info,SessionKey * sessionKey)438 int32_t AuthManagerGetSessionKey(int64_t authSeq, const AuthSessionInfo *info, SessionKey *sessionKey)
439 {
440     CHECK_NULL_PTR_RETURN_VALUE(info, SOFTBUS_INVALID_PARAM);
441     CHECK_NULL_PTR_RETURN_VALUE(sessionKey, SOFTBUS_INVALID_PARAM);
442     SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_INFO, "GetSessionKey: authSeq=%" PRId64 ", side=%s, requestId=%u.",
443         authSeq, GetAuthSideStr(info->isServer), info->requestId);
444     if (!RequireAuthLock()) {
445         return SOFTBUS_LOCK_ERR;
446     }
447     AuthManager *auth = FindAuthManagerByConnInfo(&info->connInfo, info->isServer);
448     if (auth == NULL) {
449         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "auth manager not found.");
450         ReleaseAuthLock();
451         return SOFTBUS_ERR;
452     }
453     if (GetSessionKeyByIndex(&auth->sessionKeyList, TO_INT32(authSeq), sessionKey) != SOFTBUS_OK) {
454         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "GetSessionKeyByIndex fail.");
455         ReleaseAuthLock();
456         return SOFTBUS_ERR;
457     }
458     ReleaseAuthLock();
459     return SOFTBUS_OK;
460 }
461 
NotifyDeviceVerifyPassed(int64_t authId,const NodeInfo * nodeInfo)462 static void NotifyDeviceVerifyPassed(int64_t authId, const NodeInfo *nodeInfo)
463 {
464     AuthManager *auth = GetAuthManagerByAuthId(authId);
465     if (auth == NULL) {
466         return;
467     }
468     if (auth->connInfo.type == AUTH_LINK_TYPE_P2P) {
469         /* P2P auth no need notify to LNN. */
470         DelAuthManager(auth, false);
471         return;
472     }
473     DelAuthManager(auth, false);
474 
475     /* notify LNN device verify pass. */
476     if (g_verifyListener.onDeviceVerifyPass == NULL) {
477         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_WARN, "onDeviceVerifyPass not set.");
478         return;
479     }
480     g_verifyListener.onDeviceVerifyPass(authId, nodeInfo);
481 }
482 
NotifyDeviceDisconnect(int64_t authId)483 static void NotifyDeviceDisconnect(int64_t authId)
484 {
485     if (g_verifyListener.onDeviceDisconnect == NULL) {
486         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_WARN, "onDeviceDisconnect not set.");
487         return;
488     }
489     g_verifyListener.onDeviceDisconnect(authId);
490 }
491 
OnDeviceNotTrusted(const char * peerUdid)492 static void OnDeviceNotTrusted(const char *peerUdid)
493 {
494     RemoveNotPassedAuthManagerByUdid(peerUdid);
495     AuthSessionHandleDeviceNotTrusted(peerUdid);
496     LnnDeleteSpecificTrustedDevInfo(peerUdid);
497     if (g_verifyListener.onDeviceNotTrusted == NULL) {
498         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_WARN, "onDeviceNotTrusted not set.");
499         return;
500     }
501     g_verifyListener.onDeviceNotTrusted(peerUdid);
502 }
503 
OnGroupCreated(const char * groupId)504 static void OnGroupCreated(const char *groupId)
505 {
506     if (g_groupChangeListener.onGroupCreated != NULL) {
507         g_groupChangeListener.onGroupCreated(groupId);
508     }
509 }
510 
OnGroupDeleted(const char * groupId)511 static void OnGroupDeleted(const char *groupId)
512 {
513     if (g_groupChangeListener.onGroupDeleted != NULL) {
514         g_groupChangeListener.onGroupDeleted(groupId);
515     }
516 }
517 
StartVerifyDevice(uint32_t requestId,const AuthConnInfo * connInfo,const AuthVerifyCallback * verifyCb,const AuthConnCallback * connCb)518 static int32_t StartVerifyDevice(uint32_t requestId, const AuthConnInfo *connInfo,
519     const AuthVerifyCallback *verifyCb, const AuthConnCallback *connCb)
520 {
521     SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_INFO,
522         "start verify device: requestId=%u.", requestId);
523     AuthRequest request;
524     (void)memset_s(&request, sizeof(AuthRequest), 0, sizeof(AuthRequest));
525     if (connCb != NULL) {
526         request.connCb = *connCb;
527     }
528     if (verifyCb != NULL) {
529         request.verifyCb = *verifyCb;
530     }
531     request.requestId = requestId;
532     request.connInfo = *connInfo;
533     request.authId = AUTH_INVALID_ID;
534     request.type = REQUEST_TYPE_VERIFY;
535     uint32_t waitNum = AddAuthRequest(&request);
536     if (waitNum == 0) {
537         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR,
538             "add verify request to list fail, requestId=%u.", requestId);
539         return SOFTBUS_AUTH_INNER_ERR;
540     }
541     if (waitNum > 1) {
542         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_INFO,
543             "wait last verify request complete, waitNum=%u, requestId=%u.", waitNum, requestId);
544         return SOFTBUS_OK;
545     }
546     if (ConnectAuthDevice(requestId, connInfo, CONN_SIDE_ANY) != SOFTBUS_OK) {
547         DelAuthRequest(requestId);
548         return SOFTBUS_AUTH_CONN_FAIL;
549     }
550     return SOFTBUS_OK;
551 }
552 
StartReconnectDevice(int64_t authId,const AuthConnInfo * connInfo,uint32_t requestId,const AuthConnCallback * connCb)553 static int32_t StartReconnectDevice(int64_t authId, const AuthConnInfo *connInfo,
554     uint32_t requestId, const AuthConnCallback *connCb)
555 {
556     SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_INFO,
557         "start reconnect device: requestId=%u, authId=%" PRId64, requestId, authId);
558     AuthManager *auth = GetAuthManagerByAuthId(authId);
559     if (auth == NULL) {
560         return SOFTBUS_AUTH_NOT_FOUND;
561     }
562     ConnSideType sideType = GetConnSideType(auth->connId);
563     DelAuthManager(auth, false);
564 
565     AuthRequest request;
566     (void)memset_s(&request, sizeof(AuthRequest), 0, sizeof(AuthRequest));
567     request.authId = authId;
568     request.connCb = *connCb;
569     request.connInfo = *connInfo;
570     request.requestId = requestId;
571     request.type = REQUEST_TYPE_RECONNECT;
572     if (AddAuthRequest(&request) == 0) {
573         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR,
574             "add reconnect request fail, requestId=%u.", requestId);
575         return SOFTBUS_ERR;
576     }
577     if (ConnectAuthDevice(requestId, connInfo, sideType) != SOFTBUS_OK) {
578         DelAuthRequest(requestId);
579         return SOFTBUS_AUTH_CONN_FAIL;
580     }
581     return SOFTBUS_OK;
582 }
583 
ReportAuthRequestPassed(uint32_t requestId,int64_t authId,const NodeInfo * nodeInfo)584 static void ReportAuthRequestPassed(uint32_t requestId, int64_t authId, const NodeInfo *nodeInfo)
585 {
586     AuthRequest request;
587     if (GetAuthRequest(requestId, &request) != SOFTBUS_OK) {
588         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_INFO,
589             "auth request not found, only notify LNN to update nodeInfo.");
590         NotifyDeviceVerifyPassed(authId, nodeInfo);
591         return;
592     }
593     do {
594         if (CheckAuthConnCallback(&request.connCb)) {
595             NotifyDeviceVerifyPassed(authId, nodeInfo);
596             if (request.connInfo.type == AUTH_LINK_TYPE_WIFI ||
597                 request.connInfo.type == AUTH_LINK_TYPE_P2P) {
598                 PerformAuthConnCallback(request.requestId, SOFTBUS_OK, authId);
599                 DelAuthRequest(request.requestId);
600                 continue;
601             }
602             /* For open auth br/ble connection, reconnect to keep long-connection. */
603             DelAuthRequest(request.requestId);
604             if (StartReconnectDevice(authId, &request.connInfo,
605                 request.requestId, &request.connCb) != SOFTBUS_OK) {
606                 SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "open auth reconnect fail.");
607                 request.connCb.onConnOpenFailed(request.requestId, SOFTBUS_AUTH_CONN_FAIL);
608             }
609             continue;
610         }
611         PerformVerifyCallback(request.requestId, SOFTBUS_OK, authId, nodeInfo);
612         DelAuthRequest(request.requestId);
613     } while (FindAuthRequestByConnInfo(&request.connInfo, &request) == SOFTBUS_OK);
614 }
615 
ReportAuthRequestFailed(uint32_t requestId,int32_t reason)616 static void ReportAuthRequestFailed(uint32_t requestId, int32_t reason)
617 {
618     AuthRequest request;
619     if (GetAuthRequest(requestId, &request) != SOFTBUS_OK) {
620         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "auth request not found.");
621         return;
622     }
623     if (CheckAuthConnCallback(&request.connCb)) {
624         PerformAuthConnCallback(request.requestId, reason, AUTH_INVALID_ID);
625     } else {
626         PerformVerifyCallback(request.requestId, reason, AUTH_INVALID_ID, NULL);
627     }
628     DelAuthRequest(request.requestId);
629     if (FindAuthRequestByConnInfo(&request.connInfo, &request) != SOFTBUS_OK) {
630         /* verify request wait list is empty, return. */
631         return;
632     }
633     SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_INFO,
634         "find another verify request in wait list, do verify again.");
635     if (ConnectAuthDevice(request.requestId, &request.connInfo, CONN_SIDE_ANY) != SOFTBUS_OK) {
636         ReportAuthRequestFailed(request.requestId, SOFTBUS_AUTH_CONN_FAIL);
637     }
638 }
639 
AuthManagerSetAuthPassed(int64_t authSeq,const AuthSessionInfo * info)640 void AuthManagerSetAuthPassed(int64_t authSeq, const AuthSessionInfo *info)
641 {
642     int64_t authId;
643     CHECK_NULL_PTR_RETURN_VOID(info);
644     SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_INFO, "SetAuthPassed: authSeq=%" PRId64 ", side=%s, requestId=%u.",
645         authSeq, GetAuthSideStr(info->isServer), info->requestId);
646 
647     if (!RequireAuthLock()) {
648         return;
649     }
650     AuthManager *auth = FindAuthManagerByConnInfo(&info->connInfo, info->isServer);
651     if (auth == NULL) {
652         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR,
653             "auth manager not found, connType=%d, side=%s", info->connInfo.type, GetAuthSideStr(info->isServer));
654         ReleaseAuthLock();
655         return;
656     }
657     auth->hasAuthPassed = true;
658     if (info->nodeInfo.p2pInfo.p2pMac[0] != '\0') {
659         if (strcpy_s(auth->p2pMac, sizeof(auth->p2pMac), info->nodeInfo.p2pInfo.p2pMac)) {
660             SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR,
661                 "copy p2pMac fail, authSeq=%" PRId64, authSeq);
662         }
663     }
664     authId = auth->authId;
665     ReleaseAuthLock();
666 
667     if (info->isServer) {
668         NotifyDeviceVerifyPassed(authId, &info->nodeInfo);
669     } else {
670         ReportAuthRequestPassed(info->requestId, authId, &info->nodeInfo);
671         UpdateAuthDevicePriority(info->connId);
672         /* br and ble NOT long-connection, close connection after auth pass. */
673         if (info->connInfo.type == AUTH_LINK_TYPE_BR || info->connInfo.type == AUTH_LINK_TYPE_BLE) {
674             DisconnectAuthDevice(info->connId);
675         }
676     }
677 }
678 
AuthManagerSetAuthFailed(int64_t authSeq,const AuthSessionInfo * info,int32_t reason)679 void AuthManagerSetAuthFailed(int64_t authSeq, const AuthSessionInfo *info, int32_t reason)
680 {
681     SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "SetAuthFailed: authSeq=%" PRId64 ", requestId=%u, reason=%d.",
682         authSeq, info->requestId, reason);
683     AuthManager *auth = GetAuthManagerByConnInfo(&info->connInfo, info->isServer);
684     if (auth != NULL && auth->hasAuthPassed) {
685         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR,
686             "update session key fail, authId=%" PRId64, auth->authId);
687         NotifyDeviceDisconnect(auth->authId);
688     }
689     DelAuthManager(auth, false);
690 
691     RemoveAuthManagerByConnInfo(&info->connInfo, info->isServer);
692     ReportAuthRequestFailed(info->requestId, reason);
693     if (!info->isServer) {
694         /* only client close connection. */
695         DisconnectAuthDevice(info->connId);
696     }
697 }
698 
HandleReconnectResult(const AuthRequest * request,uint64_t connId,int32_t result)699 static void HandleReconnectResult(const AuthRequest *request, uint64_t connId, int32_t result)
700 {
701     if (result != SOFTBUS_OK) {
702         PerformAuthConnCallback(request->requestId, result, AUTH_INVALID_ID);
703         DelAuthRequest(request->requestId);
704         return;
705     }
706     AuthManager inAuth = {.connId = connId};
707     if (UpdateAuthManagerByAuthId(request->authId, SetAuthConnId, &inAuth) != SOFTBUS_OK) {
708         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR,
709             "set auth connId fail, requestId=%u.", request->requestId);
710         PerformAuthConnCallback(request->requestId, SOFTBUS_AUTH_NOT_FOUND, AUTH_INVALID_ID);
711         DelAuthRequest(request->requestId);
712         return;
713     }
714     PerformAuthConnCallback(request->requestId, SOFTBUS_OK, request->authId);
715     DelAuthRequest(request->requestId);
716 }
717 
OnConnectResult(uint32_t requestId,uint64_t connId,int32_t result,const AuthConnInfo * connInfo)718 static void OnConnectResult(uint32_t requestId, uint64_t connId, int32_t result, const AuthConnInfo *connInfo)
719 {
720     SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_INFO,
721         "OnConnectResult: requestId=%u, result=%d.", requestId, result);
722     AuthRequest request;
723     if (GetAuthRequest(requestId, &request) != SOFTBUS_OK) {
724         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "request not found, requestId=%u.", requestId);
725         return;
726     }
727     if (request.type == REQUEST_TYPE_RECONNECT) {
728         HandleReconnectResult(&request, connId, result);
729         return;
730     }
731 
732     if (result != SOFTBUS_OK) {
733         ReportAuthRequestFailed(requestId, result);
734         return;
735     }
736     /* connect success */
737     (void)UpdateAuthRequestConnInfo(requestId, connInfo);
738     int32_t ret = AuthSessionStartAuth(GenSeq(false), requestId, connId, connInfo, false);
739     if (ret != SOFTBUS_OK) {
740         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR,
741             "start auth session fail(=%d), requestId=%u.", ret, requestId);
742         DisconnectAuthDevice(connId);
743         ReportAuthRequestFailed(requestId, ret);
744         return;
745     }
746 }
747 
HandleDeviceIdData(uint64_t connId,const AuthConnInfo * connInfo,const AuthDataHead * head,const uint8_t * data)748 static void HandleDeviceIdData(uint64_t connId, const AuthConnInfo *connInfo,
749     const AuthDataHead *head, const uint8_t *data)
750 {
751     int32_t ret;
752     if (head->flag == CLIENT_SIDE_FLAG) {
753         if (!GetConfigSupportAsServer()) {
754             SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR,
755                 "local device NOT support as server, ignore auth seq=%" PRId64, head->seq);
756             return;
757         }
758         ret = AuthSessionStartAuth(head->seq, AuthGenRequestId(), connId, connInfo, true);
759         if (ret != SOFTBUS_OK) {
760             SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR,
761                 "perform auth(=%"PRId64") session start auth fail(=%d)", head->seq, ret);
762             return;
763         }
764     }
765     ret = AuthSessionProcessDevIdData(head->seq, data, head->len);
766     if (ret != SOFTBUS_OK) {
767         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR,
768             "perform auth(=%"PRId64") session recv devId fail(=%d)", head->seq, ret);
769         return;
770     }
771 }
772 
HandleAuthData(const AuthConnInfo * connInfo,const AuthDataHead * head,const uint8_t * data)773 static void HandleAuthData(const AuthConnInfo *connInfo,
774     const AuthDataHead *head, const uint8_t *data)
775 {
776     int32_t ret = AuthSessionProcessAuthData(head->seq, data, head->len);
777     if (ret != SOFTBUS_OK) {
778         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR,
779             "perform auth(=%"PRId64") session recv authData fail(=%d)", head->seq, ret);
780         return;
781     }
782 }
783 
HandleDeviceInfoData(uint64_t connId,const AuthConnInfo * connInfo,bool fromServer,const AuthDataHead * head,const uint8_t * data)784 static void HandleDeviceInfoData(uint64_t connId, const AuthConnInfo *connInfo, bool fromServer,
785     const AuthDataHead *head, const uint8_t *data)
786 {
787     int32_t ret;
788     if (head->seq != 0) {
789         ret = AuthSessionProcessDevInfoData(head->seq, data, head->len);
790     } else {
791         /* To be compatible with ohos-3.1 and early. */
792         ret = AuthSessionProcessDevInfoDataByConnId(connId, !fromServer, data, head->len);
793     }
794     if (ret != SOFTBUS_OK) {
795         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR,
796             "perform auth(=%"PRId64") session recv devInfo fail(=%d)", head->seq, ret);
797         return;
798     }
799 }
800 
HandleCloseAckData(uint64_t connId,const AuthConnInfo * connInfo,bool fromServer,const AuthDataHead * head,const uint8_t * data)801 static void HandleCloseAckData(uint64_t connId, const AuthConnInfo *connInfo, bool fromServer,
802     const AuthDataHead *head, const uint8_t *data)
803 {
804     int32_t ret;
805     if (head->seq != 0) {
806         ret = AuthSessionProcessCloseAck(head->seq, data, head->len);
807     } else {
808         /* To be compatible with nearby. */
809         ret = AuthSessionProcessCloseAckByConnId(connId, !fromServer, data, head->len);
810     }
811     if (ret != SOFTBUS_OK) {
812         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR,
813             "perform auth(=%"PRId64") session recv closeAck fail(=%d)", head->seq, ret);
814         return;
815     }
816 }
817 
HandleConnectionData(uint64_t connId,const AuthConnInfo * connInfo,bool fromServer,const AuthDataHead * head,const uint8_t * data)818 static void HandleConnectionData(uint64_t connId, const AuthConnInfo *connInfo, bool fromServer,
819     const AuthDataHead *head, const uint8_t *data)
820 {
821     if (!RequireAuthLock()) {
822         return;
823     }
824     AuthManager *auth = FindAuthManagerByConnInfo(connInfo, !fromServer);
825     if (auth == NULL) {
826         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "AuthManager not found.");
827         ReleaseAuthLock();
828         return;
829     }
830     int64_t authId = auth->authId;
831     uint8_t *decData = NULL;
832     uint32_t decDataLen = 0;
833     if (DecryptInner(&auth->sessionKeyList, data, head->len, &decData, &decDataLen) != SOFTBUS_OK) {
834         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "decrypt trans data fail.");
835         ReleaseAuthLock();
836         return;
837     }
838     auth->lastActiveTime = GetCurrentTimeMs();
839     auth->connId = connId;
840     ReleaseAuthLock();
841     if (g_transCallback.OnDataReceived != NULL) {
842         g_transCallback.OnDataReceived(authId, head, decData, decDataLen);
843     }
844     SoftBusFree(decData);
845 }
846 
OnDataReceived(uint64_t connId,const AuthConnInfo * connInfo,bool fromServer,const AuthDataHead * head,const uint8_t * data)847 static void OnDataReceived(uint64_t connId, const AuthConnInfo *connInfo, bool fromServer,
848     const AuthDataHead *head, const uint8_t *data)
849 {
850     if (connInfo == NULL || head == NULL || data == NULL) {
851         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "invalid param.");
852         return;
853     }
854     SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_INFO,
855         "auth recv data{type=0x%x, module=%d, seq=%"PRId64", flag=%d, len=%u} " CONN_INFO " from[%s]",
856         head->dataType, head->module, head->seq, head->flag, head->len, CONN_DATA(connId), GetAuthSideStr(fromServer));
857     switch (head->dataType) {
858         case DATA_TYPE_DEVICE_ID:
859             HandleDeviceIdData(connId, connInfo, head, data);
860             break;
861         case DATA_TYPE_AUTH:
862             HandleAuthData(connInfo, head, data);
863             break;
864         case DATA_TYPE_DEVICE_INFO:
865             HandleDeviceInfoData(connId, connInfo, fromServer, head, data);
866             break;
867         case DATA_TYPE_CLOSE_ACK:
868             HandleCloseAckData(connId, connInfo, fromServer, head, data);
869             break;
870         case DATA_TYPE_CONNECTION:
871             HandleConnectionData(connId, connInfo, fromServer, head, data);
872             break;
873         default:
874             break;
875     }
876 }
877 
HandleDisconnectedEvent(const void * para)878 static void HandleDisconnectedEvent(const void *para)
879 {
880     CHECK_NULL_PTR_RETURN_VOID(para);
881     uint64_t connId = *((uint64_t *)para);
882     uint32_t num = 0;
883     int64_t authIds[2]; /* 2: client and server may use same connection. */
884     authIds[num++]= GetAuthIdByConnId(connId, false);
885     authIds[num++]= GetAuthIdByConnId(connId, true);
886     for (uint32_t i = 0; i < num; i++) {
887         if (authIds[i] == AUTH_INVALID_ID) {
888             continue;
889         }
890         if (g_transCallback.OnDisconnected != NULL) {
891             g_transCallback.OnDisconnected(authIds[i]);
892         }
893         if (GetConnType(connId) == AUTH_LINK_TYPE_WIFI || GetConnType(connId) == AUTH_LINK_TYPE_P2P) {
894             RemoveAuthManagerByAuthId(authIds[i]);
895             NotifyDeviceDisconnect(authIds[i]);
896         }
897     }
898     /* Try to terminate authing session. */
899     (void)AuthSessionHandleDeviceDisconnected(connId);
900 }
901 
OnDisconnected(uint64_t connId,const AuthConnInfo * connInfo)902 static void OnDisconnected(uint64_t connId, const AuthConnInfo *connInfo)
903 {
904     (void)connInfo;
905     (void)PostAuthEvent(EVENT_AUTH_DISCONNECT, HandleDisconnectedEvent, &connId, sizeof(connId), 0);
906 }
907 
RegAuthVerifyListener(const AuthVerifyListener * listener)908 int32_t RegAuthVerifyListener(const AuthVerifyListener *listener)
909 {
910     if (listener == NULL) {
911         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "invalid listener.");
912         return SOFTBUS_INVALID_PARAM;
913     }
914     g_verifyListener = *listener;
915     return SOFTBUS_OK;
916 }
917 
UnregAuthVerifyListener(void)918 void UnregAuthVerifyListener(void)
919 {
920     (void)memset_s(&g_verifyListener, sizeof(AuthVerifyListener), 0, sizeof(AuthVerifyListener));
921 }
922 
AuthGenRequestId(void)923 uint32_t AuthGenRequestId(void)
924 {
925     return ConnGetNewRequestId(MODULE_DEVICE_AUTH);
926 }
927 
AuthStartVerify(const AuthConnInfo * connInfo,uint32_t requestId,const AuthVerifyCallback * callback)928 int32_t AuthStartVerify(const AuthConnInfo *connInfo, uint32_t requestId, const AuthVerifyCallback *callback)
929 {
930     if (connInfo == NULL || !CheckVerifyCallback(callback)) {
931         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "%s: invalid param.", __func__);
932         return SOFTBUS_INVALID_PARAM;
933     }
934     return StartVerifyDevice(requestId, connInfo, callback, NULL);
935 }
936 
AuthHandleLeaveLNN(int64_t authId)937 void AuthHandleLeaveLNN(int64_t authId)
938 {
939     SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_INFO,
940         "auth handle leave LNN, authId=%" PRId64, authId);
941     if (!RequireAuthLock()) {
942         return;
943     }
944     AuthManager *auth = FindAuthManagerByAuthId(authId);
945     if (auth == NULL) {
946         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_INFO,
947             "auth manager not found, authId=%" PRId64, authId);
948         ReleaseAuthLock();
949         return;
950     }
951     if (auth->connInfo.type == AUTH_LINK_TYPE_WIFI) {
952         DisconnectAuthDevice(auth->connId);
953     }
954     DelAuthManager(auth, true);
955     ReleaseAuthLock();
956 }
957 
AuthFlushDevice(const char * uuid)958 int32_t AuthFlushDevice(const char *uuid)
959 {
960     if (uuid == NULL || uuid[0] == '\0') {
961         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "uuid is empty.");
962         return SOFTBUS_INVALID_PARAM;
963     }
964     if (!RequireAuthLock()) {
965         return SOFTBUS_LOCK_ERR;
966     }
967     uint32_t num = 0;
968     AuthManager *auth[2] = {NULL, NULL}; /* 2: WiFi * (Client + Server) */
969     auth[num++] = FindAuthManagerByUuid(uuid, AUTH_LINK_TYPE_WIFI, false);
970     auth[num++] = FindAuthManagerByUuid(uuid, AUTH_LINK_TYPE_WIFI, true);
971     for (uint32_t i = 0; i < num; i++) {
972         if (auth[i] == NULL) {
973             continue;
974         }
975         (void)PostVerifyDeviceMessage(auth[i]);
976     }
977     ReleaseAuthLock();
978     return SOFTBUS_OK;
979 }
980 
TryGetBrConnInfo(const char * uuid,AuthConnInfo * connInfo)981 static int32_t TryGetBrConnInfo(const char *uuid, AuthConnInfo *connInfo)
982 {
983     char networkId[NETWORK_ID_BUF_LEN] = {0};
984     if (LnnGetNetworkIdByUuid(uuid, networkId, sizeof(networkId)) != SOFTBUS_OK) {
985         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "get networkdId by uuid fail.");
986         return SOFTBUS_ERR;
987     }
988 
989     uint32_t local, remote;
990     if (LnnGetLocalNumInfo(NUM_KEY_NET_CAP, (int32_t *)&local) != SOFTBUS_OK ||
991         LnnGetRemoteNumInfo(networkId, NUM_KEY_NET_CAP, (int32_t *)&remote) != SOFTBUS_OK) {
992         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "get NET_CAP fail.");
993         return SOFTBUS_ERR;
994     }
995     if (((local & (1 << BIT_BR)) == 0) || ((remote & (1 << BIT_BR)) == 0)) {
996         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_INFO, "can't support BR.");
997         return SOFTBUS_ERR;
998     }
999     if (LnnGetRemoteStrInfo(networkId, STRING_KEY_BT_MAC, connInfo->info.brInfo.brMac, BT_MAC_LEN) != SOFTBUS_OK ||
1000         connInfo->info.brInfo.brMac[0] == '\0') {
1001         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "get bt mac fail.");
1002         return SOFTBUS_ERR;
1003     }
1004     connInfo->type = AUTH_LINK_TYPE_BR;
1005     return SOFTBUS_OK;
1006 }
1007 
AuthDeviceGetPreferConnInfo(const char * uuid,AuthConnInfo * connInfo)1008 int32_t AuthDeviceGetPreferConnInfo(const char *uuid, AuthConnInfo *connInfo)
1009 {
1010     if (uuid == NULL || uuid[0] == '\0' || connInfo == NULL) {
1011         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "invalid uuid or connInfo.");
1012         return SOFTBUS_INVALID_PARAM;
1013     }
1014     AuthLinkType linkList[] = { AUTH_LINK_TYPE_WIFI, AUTH_LINK_TYPE_BR }; /* Not support BLE for transport yet */
1015     for (uint32_t i = 0; i < sizeof(linkList) / sizeof(linkList[0]); i++) {
1016         if (GetAuthConnInfoByUuid(uuid, linkList[i], connInfo) != SOFTBUS_OK) {
1017             continue;
1018         }
1019         if (linkList[i] == AUTH_LINK_TYPE_BLE) {
1020             if (!CheckActiveAuthConnection(connInfo)) {
1021                 SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_INFO, "auth ble connection not active.");
1022                 continue;
1023             }
1024         }
1025         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_INFO, "select auth type: %d.", linkList[i]);
1026         return SOFTBUS_OK;
1027     }
1028     SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_INFO, "no active auth, try br connection.");
1029     return TryGetBrConnInfo(uuid, connInfo);
1030 }
1031 
AuthDeviceOpenConn(const AuthConnInfo * info,uint32_t requestId,const AuthConnCallback * callback)1032 int32_t AuthDeviceOpenConn(const AuthConnInfo *info, uint32_t requestId, const AuthConnCallback *callback)
1033 {
1034     if (info == NULL || !CheckAuthConnCallback(callback)) {
1035         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "%s: invalid param.", __func__);
1036         return SOFTBUS_INVALID_PARAM;
1037     }
1038     SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_INFO,
1039         "open auth conn: connType=%d, requestId=%u.", info->type, requestId);
1040     int64_t authId;
1041     switch (info->type) {
1042         case AUTH_LINK_TYPE_WIFI:
1043             authId = GetAuthIdByConnInfo(info, false);
1044             if (authId == AUTH_INVALID_ID) {
1045                 authId = GetAuthIdByConnInfo(info, true);
1046             }
1047             if (authId == AUTH_INVALID_ID) {
1048                 return SOFTBUS_AUTH_NOT_FOUND;
1049             }
1050             callback->onConnOpened(requestId, authId);
1051             break;
1052         case AUTH_LINK_TYPE_BR:
1053         case AUTH_LINK_TYPE_BLE:
1054         case AUTH_LINK_TYPE_P2P:
1055             authId = GetActiveAuthIdByConnInfo(info);
1056             if (authId != AUTH_INVALID_ID) {
1057                 return StartReconnectDevice(authId, info, requestId, callback);
1058             }
1059             return StartVerifyDevice(requestId, info, NULL, callback);
1060         default:
1061             SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "unknown connType: %d", info->type);
1062             return SOFTBUS_ERR;
1063     }
1064     return SOFTBUS_OK;
1065 }
1066 
AuthDeviceCloseConn(int64_t authId)1067 void AuthDeviceCloseConn(int64_t authId)
1068 {
1069     SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_INFO, "close auth conn: authId=%" PRId64, authId);
1070     AuthManager *auth = GetAuthManagerByAuthId(authId);
1071     if (auth == NULL) {
1072         return;
1073     }
1074     switch (auth->connInfo.type) {
1075         case AUTH_LINK_TYPE_WIFI:
1076         case AUTH_LINK_TYPE_P2P:
1077             /* Do nothing. */
1078             break;
1079         case AUTH_LINK_TYPE_BR:
1080         case AUTH_LINK_TYPE_BLE:
1081             DisconnectAuthDevice(auth->connId);
1082             break;
1083         default:
1084             break;
1085     }
1086     DelAuthManager(auth, false);
1087     return;
1088 }
1089 
AuthDevicePostTransData(int64_t authId,const AuthTransData * dataInfo)1090 int32_t AuthDevicePostTransData(int64_t authId, const AuthTransData *dataInfo)
1091 {
1092     if (dataInfo == NULL) {
1093         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "dataInfo is null.");
1094         return SOFTBUS_INVALID_PARAM;
1095     }
1096     AuthManager *auth = GetAuthManagerByAuthId(authId);
1097     if (auth == NULL) {
1098         return SOFTBUS_AUTH_NOT_FOUND;
1099     }
1100     AuthDataHead head;
1101     head.dataType = DATA_TYPE_CONNECTION;
1102     head.module = dataInfo->module;
1103     head.seq = dataInfo->seq;
1104     head.flag = dataInfo->flag;
1105     uint8_t *encData = NULL;
1106     if (EncryptInner(&auth->sessionKeyList, dataInfo->data, dataInfo->len, &encData, &head.len) != SOFTBUS_OK) {
1107         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "encrypt trans data fail.");
1108         DelAuthManager(auth, false);
1109         return SOFTBUS_ENCRYPT_ERR;
1110     }
1111     if (PostAuthData(auth->connId, !auth->isServer, &head, encData) != SOFTBUS_OK) {
1112         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "post trans data fail.");
1113         SoftBusFree(encData);
1114         DelAuthManager(auth, false);
1115         return SOFTBUS_ERR;
1116     }
1117     SoftBusFree(encData);
1118     DelAuthManager(auth, false);
1119     return SOFTBUS_OK;
1120 }
1121 
RegGroupChangeListener(const GroupChangeListener * listener)1122 int32_t RegGroupChangeListener(const GroupChangeListener *listener)
1123 {
1124     if (listener == NULL) {
1125         return SOFTBUS_INVALID_PARAM;
1126     }
1127     g_groupChangeListener.onGroupCreated = listener->onGroupCreated;
1128     g_groupChangeListener.onGroupDeleted = listener->onGroupDeleted;
1129     return SOFTBUS_OK;
1130 }
1131 
UnregGroupChangeListener(void)1132 void UnregGroupChangeListener(void)
1133 {
1134     g_groupChangeListener.onGroupCreated = NULL;
1135     g_groupChangeListener.onGroupDeleted = NULL;
1136 }
1137 
AuthDeviceGetLatestIdByUuid(const char * uuid,bool isIpConnection)1138 int64_t AuthDeviceGetLatestIdByUuid(const char *uuid, bool isIpConnection)
1139 {
1140     if (uuid == NULL || uuid[0] == '\0') {
1141         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "uuid is empty.");
1142         return AUTH_INVALID_ID;
1143     }
1144     if (!RequireAuthLock()) {
1145         return SOFTBUS_LOCK_ERR;
1146     }
1147     uint32_t num = 0;
1148     AuthManager *auth[4] = {NULL, NULL, NULL, NULL}; /* 4: max size for (BR + BLE) * (CLIENT+ SERVER) */
1149     if (isIpConnection) {
1150         auth[num++] = FindAuthManagerByUuid(uuid, AUTH_LINK_TYPE_WIFI, false);
1151         auth[num++] = FindAuthManagerByUuid(uuid, AUTH_LINK_TYPE_WIFI, true);
1152     } else {
1153         auth[num++] = FindAuthManagerByUuid(uuid, AUTH_LINK_TYPE_BR, false);
1154         auth[num++] = FindAuthManagerByUuid(uuid, AUTH_LINK_TYPE_BR, true);
1155         auth[num++] = FindAuthManagerByUuid(uuid, AUTH_LINK_TYPE_BLE, false);
1156         auth[num++] = FindAuthManagerByUuid(uuid, AUTH_LINK_TYPE_BLE, true);
1157     }
1158     int64_t latestAuthId = AUTH_INVALID_ID;
1159     uint64_t latestVerifyTime = 0;
1160     for (uint32_t i = 0; i < num; i++) {
1161         if (auth[i] != NULL && auth[i]->lastVerifyTime > latestVerifyTime) {
1162             latestAuthId = auth[i]->authId;
1163             latestVerifyTime = auth[i]->lastVerifyTime;
1164         }
1165     }
1166     ReleaseAuthLock();
1167     SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_INFO,
1168         "latest auth manager[%"PRId64"] found, lastVerifyTime=%" PRIu64, latestAuthId, latestVerifyTime);
1169     return latestAuthId;
1170 }
1171 
AuthDeviceGetIdByConnInfo(const AuthConnInfo * connInfo,bool isServer)1172 int64_t AuthDeviceGetIdByConnInfo(const AuthConnInfo *connInfo, bool isServer)
1173 {
1174     if (connInfo == NULL) {
1175         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "connInfo is null.");
1176         return AUTH_INVALID_ID;
1177     }
1178     return GetAuthIdByConnInfo(connInfo, isServer);
1179 }
1180 
AuthDeviceGetIdByP2pMac(const char * p2pMac,AuthLinkType type,bool isServer)1181 int64_t AuthDeviceGetIdByP2pMac(const char *p2pMac, AuthLinkType type, bool isServer)
1182 {
1183     if (p2pMac == NULL || p2pMac[0] == '\0') {
1184         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "p2pMac is empty.");
1185         return AUTH_INVALID_ID;
1186     }
1187     if (!RequireAuthLock()) {
1188         return AUTH_INVALID_ID;
1189     }
1190     AuthManager *auth = FindAuthManagerByP2pMac(p2pMac, type, isServer);
1191     if (auth == NULL) {
1192         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR,
1193             "auth manager not found by p2pMac, connType=%d, side=%s", type, GetAuthSideStr(isServer));
1194         ReleaseAuthLock();
1195         return AUTH_INVALID_ID;
1196     }
1197     int64_t authId = auth->authId;
1198     ReleaseAuthLock();
1199     return authId;
1200 }
1201 
AuthGetEncryptSize(uint32_t inLen)1202 uint32_t AuthGetEncryptSize(uint32_t inLen)
1203 {
1204     return inLen + ENCRYPT_OVER_HEAD_LEN;
1205 }
1206 
AuthGetDecryptSize(uint32_t inLen)1207 uint32_t AuthGetDecryptSize(uint32_t inLen)
1208 {
1209     if (inLen <= OVERHEAD_LEN) {
1210         return inLen;
1211     }
1212     return inLen - OVERHEAD_LEN;
1213 }
1214 
AuthDeviceEncrypt(int64_t authId,const uint8_t * inData,uint32_t inLen,uint8_t * outData,uint32_t * outLen)1215 int32_t AuthDeviceEncrypt(int64_t authId, const uint8_t *inData, uint32_t inLen, uint8_t *outData, uint32_t *outLen)
1216 {
1217     if (inData == NULL || inLen == 0 || outData == NULL || outLen == NULL || *outLen < AuthGetEncryptSize(inLen)) {
1218         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "%s: invalid param.", __func__);
1219         return SOFTBUS_INVALID_PARAM;
1220     }
1221     AuthManager *auth = GetAuthManagerByAuthId(authId);
1222     if (auth == NULL) {
1223         return SOFTBUS_AUTH_NOT_FOUND;
1224     }
1225     if (EncryptData(&auth->sessionKeyList, inData, inLen, outData, outLen) != SOFTBUS_OK) {
1226         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "auth encrypt fail.");
1227         DelAuthManager(auth, false);
1228         return SOFTBUS_ENCRYPT_ERR;
1229     }
1230     DelAuthManager(auth, false);
1231     return SOFTBUS_OK;
1232 }
1233 
AuthDeviceDecrypt(int64_t authId,const uint8_t * inData,uint32_t inLen,uint8_t * outData,uint32_t * outLen)1234 int32_t AuthDeviceDecrypt(int64_t authId, const uint8_t *inData, uint32_t inLen, uint8_t *outData, uint32_t *outLen)
1235 {
1236     if (inData == NULL || inLen == 0 || outData == NULL || outLen == NULL || *outLen < AuthGetDecryptSize(inLen)) {
1237         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "%s: invalid param.", __func__);
1238         return SOFTBUS_INVALID_PARAM;
1239     }
1240     AuthManager *auth = GetAuthManagerByAuthId(authId);
1241     if (auth == NULL) {
1242         return SOFTBUS_AUTH_NOT_FOUND;
1243     }
1244     if (DecryptData(&auth->sessionKeyList, inData, inLen, outData, outLen) != SOFTBUS_OK) {
1245         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "auth decrypt fail.");
1246         DelAuthManager(auth, false);
1247         return SOFTBUS_ENCRYPT_ERR;
1248     }
1249     DelAuthManager(auth, false);
1250     return SOFTBUS_OK;
1251 }
1252 
AuthDeviceSetP2pMac(int64_t authId,const char * p2pMac)1253 int32_t AuthDeviceSetP2pMac(int64_t authId, const char *p2pMac)
1254 {
1255     if (p2pMac == NULL || p2pMac[0] == '\0') {
1256         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "p2pMac is empty.");
1257         return SOFTBUS_INVALID_PARAM;
1258     }
1259     AuthManager inAuth = {0};
1260     if (strcpy_s(inAuth.p2pMac, sizeof(inAuth.p2pMac), p2pMac) != EOK) {
1261         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR,
1262             "copy p2pMac fail, authId=%" PRId64, authId);
1263         return SOFTBUS_MEM_ERR;
1264     }
1265     return UpdateAuthManagerByAuthId(authId, SetAuthP2pMac, &inAuth);
1266 }
1267 
AuthDeviceGetConnInfo(int64_t authId,AuthConnInfo * connInfo)1268 int32_t AuthDeviceGetConnInfo(int64_t authId, AuthConnInfo *connInfo)
1269 {
1270     if (connInfo == NULL) {
1271         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "connInfo is null.");
1272         return SOFTBUS_INVALID_PARAM;
1273     }
1274     AuthManager *auth = GetAuthManagerByAuthId(authId);
1275     if (auth == NULL) {
1276         return SOFTBUS_AUTH_NOT_FOUND;
1277     }
1278     *connInfo = auth->connInfo;
1279     DelAuthManager(auth, false);
1280     return SOFTBUS_OK;
1281 }
1282 
AuthDeviceGetServerSide(int64_t authId,bool * isServer)1283 int32_t AuthDeviceGetServerSide(int64_t authId, bool *isServer)
1284 {
1285     if (isServer == NULL) {
1286         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "isServer is null.");
1287         return SOFTBUS_INVALID_PARAM;
1288     }
1289     AuthManager *auth = GetAuthManagerByAuthId(authId);
1290     if (auth == NULL) {
1291         return SOFTBUS_AUTH_NOT_FOUND;
1292     }
1293     *isServer = auth->isServer;
1294     DelAuthManager(auth, false);
1295     return SOFTBUS_OK;
1296 }
1297 
AuthDeviceGetDeviceUuid(int64_t authId,char * uuid,uint16_t size)1298 int32_t AuthDeviceGetDeviceUuid(int64_t authId, char *uuid, uint16_t size)
1299 {
1300     if (uuid == NULL) {
1301         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "uuid is empty.");
1302         return SOFTBUS_INVALID_PARAM;
1303     }
1304     AuthManager *auth = GetAuthManagerByAuthId(authId);
1305     if (auth == NULL) {
1306         return SOFTBUS_AUTH_NOT_FOUND;
1307     }
1308     if (strcpy_s(uuid, size, auth->uuid) != EOK) {
1309         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_INFO, "copy uuid fail, size=%u.", size);
1310         DelAuthManager(auth, false);
1311         return SOFTBUS_ERR;
1312     }
1313     DelAuthManager(auth, false);
1314     return SOFTBUS_OK;
1315 }
1316 
AuthDeviceGetVersion(int64_t authId,SoftBusVersion * version)1317 int32_t AuthDeviceGetVersion(int64_t authId, SoftBusVersion *version)
1318 {
1319     if (version == NULL) {
1320         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "version is null.");
1321         return SOFTBUS_INVALID_PARAM;
1322     }
1323     AuthManager *auth = GetAuthManagerByAuthId(authId);
1324     if (auth == NULL) {
1325         return SOFTBUS_AUTH_NOT_FOUND;
1326     }
1327     *version = auth->version;
1328     DelAuthManager(auth, false);
1329     return SOFTBUS_OK;
1330 }
1331 
AuthDeviceInit(const AuthTransCallback * callback)1332 int32_t AuthDeviceInit(const AuthTransCallback *callback)
1333 {
1334     SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_INFO, "auth init enter.");
1335     if (callback == NULL) {
1336         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "Auth notify trans callback is null.");
1337         return SOFTBUS_INVALID_PARAM;
1338     }
1339     g_transCallback = *callback;
1340     ListInit(&g_authClientList);
1341     ListInit(&g_authServerList);
1342     if (AuthCommonInit() != SOFTBUS_OK) {
1343         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "AuthCommonInit fail.");
1344         return SOFTBUS_AUTH_INIT_FAIL;
1345     }
1346 
1347     AuthConnListener connListener = {
1348         .onConnectResult = OnConnectResult,
1349         .onDataReceived = OnDataReceived,
1350         .onDisconnected = OnDisconnected,
1351     };
1352     if (AuthConnInit(&connListener) != SOFTBUS_OK) {
1353         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "AuthConnInit fail.");
1354         AuthCommonDeinit();
1355         return SOFTBUS_AUTH_INIT_FAIL;
1356     }
1357 
1358     TrustDataChangeListener trustListener = {
1359         .onGroupCreated = OnGroupCreated,
1360         .onGroupDeleted = OnGroupDeleted,
1361         .onDeviceNotTrusted = OnDeviceNotTrusted,
1362     };
1363     if (RegTrustDataChangeListener(&trustListener) != SOFTBUS_OK) {
1364         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "RegTrustDataChangeListener fail.");
1365         AuthConnDeinit();
1366         AuthCommonDeinit();
1367         return SOFTBUS_AUTH_INIT_FAIL;
1368     }
1369     SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_INFO, "auth init succ.");
1370     return SOFTBUS_OK;
1371 }
1372 
AuthDeviceDeinit(void)1373 void AuthDeviceDeinit(void)
1374 {
1375     SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_INFO, "auth deinit enter.");
1376     UnregTrustDataChangeListener();
1377     DestroyAuthManagerList();
1378     ClearAuthRequest();
1379     AuthConnDeinit();
1380     AuthSessionFsmExit();
1381     AuthCommonDeinit();
1382     SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_INFO, "auth deinit succ.");
1383 }
1384