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